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

本文涉及的产品
交互式建模 PAI-DSW,5000CU*H 3个月
简介: 扇形范围检测目标

前言:每日记录自己学习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;

       }

   }

}


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


相关文章
|
6月前
|
图形学
Unity射线检测的避坑指南
Unity射线检测的避坑指南
|
7月前
|
图形学
|
数据可视化 vr&ar C#
Unity学习3,如何显示与隐藏平面检测
首先搭建好基本环境,在AR Session Origin下添加一个AR Plane Manager对象,并添加一个预制体AR Default Plane到AR Plane Manager对象的Plane Prefab属性下(这一部分在Unity配置Android开发环境下有介绍不再记录)Unity配置Android开发环境与第一个Demo
221 0
Unity学习3,如何显示与隐藏平面检测
|
图形学
Unity射线检测3d,2D,正交透视。
使用射线功能制作点击物体获取物体名字。可以做简单点击相应。 3D射线检测,Camera 在正交模式与透视模式皆可使用 void Update() { Ray ray = Camera.main.ScreenPointToRay(Input.
1878 0
|
图形学 Go
Unity 之 plane.Raycast 射线检测
原来一直用Physics.Raycast或者对应的2D射线检测,今天无意中发一个有趣射线检测,话不多说直接上示例 void Update() LateUpdate() 示例代码 using UnityEngine; publ...
1984 0
|
图形学
Unity射线检测的用法总结
RayCast 射线检测 本文提供全流程,中文翻译。 Chinar 坚持将简单的生活方式,带给世人!(拥有更好的阅读体验 —— 高分辨率用户请根据需求调整网页缩放比例) Chinar —— 心分...
2723 0
|
4月前
|
C# 图形学
【Unity 3D】元宇宙案例之虚拟地球信息射线实战(附源码、演示视频和步骤 超详细)
【Unity 3D】元宇宙案例之虚拟地球信息射线实战(附源码、演示视频和步骤 超详细)
50 0
|
4月前
|
人工智能 自然语言处理 区块链
【Unity 3D】元宇宙概念、应用前景、价值链等概述
【Unity 3D】元宇宙概念、应用前景、价值链等概述
52 0
|
4月前
|
vr&ar C# 图形学
【Unity 3D】VR飞机拆装后零件说明功能案例实战(附源码和演示视频 超详细)
【Unity 3D】VR飞机拆装后零件说明功能案例实战(附源码和演示视频 超详细)
38 0
|
4月前
|
vr&ar C# 图形学
【Unity 3D】VR飞机动态拆装及引擎开关控制案例(附源码和演示视频 超详细)
【Unity 3D】VR飞机动态拆装及引擎开关控制案例(附源码和演示视频 超详细)
40 0