视野检测-视野遮挡效果UI实现算法-锥形视野
https://att.element3ds.com/data/attachment/upload_media/20210422/bsfezvjkrjsedyr2.mp4?form=upload_media_4077
视野检测-视野遮挡效果UI实现算法
using System;
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
public class DrawSectorSolid : MonoBehaviour
{
public GameObject go;
public MeshFilter mf;
public MeshRenderer mr;
public Shader shader;
private List<Vector3> vertices;
private void Start()
{
vertices = new List<Vector3>();
}
void Update()
{
// if (Input.GetKeyDown(KeyCode.A))
{
ToDrawSectorSolid(transform, transform.localPosition, 60, 10);
}
}
private GameObject CreateMesh(List<Vector3> vertices)
{
int[] triangles;
Mesh mesh = new Mesh();
int triangleAmount = vertices.Count - 2;
triangles = new int;
//根据三角形的个数,来计算绘制三角形的顶点顺序(索引)
//顺序必须为顺时针或者逆时针
for (int i = 0; i < triangleAmount; i++)
{
triangles = 0; //固定第一个点
triangles = i + 1;
triangles = i + 2;
}
if (go == null)
{
go = new GameObject("mesh");
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;
}
//绘制实心扇形
public void ToDrawSectorSolid(Transform t, Vector3 center, float angle, float radius)
{
int pointAmount = 100; //点的数目,值越大曲线越平滑
float eachAngle = angle / pointAmount;
Vector3 forward = t.forward;
vertices.Clear();
vertices.Add(center);
for (int i = 1; i < pointAmount - 1; i++)
{
Vector3 pos = Quaternion.Euler(0f, -angle / 2 + eachAngle * (i - 1), 0f) * forward * radius + center;
//射线检测碰撞点
RaycastHit hit;
if (Physics.Raycast(center, pos, out hit, radius))
{
pos = hit.transform.position;
}
vertices.Add(pos);
}
CreateMesh(vertices);
}
private void OnDrawGizmos()
{
Gizmos.color = new Color(1, 0, 1, 0.5F);
foreach (var vector3 in vertices)
{
Gizmos.DrawWireSphere(vector3, 0.05f);
}
}
}
大神收下我的膝盖~ 6666666666666666666
页:
[1]