123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118 |
- using UnityEngine;
- using System.Collections.Generic;
- using UnityEngine.AI;
- namespace Unity.AI.Navigation.Samples
- {
- /// <summary>
- /// Manipulation tool for displacing the vertices in a list of meshes
- /// </summary>
- [DefaultExecutionOrder(-101)]
- public class MeshTool : MonoBehaviour
- {
- NavMeshSurface m_Surface;
-
- public enum ExtrudeMethod
- {
- Vertical,
- MeshNormal
- }
-
- public List<MeshFilter> m_Filters = new List<MeshFilter>();
- public float m_Radius = 1.5f;
- public float m_Power = 2.0f;
- public ExtrudeMethod m_Method = ExtrudeMethod.Vertical;
-
- RaycastHit m_HitInfo = new RaycastHit();
- AsyncOperation m_LastNavMeshUpdate;
- void OnEnable()
- {
- Cursor.lockState = CursorLockMode.Locked;
- Cursor.visible = false;
- m_Surface = GetComponent<NavMeshSurface>();
- if (m_Surface != null)
- {
- m_Surface.BuildNavMesh();
- m_LastNavMeshUpdate = m_Surface.UpdateNavMesh(m_Surface.navMeshData);
- }
- }
-
- void Update()
- {
- var ray = new Ray(Camera.main.transform.position, Camera.main.transform.forward);
- if (Physics.Raycast(ray.origin, ray.direction, out m_HitInfo))
- {
- Debug.DrawRay(m_HitInfo.point, m_HitInfo.normal, Color.red);
- Vector3 displacement = (m_Method == ExtrudeMethod.Vertical) ? Vector3.up : m_HitInfo.normal;
- if (Input.GetMouseButton(0) || (Input.GetKey(KeyCode.Space) && !Input.GetKey(KeyCode.LeftShift)))
- {
- ModifyMesh(m_Power * displacement, m_HitInfo.point);
- if (m_Surface != null)
- {
- if (m_LastNavMeshUpdate.isDone)
- m_LastNavMeshUpdate = m_Surface.UpdateNavMesh(m_Surface.navMeshData);
- }
-
- }
- else if (Input.GetMouseButton(1) || (Input.GetKey(KeyCode.Space) && Input.GetKey(KeyCode.LeftShift)))
- {
- ModifyMesh(-m_Power * displacement, m_HitInfo.point);
- if(m_Surface != null)
- {
- if (m_LastNavMeshUpdate.isDone)
- m_LastNavMeshUpdate = m_Surface.UpdateNavMesh(m_Surface.navMeshData);
- }
- }
- else if(Input.GetMouseButtonUp(0) || Input.GetMouseButtonUp(1) || Input.GetKeyUp(KeyCode.Space))
- {
- if (m_Surface != null)
- {
- if (!m_LastNavMeshUpdate.isDone)
- NavMeshBuilder.Cancel(m_Surface.navMeshData);
-
- m_LastNavMeshUpdate = m_Surface.UpdateNavMesh(m_Surface.navMeshData);
- }
- }
- }
- }
-
- void ModifyMesh(Vector3 displacement, Vector3 center)
- {
- foreach (var filter in m_Filters)
- {
- Mesh mesh = filter.mesh;
- Vector3[] vertices = mesh.vertices;
-
- for (int i = 0; i < vertices.Length; ++i)
- {
- Vector3 v = filter.transform.TransformPoint(vertices[i]);
- vertices[i] = vertices[i] + displacement * Gaussian(v, center, m_Radius);
- }
-
- mesh.vertices = vertices;
- mesh.RecalculateBounds();
-
- var col = filter.GetComponent<MeshCollider>();
- if (col != null)
- {
- var colliMesh = new Mesh();
- colliMesh.vertices = mesh.vertices;
- colliMesh.triangles = mesh.triangles;
- col.sharedMesh = colliMesh;
- }
- }
- }
-
- static float Gaussian(Vector3 pos, Vector3 mean, float dev)
- {
- float x = pos.x - mean.x;
- float y = pos.y - mean.y;
- float z = pos.z - mean.z;
- float n = 1.0f / (2.0f * Mathf.PI * dev * dev);
- return n * Mathf.Pow(2.718281828f, -(x * x + y * y + z * z) / (2.0f * dev * dev));
- }
- }
- }
|