using System.Collections; using UnityEngine; namespace Pathfinding.Examples { using Pathfinding; /// /// Example of how to handle off-mesh link traversal. /// This is used in the "Example4_Recast_Navmesh2" example scene. /// /// See: /// See: /// See: /// [HelpURL("http://arongranberg.com/astar/documentation/stable/class_pathfinding_1_1_examples_1_1_animation_link_traverser.php")] public class AnimationLinkTraverser : VersionedMonoBehaviour { public Animation anim; RichAI ai; void OnEnable () { ai = GetComponent(); if (ai != null) ai.onTraverseOffMeshLink += TraverseOffMeshLink; } void OnDisable () { if (ai != null) ai.onTraverseOffMeshLink -= TraverseOffMeshLink; } protected virtual IEnumerator TraverseOffMeshLink (RichSpecial rs) { var link = rs.nodeLink as AnimationLink; if (link == null) { Debug.LogError("Unhandled RichSpecial"); yield break; } // Rotate character to face the correct direction while (true) { var origRotation = ai.rotation; var finalRotation = ai.SimulateRotationTowards(rs.first.forward, ai.rotationSpeed * Time.deltaTime); // Rotate until the rotation does not change anymore if (origRotation == finalRotation) break; ai.FinalizeMovement(ai.position, finalRotation); yield return null; } // Reposition transform.parent.position = transform.position; transform.parent.rotation = transform.rotation; transform.localPosition = Vector3.zero; transform.localRotation = Quaternion.identity; // Set up animation speeds if (rs.reverse && link.reverseAnim) { anim[link.clip].speed = -link.animSpeed; anim[link.clip].normalizedTime = 1; anim.Play(link.clip); anim.Sample(); } else { anim[link.clip].speed = link.animSpeed; anim.Rewind(link.clip); anim.Play(link.clip); } // Fix required for animations in reverse direction transform.parent.position -= transform.position-transform.parent.position; // Wait for the animation to finish yield return new WaitForSeconds(Mathf.Abs(anim[link.clip].length/link.animSpeed)); } } }