Unity圆形区域检测

一:实现思路

需要判断一点:
——发起圆形检测的物体与敌人的距离是否小于圆形半径


二:代码实现

using UnityEngine;

public class AreaDetection : MonoBehaviour
{
    public Transform targetTrans;//目标位置

    public float attackDis;//攻击的距离

    void Update()
    {
        float dis = Vector3.Distance(transform.position, targetTrans.position);
        if (dis <= attackDis )
        {
            Debug.Log("进入攻击区域");
        }
        else
        {
            Debug.Log("离开攻击区域");
        }
    }
}

三:绘制圆形可视区域

将脚本挂载到发起检测的物体(与AreaDetection脚本挂载到同一物体身上)

using System.Collections.Generic;
using UnityEngine;

public class DrawShape : MonoBehaviour
{
    private AreaDetection _area;//扇形检测的脚本

    public static GameObject go;
    public static MeshFilter mf;
    public static MeshRenderer mr;
    public static Shader shader;

    private void Awake()
    {
        _area = GetComponent<AreaDetection>();
    }

    void Update()
    {
        DrawCircleArea(transform, transform.localPosition, _area.attackDis);
    }

    /// <summary>
    /// 绘制圆形区域
    /// </summary>
    /// <param name="t">圆形参考物</param>
    /// <param name="center">圆心</param>
    /// <param name="radius">半径</param>
    public void DrawCircleArea(Transform t, Vector3 center, float radius)
    {
        int pointAmount = 100;
        float eachAngle = 360f / pointAmount;
        Vector3 forward = t.forward;

        List<Vector3> vertices = new List<Vector3>();
        for (int i = 0; i < pointAmount; i++)
        {
            Vector3 pos = Quaternion.Euler(0f, eachAngle * i, 0f) * forward * radius + center;
            vertices.Add(pos);
        }
        CreateMesh(vertices);
    }

    /// <summary>
    /// 创建Mesh
    /// </summary>
    /// <param name="vertices">存储顶点的列表</param>
    /// <returns></returns>
    private static GameObject CreateMesh(List<Vector3> vertices)
    {
        int[] triangles;
        Mesh mesh = new Mesh();
        int triangleAmount = vertices.Count - 2;
        triangles = new int[3 * triangleAmount];

        //根据三角形的个数,来计算绘制三角形的顶点顺序(索引)   
        //顺序必须为顺时针或者逆时针      
        for (int i = 0; i < triangleAmount; i++)
        {
            triangles[3 * i] = 0;//固定第一个点      
            triangles[3 * i + 1] = i + 1;
            triangles[3 * i + 2] = i + 2;
        }

        if (go == null)
        {
            go = new GameObject("SectorArea");
            go.transform.position = new Vector3(0, 0.1f, 0);//让绘制的图形上升一点,防止被地面遮挡  
            mf = go.AddComponent<MeshFilter>();
            mr = go.AddComponent<MeshRenderer>();
            shader = Shader.Find("Unlit/Color");
        }
        mesh.vertices = vertices.ToArray();
        mesh.triangles = triangles;
        mf.mesh = mesh;
        mr.material.shader = shader;
        mr.material.color = Color.red;
        return go;
    }
}
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章