Unity的Mesh 应用---视野可视化Field of view

该博客介绍了如何在Unity中使用Mesh进行视野可视化(Field of View)的实现,通过提供的GitHub资源和YouTube视频教程,详细展示了创建测试场景,将橙色Cube设置为障碍物,并进行视野效果展示的过程。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

csdn 这垃圾工具, 一保存就丢内容!!!


https://github.com/SunGuangdong/Field-of-View   

https://www.youtube.com/watch?v=rQG9aUWarwE    (共3个)


测试场景这样的 , 橙色Cube 几个, 设置他们的 Layer 为 Obstacles

蓝色 Capsule 几个, 设置他们的 Layer 为 Targets

白色 Obstacles 作为角色。
先弄第一个脚本 挂在 Character 上: 控制方向和旋转!!!
using  UnityEngine;

///   <summary>
///  控制角色移动
///   </summary>
public   class   Controller  :  MonoBehaviour
{
     ///   <summary>
     ///  移动速度
     ///   </summary>
     public   float  moveSpeed = 6;
     Rigidbody  rb;
     Camera  viewCamera;
     Vector3  velocity;
     void   Start ()
    {
        rb = GetComponent< Rigidbody >();
        viewCamera =  Camera .main;
    }
     void   Update ()
    {
         // 鼠标位置控制 角色朝向
         Vector3  mousePos = viewCamera.ScreenToWorldPoint( new   Vector3 ( Input .mousePosition.x,  Input .mousePosition.y, viewCamera.transform.position.y));
        transform.LookAt(mousePos +  Vector3 .up * transform.position.y);
         // 方向键控制移动
        velocity =  new   Vector3 ( Input .GetAxisRaw( "Horizontal" ), 0,  Input .GetAxisRaw( "Vertical" )).normalized * moveSpeed;
    }
     void   FixedUpdate ()
    {
        rb.MovePosition(rb.position + velocity *  Time .fixedDeltaTime);
    }
}
然后 开始另外一个脚本组件, 先画一个圆

using  System.Collections;
using  System.Collections.Generic;
using  UnityEngine;

public   class   FieldOfView  :  MonoBehaviour
{
     ///   <summary>
     ///  圆半径
     ///   </summary>
     public   float  viewRadius;
     ///   <summary>
     ///  视野 角度
     ///   </summary>
    [ Range (0, 360)]
     public   float  viewAngle; ///   <summary>

///  根据角度得到 方向单位向量(极坐标 x=sin(a), z=cos(a))
///   </summary>
///   <param name=" angleInDegrees "></param>
///   <param name=" angleIsGlobal "></param>
///   <returns></returns>
public   Vector3  DirFromAngle( float  angleInDegrees,  bool  angleIsGlobal)
{
     // 相对自身的?
     if  (!angleIsGlobal)
    {
        angleInDegrees += transform.eulerAngles.y;
    }
     return   new   Vector3 ( Mathf .Sin(angleInDegrees *  Mathf .Deg2Rad), 0,  Mathf .Cos(angleInDegrees *  Mathf .Deg2Rad));
}

}


using  UnityEditor;
using  UnityEngine;

[ CustomEditor ( typeof ( FieldOfView ))]
public   class   FieldOfViewEditor  :  Editor
{
     void   OnSceneGUI ()
    {
         FieldOfView  fow = ( FieldOfView )target;
         Handles .color =  Color .white;
         // 画一个圆
         Handles .DrawWireArc(fow.transform.position,  Vector3 .up,  Vector3 .forward, 360, fow.viewRadius);
         // 视野的两条线
         Vector3  viewAngleA = fow.DirFromAngle(-fow.viewAngle / 2,  false );
         Vector3  viewAngleB = fow.DirFromAngle(fow.viewAngle / 2,  false );
         Handles .DrawLine(fow.transform.position, fow.transform.position + viewAngleA * fow.viewRadius);
         Handles .DrawLine(fow.transform.position, fow.transform.position + viewAngleB * fow.viewRadius);

    }

}
回到场景中, 不要Play,就在编辑器 状态下, 选中 Character 角色。 圆 和直线

然后添加碰撞检测相关的代码(障碍 和 目标):
using  System.Collections;
using  System.Collections.Generic;
using  UnityEngine;

public   class   FieldOfView  :  MonoBehaviour
{
     ///   <summary>
     ///  圆半径
     ///   </summary>
     public   float  viewRadius;
     ///   <summary>
     ///  视野 角度
     ///   </summary>
    [ Range (0, 360)]
     public   float  viewAngle;
     ///   <summary>
     ///  目标层
     ///   </summary>
     public   LayerMask  targetMask;
     ///   <summary>
     ///  障碍层
     ///   </summary>
     public   LayerMask  obstacleMask;
     ///   <summary>
     ///  在视野内能看到的目标
     ///   </summary>
    [ HideInInspector ]
     public   List < Transform > visibleTargets =  new   List < Transform >();
 
     void   Start ()
    {

        StartCoroutine(FindTargetsWithDelay(.2f));
    }
     IEnumerator  FindTargetsWithDelay( float  delay)
    {
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值