123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247 |
- using UnityEngine;
- namespace Pathfinding {
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
- [HelpURL("http://arongranberg.com/astar/documentation/stable/class_pathfinding_1_1_navmesh_add.php")]
- public class NavmeshAdd : NavmeshClipper {
- public enum MeshType {
- Rectangle,
- CustomMesh
- }
- public MeshType type;
-
-
-
-
-
-
- public Mesh mesh;
-
- Vector3[] verts;
-
- int[] tris;
-
- public Vector2 rectangleSize = new Vector2(1, 1);
- public float meshScale = 1;
- public Vector3 center;
-
-
-
-
- [UnityEngine.Serialization.FormerlySerializedAsAttribute("useRotation")]
- public bool useRotationAndScale;
-
-
-
-
-
- [Tooltip("Distance between positions to require an update of the navmesh\nA smaller distance gives better accuracy, but requires more updates when moving the object over time, so it is often slower.")]
- public float updateDistance = 0.4f;
-
-
-
-
- [Tooltip("How many degrees rotation that is required for an update to the navmesh. Should be between 0 and 180.")]
- public float updateRotationDistance = 10;
-
- protected Transform tr;
- Vector3 lastPosition;
- Quaternion lastRotation;
-
-
-
-
-
- public override bool RequiresUpdate () {
- return (tr.position-lastPosition).sqrMagnitude > updateDistance*updateDistance || (useRotationAndScale && (Quaternion.Angle(lastRotation, tr.rotation) > updateRotationDistance));
- }
-
-
-
-
-
-
-
- public override void ForceUpdate () {
- lastPosition = new Vector3(float.PositiveInfinity, float.PositiveInfinity, float.PositiveInfinity);
- }
- protected override void Awake () {
- base.Awake();
- tr = transform;
- }
-
- internal override void NotifyUpdated () {
- lastPosition = tr.position;
- if (useRotationAndScale) {
- lastRotation = tr.rotation;
- }
- }
- public Vector3 Center {
- get {
- return tr.position + (useRotationAndScale ? tr.TransformPoint(center) : center);
- }
- }
- [ContextMenu("Rebuild Mesh")]
- public void RebuildMesh () {
- if (type == MeshType.CustomMesh) {
- if (mesh == null) {
- verts = null;
- tris = null;
- } else {
- verts = mesh.vertices;
- tris = mesh.triangles;
- }
- } else {
- if (verts == null || verts.Length != 4 || tris == null || tris.Length != 6) {
- verts = new Vector3[4];
- tris = new int[6];
- }
- tris[0] = 0;
- tris[1] = 1;
- tris[2] = 2;
- tris[3] = 0;
- tris[4] = 2;
- tris[5] = 3;
- verts[0] = new Vector3(-rectangleSize.x*0.5f, 0, -rectangleSize.y*0.5f);
- verts[1] = new Vector3(rectangleSize.x*0.5f, 0, -rectangleSize.y*0.5f);
- verts[2] = new Vector3(rectangleSize.x*0.5f, 0, rectangleSize.y*0.5f);
- verts[3] = new Vector3(-rectangleSize.x*0.5f, 0, rectangleSize.y*0.5f);
- }
- }
-
-
-
-
-
- public override Rect GetBounds (Pathfinding.Util.GraphTransform inverseTransform) {
- if (this.verts == null) RebuildMesh();
- var verts = Pathfinding.Util.ArrayPool<Int3>.Claim(this.verts != null? this.verts.Length : 0);
- int[] tris;
- GetMesh(ref verts, out tris, inverseTransform);
- Rect r = new Rect();
- for (int i = 0; i < tris.Length; i++) {
- var p = (Vector3)verts[tris[i]];
- if (i == 0) {
- r = new Rect(p.x, p.z, 0, 0);
- } else {
- r.xMax = System.Math.Max(r.xMax, p.x);
- r.yMax = System.Math.Max(r.yMax, p.z);
- r.xMin = System.Math.Min(r.xMin, p.x);
- r.yMin = System.Math.Min(r.yMin, p.z);
- }
- }
- Pathfinding.Util.ArrayPool<Int3>.Release(ref verts);
- return r;
- }
-
-
-
-
-
-
-
- public void GetMesh (ref Int3[] vbuffer, out int[] tbuffer, Pathfinding.Util.GraphTransform inverseTransform = null) {
- if (verts == null) RebuildMesh();
- if (verts == null) {
- tbuffer = Util.ArrayPool<int>.Claim(0);
- return;
- }
- if (vbuffer == null || vbuffer.Length < verts.Length) {
- if (vbuffer != null) Util.ArrayPool<Int3>.Release(ref vbuffer);
- vbuffer = Util.ArrayPool<Int3>.Claim(verts.Length);
- }
- tbuffer = tris;
- if (useRotationAndScale) {
- Matrix4x4 m = Matrix4x4.TRS(tr.position + center, tr.rotation, tr.localScale * meshScale);
- for (int i = 0; i < verts.Length; i++) {
- var v = m.MultiplyPoint3x4(verts[i]);
- if (inverseTransform != null) v = inverseTransform.InverseTransform(v);
- vbuffer[i] = (Int3)v;
- }
- } else {
- Vector3 voffset = tr.position + center;
- for (int i = 0; i < verts.Length; i++) {
- var v = voffset + verts[i]*meshScale;
- if (inverseTransform != null) v = inverseTransform.InverseTransform(v);
- vbuffer[i] = (Int3)v;
- }
- }
- }
- public static readonly Color GizmoColor = new Color(154.0f/255, 35.0f/255, 239.0f/255);
- #if UNITY_EDITOR
- public static Int3[] gizmoBuffer;
- public void OnDrawGizmos () {
- if (tr == null) tr = transform;
- int[] tbuffer;
- GetMesh(ref gizmoBuffer, out tbuffer);
- Gizmos.color = GizmoColor;
- for (int i = 0; i < tbuffer.Length; i += 3) {
- var v1 = (Vector3)gizmoBuffer[tbuffer[i+0]];
- var v2 = (Vector3)gizmoBuffer[tbuffer[i+1]];
- var v3 = (Vector3)gizmoBuffer[tbuffer[i+2]];
- Gizmos.DrawLine(v1, v2);
- Gizmos.DrawLine(v2, v3);
- Gizmos.DrawLine(v3, v1);
- }
- }
- #endif
- }
- }
|