[Unity] 부채의 범위를 시각화하려면 다음과 같이 하십시오.

부채형의 범위를 가시화하고 싶다



실행 시 보이지 않아도 되지만 편집 과정에서 적의 시야를 가시화하고자 하니 조사해보자
[Unity] 부채꼴 톱니바퀴 만들기
http://www.urablog.xyz/entry/2017/10/22/183331
그렇군요. 기즈모가 이런 용도로 쓸 수 있을까요?
하고 싶었던 일을 완성된 형태로 찾아냈는데 이대로는 끝낼 수 없어요
기즈모의 규격을 확인하는 동시에 이쪽 코드도 개량해 봅시다

기능 추가


FanViwer.cs
using UnityEngine;

namespace Egliss
{
    [DisallowMultipleComponent]
    public class FanViewer : MonoBehaviour
    {
        [SerializeField, Range(0,360.0f)]
        private float _fovX = 90.0f;
        [SerializeField, Range(0, 360.0f)]
        private float _fovY = 90.0f;
        [SerializeField, Range(0,100)]
        private float _distance = 7.0f;
        [SerializeField]
        private Color _color = new Color(1.0f, 0.5f, 0.5f, 0.5f);
        [SerializeField,Range(1,255)]   
        private int _quality = 16;
        [SerializeField]
        private bool _isIgnoreYFan = false;

        public float fovX { get { return _fovX; } }
        public float fovY { get { return _fovY; } }
        public float distance { get { return _distance; } }
        public Color color { get { return _color; } }
        public int quality { get { return _quality; } }
        public bool isIgnoreYFan { get { return _isIgnoreYFan; } }
    }
}

Gizmo 측 고정 값 설정을 변경할 수 있는 Color 및 TriangleCount
또한 Y 방향의 범위를 숨길 수 있습니다

최적화


FanAreaVisualizer.cs
using UnityEngine;
using System;
using System.Collections;
using System.Collections.Generic;
using System.Linq;
using UnityEditor;

namespace Egliss
{
    public class GizmoExtension
    {
        [DrawGizmo(GizmoType.NonSelected | GizmoType.Selected | GizmoType.InSelectionHierarchy)]
        private static void DrawFan(FanViewer view, GizmoType i_gizmoType)
        {
            //can't draw
            if (view.distance <= 0.0f)
                return;

            DrawFan(view);
        }

        private static void DrawFan(FanViewer view)
        {
            Gizmos.color = view.color;

            Vector3 pos = view.transform.position;
            Quaternion rot = view.transform.rotation;
            Vector3 scale = Vector3.one * view.distance;

            Mesh fanMesh = CreateFanMesh(view.fovX, view.quality);
            Gizmos.DrawMesh(fanMesh, pos, rot, scale);

            if (view.isIgnoreYFan)
                return;

            Mesh fanMesh2 = CreateFanMesh(view.fovY, view.quality);
            Gizmos.DrawMesh(fanMesh2, pos, rot * Quaternion.AngleAxis(90.0f, Vector3.forward), scale);
        }
        private static Mesh CreateFanMesh(float angle, int triangleCount)
        {
            var mesh = new Mesh();

            mesh.vertices = CreateFanVertexBuffer(angle, triangleCount);
            mesh.triangles = CreateFanIndexBuffer(triangleCount);
            mesh.RecalculateNormals();

            return mesh;
        }
        private static int[] CreateFanIndexBuffer(int triangleCount)
        {
            int[] indexBuffer = new int[triangleCount * 6];

            for (int L10 = 0; L10 < triangleCount; L10++)
            {
                int index = L10 * 3;
                int index2 = triangleCount * 3 + index;

                //front
                indexBuffer[index + 1] = L10 + 1;
                indexBuffer[index + 2] = L10 + 2;
                //backface
                indexBuffer[index2 + 1] = L10 + 2;
                indexBuffer[index2 + 2] = L10 + 1;
            }
            return indexBuffer;
        }
        private static Vector3[] CreateFanVertexBuffer(float angle, int triangleCount)
        {
            Vector3[] vertexBuffer = new Vector3[triangleCount + 2];

            // startpoint
            vertexBuffer[0] = Vector3.zero;

            float startRad = -angle / 2;
            float angleStep = angle / triangleCount;

            for (int L10 = 0; L10 < triangleCount + 1; L10++)
            {
                float nowRad = (startRad + angleStep * L10) * Mathf.Deg2Rad;
                vertexBuffer[L10 + 1] = new Vector3(Mathf.Sin(nowRad), 0.0f, Mathf.Cos(nowRad));
            }
            return vertexBuffer;
        }
    }
}
X 버퍼를 사용하여 뒷면 그리기 지원
ToAray의 List를 생략하고 버퍼의 0 대입을 생략합니다 (C# 정렬 초기화에 규정된 값 0 대입)

중점


· FanViewer에서 편집기 확장에 적응할 때 Gizmo의 부채꼴 범위를 업데이트하지 않을 때
편집기의 입력 필드가 초점에서 벗어날 때까지 업데이트되지 않을 것 같습니다
슬라이더를 만지면서 탭 키로 업데이트 범위를 확인했습니다.
그래서 이번에는 편집기 확장이 없고 Range 속성만 적용됩니다
・Gizmos.DrawMesh에서 소재 등을 지정할 수 없습니다.
뒷면 묘사를 할 때 Cull off가 지정한 차폐물에 적응할 수 있는지 조사했지만 찾지 못했다
그래서 이번에는 다음 버퍼 메모리를 터치해서 대응을 하도록 하겠습니다.

좋은 웹페이지 즐겨찾기