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;
    }
}
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章