using System; using System.Collections; using UnityEngine; namespace Demo.Game { public class SplineAnchor : ScriptableObject, IDependOnSplineCore, IDependOnSplineRenderer { public static SplineAnchor Make() { return new GameObject().AddComponent(); } public SplineCore MySplineCore { get; set; } public BasicSplineRenderer MySplineRenderer { get; set; } public float MySplineOffset = 0; private Action Updater = null; protected override void UpdateTicks(float currentTime, float deltaTime, TickType tickType) { base.UpdateTicks(currentTime, deltaTime, tickType); Updater?.Invoke(); } /// /// 加载并绑定到新样条线 /// /// 对象路径, 不存在时则立刻加载 [ScriptableCall(DependOnSplineCoreUtility.LoadSplineDescription)] public IEnumerator LoadSpline(string path) { yield return this.LoadSplineTool(path); } /// /// 必须先执行LoadSpline加载样条线 /// /// 百分比所在位置,取值范围是[0,1] [ScriptableCall(@" 必须先执行LoadSpline加载样条线 百分比所在位置,取值范围是[0,1] ")] public void EvaluatePosition(string value) { MySplineOffset = Parse(value); Updater = () => transform.position = MySplineCore.MySplineComputer.EvaluatePosition(MySplineOffset); } /// /// 绑定到样条线渲染器上(必须已经加载), /// 并设置跟随指定时间的时刻渲染器所生成的头部 /// /// 对象路径, 不存在时则立刻加载 /// 时刻 /// 是否跟随位置, 默认开启 /// 是否跟随旋转, 默认开启 [ScriptableCall(@" 绑定到样条线渲染器上(必须已经加载), 并设置跟随指定时间的时刻渲染器所生成的头部 对象路径, 不存在时则立刻加载 时刻 是否跟随位置, 默认开启 是否跟随旋转, 默认开启 ")] public void LoadSplineRenderer(string path, string time, string isFollowPosition = "true", string isFollowRotation = "true") { MySplineRenderer = this.LoadSplineRendererTool(path); MySplineOffset = Parse(time); bool bIsFollowPosition = ConvertValue(isFollowPosition); bool bIsFollowRotation = ConvertValue(isFollowRotation); if (bIsFollowPosition && bIsFollowRotation) { Updater = () => { var result = MySplineRenderer.EvaluateClipTo(MySplineOffset); transform.SetPositionAndRotation(result.position, result.rotation); }; } else if (bIsFollowPosition) { Updater = () => { transform.position = MySplineRenderer.EvaluateClipToPosition(MySplineOffset); }; } else { Updater = () => { var result = MySplineRenderer.EvaluateClipTo(MySplineOffset); transform.rotation = result.rotation; }; } } } }