天又晴 发表于 2021-4-22 16:10:54

视野检测-视野遮挡效果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);
      }
    }
}

全能起始 发表于 2021-4-23 21:12:38

大神收下我的膝盖~

发表于 1970-1-1 08:00:00

Dente 发表于 2021-5-11 11:36:27

6666666666666666666
页: [1]
查看完整版本: 视野检测-视野遮挡效果UI实现算法-锥形视野