在Unity开发过程中可能需要查看物体的法向量信息,使用自带的Editor功能可以实现:
using UnityEngine; using System.Collections; using UnityEditor; public class ShowNormals : EditorWindow { [MenuItem("Window/Tools/Show Normals")] public static void InitWindow() { EditorWindow.GetWindow<ShowNormals>(); } public GameObject Model; public float NormalLength = 1f; private Color normalColor = Color.green; void OnEnable() { SceneView.onSceneGUIDelegate += OnSceneGUI; } void OnDisable() { SceneView.onSceneGUIDelegate -= OnSceneGUI; } void OnGUI() { NormalLength = EditorGUILayout.FloatField("Normal length", NormalLength); normalColor = EditorGUILayout.ColorField("Normal color", normalColor) ; } void ShowNormal(Mesh mesh, Transform transform) { Handles.color = normalColor; var vertices = mesh.vertices; var normals = mesh.normals; for (var i = 0; i < normals.Length; i++) { var start = transform.TransformPoint(vertices[i]); var end = transform.TransformPoint(vertices[i] + normals[i] * NormalLength); Handles.DrawLine(start, end); } } void OnSceneGUI(SceneView sceneView) { if (Selection.activeGameObject != null) { var go = Selection.activeGameObject.GetComponent<MeshFilter>(); if (go != null) { var mesh = go.sharedMesh; ShowNormal(mesh, go.transform); } } } }
效果如图: