浅谈Unity之扇形范围检测目标-02

本文涉及的产品
模型训练 PAI-DLC,5000CU*H 3个月
交互式建模 PAI-DSW,5000CU*H 3个月
模型在线服务 PAI-EAS,A10/V100等 500元 1个月
简介: 扇形范围检测目标

前言:每日记录自己学习unity的心得和体会,小弟才疏学浅,如有错误的地方,欢迎大佬们指正,感谢~


第二种

在摄像机上添加脚本

using System.Collections;

using System.Collections.Generic;

using UnityEngine;

public class CameraRay : MonoBehaviour

{

   private float viewRadius = 8.0f;      // 代表视野最远的距离

   private float viewAngleStep = 30;     // 射线数量,越大就越密集,效果更好但硬件耗费越大。

   void DrawFieldOfView()

   {

       // 获得最左边那条射线的向量,相对正前方,角度是-45

       Vector3 forward_left = Quaternion.Euler(0, -45, 0) * transform.forward * viewRadius;

       // 依次处理每一条射线

       for (int i = 0; i <= viewAngleStep; i++)

       {

           // 每条射线都在forward_left的基础上偏转一点,最后一个正好偏转90度到视线最右侧

           Vector3 v = Quaternion.Euler(0, (90.0f / viewAngleStep) * i, 0) * forward_left; ;

           // 创建射线

           Ray ray = new Ray(transform.position, v);

           RaycastHit hitt = new RaycastHit();

           // 射线只与两种层碰撞,注意名字和你添加的layer一致,其他层忽略

           int mask = LayerMask.GetMask("Obstacle", "Enemy");

           Physics.Raycast(ray, out hitt, viewRadius, mask);

           // Player位置加v,就是射线终点pos

           Vector3 pos = transform.position + v;

           if (hitt.transform != null)

           {

               // 如果碰撞到什么东西,射线终点就变为碰撞的点了

               pos = hitt.point;

           }

           // 从玩家位置到pos画线段,只会在编辑器里看到

           Debug.DrawLine(transform.position, pos, Color.red); ;

           // 如果真的碰撞到敌人,进一步处理

           if (hitt.transform != null && hitt.transform.gameObject.layer == LayerMask.NameToLayer("Enemy"))

           {

               OnEnemySpotted(hitt.transform.gameObject);

           }

       }

   }

   void OnEnemySpotted(GameObject enemy)

   {

       enemy.GetComponent<Enemy>().spottedFrame = Time.frameCount;

   }

   public Vector3 ColliderV3;

   // Update is called once per frame

   void Update()

   {

       DrawFieldOfView();

   }

}


物体脚本

using System.Collections;

using System.Collections.Generic;

using UnityEngine;

public class Enemy : MonoBehaviour

{

   MeshRenderer meshRenderer;

   // 代表被发现时的帧数(这里用帧数代表时间)

   public int spottedFrame = -100;

   void Start()

   {

       meshRenderer = GetComponent<MeshRenderer>();

   }

   void Update()

   {

       // 通过设置 spottedFrame,就可以实现隐藏或显现

       if (spottedFrame >= Time.frameCount - 10)

       {

           meshRenderer.enabled = true;

       }

       else

       {

           meshRenderer.enabled = false;

       }

   }

}


最后别忘了加上层级,运行测试就可以了


相关文章
|
图形学
Unity射线检测的避坑指南
Unity射线检测的避坑指南
|
3月前
|
图形学 C#
超实用!深度解析Unity引擎,手把手教你从零开始构建精美的2D平面冒险游戏,涵盖资源导入、角色控制与动画、碰撞检测等核心技巧,打造沉浸式游戏体验完全指南
【8月更文挑战第31天】本文是 Unity 2D 游戏开发的全面指南,手把手教你从零开始构建精美的平面冒险游戏。首先,通过 Unity Hub 创建 2D 项目并导入游戏资源。接着,编写 `PlayerController` 脚本来实现角色移动,并添加动画以增强视觉效果。最后,通过 Collider 2D 组件实现碰撞检测等游戏机制。每一步均展示 Unity 在 2D 游戏开发中的强大功能。
159 6
|
3月前
|
图形学
小功能⭐️Unity解决物体移动速度过快不能检测到碰撞
小功能⭐️Unity解决物体移动速度过快不能检测到碰撞
|
11月前
|
图形学
Unity小游戏——武士和怪物的碰撞检测
Unity小游戏——武士和怪物的碰撞检测
|
图形学
Unity射线检测3d,2D,正交透视。
使用射线功能制作点击物体获取物体名字。可以做简单点击相应。 3D射线检测,Camera 在正交模式与透视模式皆可使用 void Update() { Ray ray = Camera.main.ScreenPointToRay(Input.
1930 0
|
数据可视化 vr&ar C#
Unity学习3,如何显示与隐藏平面检测
首先搭建好基本环境,在AR Session Origin下添加一个AR Plane Manager对象,并添加一个预制体AR Default Plane到AR Plane Manager对象的Plane Prefab属性下(这一部分在Unity配置Android开发环境下有介绍不再记录)Unity配置Android开发环境与第一个Demo
293 0
Unity学习3,如何显示与隐藏平面检测
|
图形学
Unity 3D中的射线与碰撞检测
创建一条射线Ray需要指明射线的起点(origin)和射线的方向(direction)。这两个参数也是Ray的成员变量。注意,射线的方向在设置时如果未单位化,Unity 3D会自动进行单位归一化处理。
4434 0
|
图形学 Go
Unity 之 plane.Raycast 射线检测
原来一直用Physics.Raycast或者对应的2D射线检测,今天无意中发一个有趣射线检测,话不多说直接上示例 void Update() LateUpdate() 示例代码 using UnityEngine; publ...
2075 0
unity3dUGUI空对象实现射线检测
using UnityEngine; using System.Collections; namespace UnityEngine.UI { public class Empty4Raycast : MaskableGraphic ...
2448 0