diff options
Diffstat (limited to 'Runtime/Graphs/UnityEngine.Graphs/LogicNodeLibrary/Transform')
5 files changed, 285 insertions, 0 deletions
diff --git a/Runtime/Graphs/UnityEngine.Graphs/LogicNodeLibrary/Transform/LookAt.cs b/Runtime/Graphs/UnityEngine.Graphs/LogicNodeLibrary/Transform/LookAt.cs new file mode 100644 index 0000000..4ba9bd0 --- /dev/null +++ b/Runtime/Graphs/UnityEngine.Graphs/LogicNodeLibrary/Transform/LookAt.cs @@ -0,0 +1,46 @@ +using UnityEngine; + +namespace UnityEngine.Graphs.LogicGraph +{ + public partial class TransformNodes + { + [Logic(typeof(Transform))] + public sealed class LookAt : YieldedTransformNodeBase + { + private readonly ILookAtRotationCalculator m_RotationCalculator; + private Quaternion m_InitialRotation; + private Vector3 m_TargetRelativePosition; + + public override Transform target { set { m_Target = value; } } + public Vector3 targetOffset { set { m_TargetRelativePosition = value; } } + + + public LookAt () + { + m_RotationCalculator = StandardLookAtRotationCalculator.s_Instance; + } + + public LookAt (Transform self, Transform target, Vector3 targetRelativePosition, float time, ILookAtRotationCalculator rotationCalculator) : base (self, target, time) + { + m_TargetRelativePosition = targetRelativePosition; + m_RotationCalculator = rotationCalculator; + } + + protected override void OnStart() + { + m_InitialRotation = self.rotation; + } + + protected override void OnUpdate() + { + self.rotation = m_RotationCalculator.CalculateRotation(self, m_Target, m_TargetRelativePosition, m_InitialRotation, m_Percentage, m_Curve); + } + + protected override void OnDone() + { + self.rotation = m_RotationCalculator.CalculateRotation(self, m_Target, m_TargetRelativePosition, m_InitialRotation, 1.0f, m_Curve); + } + } + } +} + diff --git a/Runtime/Graphs/UnityEngine.Graphs/LogicNodeLibrary/Transform/MoveTo.cs b/Runtime/Graphs/UnityEngine.Graphs/LogicNodeLibrary/Transform/MoveTo.cs new file mode 100644 index 0000000..b60454c --- /dev/null +++ b/Runtime/Graphs/UnityEngine.Graphs/LogicNodeLibrary/Transform/MoveTo.cs @@ -0,0 +1,45 @@ +using UnityEngine; + +namespace UnityEngine.Graphs.LogicGraph +{ + public partial class TransformNodes + { + [Logic (typeof (Transform))] + public sealed class MoveTo : YieldedTransformNodeBase + { + private readonly IMoveToPositionCalculator m_PositionCalculator; + private Vector3 m_InitialPosition; + private Vector3 m_TargetRelativePosition; + + public override Transform target { set { m_Target = value; } } + public Vector3 targetOffset { set { m_TargetRelativePosition = value; } } + + public MoveTo() + { + m_PositionCalculator = StandardMoveToPositionCalculator.s_Instance; + } + + public MoveTo(Transform self, Transform target, Vector3 targetRelativePosition, float time, IMoveToPositionCalculator positionCalculator) : base (self, target, time) + { + m_TargetRelativePosition = targetRelativePosition; + m_PositionCalculator = positionCalculator; + } + + + protected override void OnStart() + { + m_InitialPosition = self.position; + } + + protected override void OnUpdate() + { + self.position = m_PositionCalculator.CalculatePosition(m_Target, m_TargetRelativePosition, m_InitialPosition, m_Percentage, m_Curve); + } + + protected override void OnDone() + { + self.position = m_PositionCalculator.CalculatePosition(m_Target, m_TargetRelativePosition, m_InitialPosition, 1.0f, m_Curve); + } + } + } +} diff --git a/Runtime/Graphs/UnityEngine.Graphs/LogicNodeLibrary/Transform/RotateTo.cs b/Runtime/Graphs/UnityEngine.Graphs/LogicNodeLibrary/Transform/RotateTo.cs new file mode 100644 index 0000000..8b44479 --- /dev/null +++ b/Runtime/Graphs/UnityEngine.Graphs/LogicNodeLibrary/Transform/RotateTo.cs @@ -0,0 +1,45 @@ +using UnityEngine; + +namespace UnityEngine.Graphs.LogicGraph +{ + public partial class TransformNodes + { + [Logic (typeof (Transform))] + public sealed class RotateTo : YieldedTransformNodeBase + { + private readonly IRotateToRotationCalculator m_RotationCalculator; + private Quaternion m_InitialRotation; + private Quaternion m_TargetRelativeRotation; + + public override Transform target { set { m_Target = value; } } + public Quaternion targetOffset { set { m_TargetRelativeRotation = value; } } + + public RotateTo () + { + m_RotationCalculator = StandardRotateToRotationCalculator.s_Instance; + } + + public RotateTo (Transform self, Transform target, Quaternion targetRelativeRotation, float time, IRotateToRotationCalculator rotationCalculator) + : base (self, target, time) + { + m_TargetRelativeRotation = targetRelativeRotation; + m_RotationCalculator = rotationCalculator; + } + + protected override void OnStart () + { + m_InitialRotation = self.rotation; + } + + protected override void OnUpdate () + { + self.rotation = m_RotationCalculator.CalculateRotation (m_Target, m_TargetRelativeRotation, m_InitialRotation, m_Percentage, m_Curve); + } + + protected override void OnDone () + { + self.rotation = m_RotationCalculator.CalculateRotation (m_Target, m_TargetRelativeRotation, m_InitialRotation, 1.0f, m_Curve); + } + } + } +} diff --git a/Runtime/Graphs/UnityEngine.Graphs/LogicNodeLibrary/Transform/TransformNodes.cs b/Runtime/Graphs/UnityEngine.Graphs/LogicNodeLibrary/Transform/TransformNodes.cs new file mode 100644 index 0000000..5e99275 --- /dev/null +++ b/Runtime/Graphs/UnityEngine.Graphs/LogicNodeLibrary/Transform/TransformNodes.cs @@ -0,0 +1,122 @@ +using UnityEngine; + +namespace UnityEngine.Graphs.LogicGraph +{ + public partial class TransformNodes + { + #region Nodes + [Logic(typeof(Transform))] + public static void Translate(Transform self, Vector3 translation, Space relativeTo) + { + self.Translate(translation, relativeTo); + } + + [Logic(typeof(Transform))] + public static void Rotate(Transform self, Vector3 axis, float angle, Space relativeTo) + { + self.Rotate(axis, angle, relativeTo); + } + + [Logic(typeof(Transform))] + public static void Mimic(Transform self, Transform target, bool mimicPosition, bool mimicRotation, bool mimicScale, bool useLocalSpace) + { + if (mimicPosition) + if (useLocalSpace) + self.localPosition = target.localPosition; + else + self.position = target.position; + + if (mimicRotation) + if (useLocalSpace) + self.localRotation = target.localRotation; + else + self.rotation = target.rotation; + + if (mimicScale) + self.localScale = target.localScale; + } + + [LogicEval(typeof(Transform))] + [Title("Get Position")] + public static Vector3 GetPosition(Transform target) + { + if (target == null) + return Vector3.zero; + return target.position; + } + + [Logic(typeof(Transform))] + [Title("Set Position")] + public static void SetPosition(Transform target, Vector3 position) + { + if (target == null) + return; + target.position = position; + } + #endregion + + #region Node Helpers + private static Quaternion LookAtLookRotation(Transform self, Transform target, Vector3 targetRelativePosition) + { + return Quaternion.LookRotation(AbsoluteTargetPosition(target, targetRelativePosition) - self.position); + } + + private static Vector3 AbsoluteTargetPosition(Transform target, Vector3 targetRelativePosition) + { + if (target != null) + return target.position + targetRelativePosition; + return targetRelativePosition; + } + #endregion + + #region Transform Calculators + public interface IMoveToPositionCalculator + { + Vector3 CalculatePosition (Transform target, Vector3 targetRelativePosition, Vector3 initialPosition, float percentage, AnimationCurve curve); + } + + class StandardMoveToPositionCalculator : IMoveToPositionCalculator + { + public static readonly IMoveToPositionCalculator s_Instance = new StandardMoveToPositionCalculator (); + + public Vector3 CalculatePosition (Transform target, Vector3 targetRelativePosition, Vector3 initialPosition, float percentage, AnimationCurve curve) + { + return Vector3.Lerp (initialPosition, AbsoluteTargetPosition (target, targetRelativePosition), curve.Evaluate (percentage)); + } + } + + + public interface IRotateToRotationCalculator + { + Quaternion CalculateRotation (Transform target, Quaternion targetRelativeRotation, Quaternion initialRotation, float percentage, AnimationCurve curve); + } + + class StandardRotateToRotationCalculator : IRotateToRotationCalculator + { + public static readonly IRotateToRotationCalculator s_Instance = new StandardRotateToRotationCalculator (); + + public Quaternion CalculateRotation (Transform target, Quaternion targetRelativeRotation, Quaternion initialRotation, float percentage, AnimationCurve curve) + { + return Quaternion.Lerp (initialRotation, targetRelativeRotation * target.rotation, curve.Evaluate (percentage)); + } + } + + + public interface ILookAtRotationCalculator + { + Quaternion CalculateRotation (Transform self, Transform target, Vector3 targetRelativePosition, Quaternion initialRotation, float percentage, AnimationCurve curve); + } + + class StandardLookAtRotationCalculator : ILookAtRotationCalculator + { + public static readonly ILookAtRotationCalculator s_Instance = new StandardLookAtRotationCalculator (); + + public Quaternion CalculateRotation (Transform self, Transform target, Vector3 targetRelativePosition, Quaternion initialRotation, float percentage, AnimationCurve curve) + { + return Quaternion.Lerp (initialRotation, LookAtLookRotation (self, target, targetRelativePosition), curve.Evaluate (percentage)); + } + } + #endregion + } +} + diff --git a/Runtime/Graphs/UnityEngine.Graphs/LogicNodeLibrary/Transform/YieldedTransformNodeBase.cs b/Runtime/Graphs/UnityEngine.Graphs/LogicNodeLibrary/Transform/YieldedTransformNodeBase.cs new file mode 100644 index 0000000..e95f699 --- /dev/null +++ b/Runtime/Graphs/UnityEngine.Graphs/LogicNodeLibrary/Transform/YieldedTransformNodeBase.cs @@ -0,0 +1,27 @@ +using UnityEngine; + +namespace UnityEngine.Graphs.LogicGraph +{ + public abstract class YieldedTransformNodeBase : YieldedNodeBase + { + [LogicTarget] + public Transform self; + + protected Transform m_Target; + protected AnimationCurve m_Curve; + + public virtual Transform target { set { m_Target = value; } } + public virtual AnimationCurve curve { set { m_Curve = value; } } + + protected YieldedTransformNodeBase () + { + m_Curve = new AnimationCurve (); + } + + protected YieldedTransformNodeBase (Transform self, Transform target, float time) : base (time) + { + this.self = self; + m_Target = target; + } + } +} |