[Unity] 视野检测-视野遮挡效果UI实现算法-锥形视野

查看:788 |回复:3 | 2021-4-22 16:10:54

您需要 登录 才可以下载或查看,没有账号?注册

x
微信截图_20210422182200.png





视野检测-视野遮挡效果UI实现算法
  1. using System;
  2. using System.Collections;
  3. using System.Collections.Generic;
  4. using UnityEngine;

  5. public class DrawSectorSolid : MonoBehaviour
  6. {
  7.     public GameObject go;
  8.     public MeshFilter mf;
  9.     public MeshRenderer mr;
  10.     public Shader shader;
  11.     private List<Vector3> vertices;

  12.     private void Start()
  13.     {
  14.         vertices = new List<Vector3>();
  15.     }

  16.     void Update()
  17.     {
  18.         // if (Input.GetKeyDown(KeyCode.A))
  19.         {
  20.             ToDrawSectorSolid(transform, transform.localPosition, 60, 10);
  21.         }
  22.     }

  23.     private GameObject CreateMesh(List<Vector3> vertices)
  24.     {
  25.         int[] triangles;
  26.         Mesh mesh = new Mesh();
  27.         int triangleAmount = vertices.Count - 2;
  28.         triangles = new int[3 * triangleAmount];
  29.         //根据三角形的个数,来计算绘制三角形的顶点顺序(索引)   
  30.         //顺序必须为顺时针或者逆时针      
  31.         for (int i = 0; i < triangleAmount; i++)
  32.         {
  33.             triangles[3 * i] = 0; //固定第一个点      

  34.             triangles[3 * i + 1] = i + 1;

  35.             triangles[3 * i + 2] = i + 2;
  36.         }

  37.         if (go == null)
  38.         {
  39.             go = new GameObject("mesh");

  40.             go.transform.position = new Vector3(0, 0.1f, 0); //让绘制的图形上升一点,防止被地面遮挡  

  41.             mf = go.AddComponent<MeshFilter>();

  42.             mr = go.AddComponent<MeshRenderer>();

  43.             shader = Shader.Find("Unlit/Color");
  44.         }

  45.         mesh.vertices = vertices.ToArray();
  46.         mesh.triangles = triangles;
  47.         mf.mesh = mesh;
  48.         mr.material.shader = shader;
  49.         mr.material.color = Color.red;
  50.         return go;
  51.     }

  52.     //绘制实心扇形
  53.     public void ToDrawSectorSolid(Transform t, Vector3 center, float angle, float radius)

  54.     {
  55.         int pointAmount = 100; //点的数目,值越大曲线越平滑   
  56.         float eachAngle = angle / pointAmount;
  57.         Vector3 forward = t.forward;
  58.         vertices.Clear();
  59.         vertices.Add(center);
  60.         for (int i = 1; i < pointAmount - 1; i++)
  61.         {
  62.             Vector3 pos = Quaternion.Euler(0f, -angle / 2 + eachAngle * (i - 1), 0f) * forward * radius + center;
  63.             //射线检测碰撞点
  64.             RaycastHit hit;
  65.             if (Physics.Raycast(center, pos, out hit, radius))
  66.             {
  67.                 pos = hit.transform.position;
  68.             }

  69.             vertices.Add(pos);
  70.         }

  71.         CreateMesh(vertices);
  72.     }

  73.     private void OnDrawGizmos()
  74.     {
  75.         Gizmos.color = new Color(1, 0, 1, 0.5F);
  76.         foreach (var vector3 in vertices)
  77.         {
  78.             Gizmos.DrawWireSphere(vector3, 0.05f);
  79.         }
  80.     }
  81. }
点击此处复制文本


评分

参与人数 4元素币 +308 活跃度 +46 微金 +200 展开 理由
愚不是渔 + 16 看不懂``
qq_LXY_eeb + 5 很棒
元素界王神 + 300 + 20 + 200 很赞 大家正在讨论!
落雨清风 + 3 + 10 【感谢】楼主分享的内容!很棒!

查看全部评分

2021-4-22 16:10:54  
 赞 赞 0

使用道具 登录

3个回答,把该问题分享到群,邀请大神一起回答。
2#
大神收下我的膝盖~
回复 收起回复
2021-4-23 21:12:38   回复
 赞 赞 0

使用道具 登录

4#
6666666666666666666
回复 收起回复
2021-5-11 11:36:27   回复
 赞 赞 0

使用道具 登录

CG 游戏行业专业问题

手机游戏引擎手游引擎Unity3D技术
您需要登录后才可以回帖 登录 | 注册

本版积分规则

快速回复 返回顶部 返回列表