首页 > 其他分享 >【Unity】检测目标是否在视线范围内(附视线范围扇形画法)

【Unity】检测目标是否在视线范围内(附视线范围扇形画法)

时间:2022-10-28 20:23:34浏览次数:56  
标签:float Vector3 vertices transform Unity forward position 视线 范围

  • 检测目标是否在视线范围内(附视线范围扇形画法)
using UnityEngine;

public class Test_CanSeeTarget : MonoBehaviour
{
    public GameObject target;

    /// <summary>
    /// 视线范围-半径
    /// </summary>
    public float sightViewRadius = 5;

    /// <summary>
    /// 视线范围-欧拉角
    /// </summary>
    public float sightViewEuler = 120;



    /// <summary>
    /// 画扇形
    /// </summary>
    /// <param name="radius"></param>
    /// <param name="euler"></param>
    /// <param name="color"></param>
    private void DrawSemicircle(float radius, float euler, Color color)
    {
        int segments = 10;
        float deltaAngle = euler / segments;
        Vector3 forward = transform.forward;

        Vector3[] vertices = new Vector3[segments + 2];
        vertices[0] = transform.position;
        for (int i = 1; i < vertices.Length; i++)
        {
            Vector3 pos = Quaternion.Euler(0f, -euler / 2 + deltaAngle * (i - 1), 0f) * forward * radius + transform.position;
            vertices[i] = pos;
        }

        // 画圆弧
        for (int i = 1; i < vertices.Length - 1; i++)
        {
            UnityEngine.Debug.DrawLine(vertices[i], vertices[i + 1], color);
        }

        // 画两条边
        UnityEngine.Debug.DrawLine(vertices[0], vertices[vertices.Length - 1], color);
        UnityEngine.Debug.DrawLine(vertices[0], vertices[1], color);

    }

    private bool CanSeeTarget()
    {
        float distance = Vector3.Distance(transform.position, target.transform.position);

        Vector3 forward = transform.rotation * Vector3.forward;
        Vector3 dir = target.transform.position - transform.position;

        // 计算两个向量间的夹角,必须归一化normalized
        float angle = Mathf.Acos(Vector3.Dot(forward.normalized, dir.normalized)) * Mathf.Rad2Deg;

        if (distance < sightViewRadius)
        {
            if (angle <= sightViewEuler / 2)
            {
                UnityEngine.Debug.Log("CanSeeTarget: {true}");
                return true;
            }
        }

        UnityEngine.Debug.Log("CanSeeTarget: {false}");

        return false;

    }

    void Update()
    {
        DrawSemicircle(sightViewRadius, sightViewEuler, Color.yellow);
        CanSeeTarget();

    }

}

 

标签:float,Vector3,vertices,transform,Unity,forward,position,视线,范围
From: https://www.cnblogs.com/caiger-blog/p/16837351.html

相关文章

  • mysql 生成指定范围的数值 保留两位(可以是整数,可以是小数)
    大家都知道mysqlrand用起来在某些场景下不是很好用,今天咱们就来实现一个函数。来提升他的功能1.随机生成0.0.1~0.05之间的数据DROPFUNCTIONIFEXISTSrand_num;C......
  • Android内嵌Unity开发简单的3D动态模型
    Unity端就不仔细说了,下面主要讲Unity打包出来在Androidstudio后的操作.DEMO地址:Stringf/UnityAndroid3DModel(github.com)Unity打包Android项目:unityLibrary包bu......
  • 完全背包问题 —— 贪心优化 DP 范围
    题意:现在有\(2n+1\)个物品(\(n\le300\)),体积分别为\(-n,-n+1,\dots,-1,0,1,\dots,n\),第\(i\)个物品有\(a_i\)个,求选出恰好\(S\)的总体积最多能选几个物品。第一......
  • Unity UGUI
    一个UI控件是由多个组件组成的,每一个组件都是一个类TEXT(文本控件)Font:字体可以更改显示的字体样式也可以导入外部字体样式FontStyle:字体风格Normal正常默认风格......
  • 【js】元素是否在可视区范围内
    公式:元素到顶部距离(最近的具有定位父级元素)- 滚动条高度 <=可视区的高度  offsetTop、scrollTop  <!DOCTYPEhtml><htmllang="en"><head><me......
  • unity 给动画帧添加触发事件并调用函数
    动画事件的作用:假设你要在动画的某一帧执行某个函数方法做一些判断,比如当人物攻击动画武器挥砍出去的一帧执行攻击函数 添加动画帧事件方法①点击需要店家动画事件的......
  • unity 解决skybox一片漆黑的问题
    确保你的天空盒效果中勾选了skybox 点击以下图标即可切换天空盒渲染效果切换的效果  ......
  • unityC++
    2022/10/26:拖动球时,按住shift可以在面对场景的平面内拖动。  网格控制 (点了之后会吸附网格,看起来像一帧一帧移动) 旋转快捷键W。蓝色垂直z轴,绿色垂直Y轴(内层)(外......
  • Unity 脚本手册查询
    现实中某个词语不会的时候,一般别人的建议是查下字典,Unity中的API同样是这个道理。Unity中的API千千万,但一个人的记忆力是有限的,这个时候学会查询UnityAPI比死记硬背API要好......
  • POJ 3278(BFS-搜索范围)
    这题是BFS水的主要是范围0<=n,k<=100000 但是有可能搜到200000……半天功夫才A.programP3278;constmaxn=200000;varn,k,i,j:longint;q,deep:array[1..maxn]of......