一:实现思路
需要判断一点:
——发起圆形检测的物体与敌人的距离是否小于圆形半径
二:代码实现
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;
}
}