[Unity] 부채의 범위를 시각화하려면 다음과 같이 하십시오.
19129 단어 UnityEditorUnityC#Gizmo
부채형의 범위를 가시화하고 싶다
실행 시 보이지 않아도 되지만 편집 과정에서 적의 시야를 가시화하고자 하니 조사해보자
[Unity] 부채꼴 톱니바퀴 만들기
http://www.urablog.xyz/entry/2017/10/22/183331
그렇군요. 기즈모가 이런 용도로 쓸 수 있을까요?
하고 싶었던 일을 완성된 형태로 찾아냈는데 이대로는 끝낼 수 없어요
기즈모의 규격을 확인하는 동시에 이쪽 코드도 개량해 봅시다
기능 추가
FanViwer.csusing 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.csusing 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가 지정한 차폐물에 적응할 수 있는지 조사했지만 찾지 못했다
그래서 이번에는 다음 버퍼 메모리를 터치해서 대응을 하도록 하겠습니다.
Reference
이 문제에 관하여([Unity] 부채의 범위를 시각화하려면 다음과 같이 하십시오.), 우리는 이곳에서 더 많은 자료를 발견하고 링크를 클릭하여 보았다
https://qiita.com/Egliss/items/3dd6fad0a7f183d47f45
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
우수한 개발자 콘텐츠 발견에 전념
(Collection and Share based on the CC Protocol.)
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; } }
}
}
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;
}
}
}
Reference
이 문제에 관하여([Unity] 부채의 범위를 시각화하려면 다음과 같이 하십시오.), 우리는 이곳에서 더 많은 자료를 발견하고 링크를 클릭하여 보았다 https://qiita.com/Egliss/items/3dd6fad0a7f183d47f45텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
우수한 개발자 콘텐츠 발견에 전념 (Collection and Share based on the CC Protocol.)