一:實現思路
需要判斷一點:
——發起圓形檢測的物體與敵人的距離是否小於圓形半徑
二:代碼實現
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;
}
}