Unity | 扇形检测

目录

前言

一、扇形检测简介

二、效果展示

三、实现步骤

1、新建脚本FanDetection.cs

2、添加检测方法 

 3、调用方法 

4、完整代码 

四、使用方法

最后


前言

        仅个人学习的记录,旨在分享我的学习笔记和个人见解。


一、扇形检测简介

        扇形检测在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知识。若文章内容错误,麻烦指点。

  • 9
    点赞
  • 15
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
Unity中可以使用Physics2D.OverlapCircleAll方法来检测一个圆形范围内的所有碰撞体,然后再筛选出扇形范围内的碰撞体。 具体步骤如下: 1. 使用Physics2D.OverlapCircleAll方法检测圆形范围内的所有碰撞体。 2. 遍历所有的碰撞体,计算它们与检测点的夹角,判断是否在扇形范围内。 3. 如果在扇形范围内,就将该碰撞体加入到扇形范围内的碰撞体列表中。 以下是一个示例代码: ```csharp using System.Collections.Generic; using UnityEngine; public class SectorCheck : MonoBehaviour { public float radius = 1f; public float angle = 45f; public LayerMask layerMask; private List<Collider2D> colliders = new List<Collider2D>(); private void Update() { colliders.Clear(); Collider2D[] allColliders = Physics2D.OverlapCircleAll(transform.position, radius, layerMask); foreach (Collider2D collider in allColliders) { Vector2 direction = collider.transform.position - transform.position; float angleToTarget = Vector2.Angle(transform.right, direction); if (angleToTarget <= angle / 2f) { colliders.Add(collider); } } // Do something with colliders. } private void OnDrawGizmosSelected() { Gizmos.color = Color.yellow; Gizmos.DrawWireSphere(transform.position, radius); Gizmos.color = new Color(1f, 1f, 0f, 0.3f); Gizmos.DrawSphere(transform.position, radius); Vector3 right = transform.right * radius; Vector3 up = Quaternion.AngleAxis(angle / 2f, Vector3.forward) * right; Vector3 down = Quaternion.AngleAxis(-angle / 2f, Vector3.forward) * right; Gizmos.color = Color.yellow; Gizmos.DrawLine(transform.position, transform.position + right); Gizmos.DrawLine(transform.position, transform.position + up); Gizmos.DrawLine(transform.position, transform.position + down); Gizmos.color = new Color(1f, 1f, 0f, 0.3f); Gizmos.DrawLine(transform.position, transform.position + up.normalized * radius); Gizmos.DrawLine(transform.position, transform.position + down.normalized * radius); } } ``` 在该代码中,radius和angle分别表示圆形范围的半径和扇形范围的角度。 使用OnDrawGizmosSelected方法可以在场景中绘制出检测范围的形状,方便调试。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值