目录
前言
仅个人学习的记录,旨在分享我的学习笔记和个人见解。
一、扇形检测简介
扇形检测在Unity中主要用于游戏开发中,例如用于检测敌人的视野范围、玩家的攻击范围、触发特定事件等场景。这种检测可以帮助游戏开发者实现更加智能和交互性的游戏玩法。
二、效果展示
三、实现步骤
1、新建脚本FanDetection.cs
定义几个变量:视野距离、射线密度、视野角度
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
public class FanDetection : MonoBehaviour
{
public float viewRadius = 5f;//视野距离
public int viewAngleStep = 20;//射线密度
[Range(0, 360)]
public float viewAngle = 270f;//视野角度
void Start()
{
}
void Update()
{
}
}
2、添加检测方法
在下方代码中已添加详细注释。
void DrawFieldOfView()
{
// 计算最左侧方向的向量
Vector3 forward_left = Quaternion.Euler(0, -(viewAngle / 2f), 0) * transform.forward * viewRadius;
for (int i = 0; i <= viewAngleStep; i++)
{
Vector3 v = Quaternion.Euler(0, (viewAngle / viewAngleStep) * i, 0) * forward_left;// 根据当前角度计算方向向量
Vector3 pos = transform.position + v;// 计算射线终点
// 在Scene中绘制线条(仅方便观察,Game视图中不可见)
Debug.DrawLine(transform.position, pos, Color.red);
// 射线检测
Ray ray = new Ray(transform.position, v);
RaycastHit hitInfo;
if (Physics.Raycast(ray, out hitInfo, viewRadius))
{
// 如果射线击中碰撞体且物体标签为"Enemy"
if (hitInfo.collider.tag == "Enemy")
{
// 输出提示信息
Debug.Log("视野内有敌人");
// 添加自己想要的逻辑
}
}
}
}
3、调用方法
只需在Update()中调用我们新添加的方法即可。
void Update()
{
DrawFieldOfView();
}
4、完整代码
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
public class FanDetection : MonoBehaviour
{
public float viewRadius = 5f;//视野距离
public int viewAngleStep = 20;//射线密度
[Range(0, 360)]
public float viewAngle = 270f;//视野角度
void Start()
{
}
void Update()
{
DrawFieldOfView();
}
void DrawFieldOfView()
{
// 计算最左侧方向的向量
Vector3 forward_left = Quaternion.Euler(0, -(viewAngle / 2f), 0) * transform.forward * viewRadius;
for (int i = 0; i <= viewAngleStep; i++)
{
Vector3 v = Quaternion.Euler(0, (viewAngle / viewAngleStep) * i, 0) * forward_left;// 根据当前角度计算方向向量
Vector3 pos = transform.position + v;// 计算射线终点
// 在Scene中绘制线条(仅方便观察,Game视图中不可见)
Debug.DrawLine(transform.position, pos, Color.red);
// 射线检测
Ray ray = new Ray(transform.position, v);
RaycastHit hitInfo;
if (Physics.Raycast(ray, out hitInfo, viewRadius))
{
// 如果射线击中碰撞体且物体标签为"Enemy"
if (hitInfo.collider.tag == "Enemy")
{
// 输出提示信息
Debug.Log("视野内有敌人");
// 添加自己想要的逻辑
}
}
}
}
}
四、使用方法
1、将FanDetection脚本挂载到需要添加扇形检测功能的对象上
2、新建一个Tag并命名为Enemy
3、设置需要被检测到的对象的Tag为Enemy
4、运行! 当Enemy标签物体进入射线范围内,就会打印“视野内有敌人”。
最后
文章内容仅为个人学习记录。好记性不如烂笔头,为了能更好的回顾和总结,开始记录与分享自己学到的Unity知识。若文章内容错误,麻烦指点。