using Convention; using Demo.Game.Attr; using System; using System.IO; using UnityEngine; namespace Demo.Game { namespace ConfigType { public class SplineAnchorConfig : ScriptLoadableConfig { public int MySplineCore, MySplineRenderer; public bool isFollowPosition, isFollowRotation; public float MySplineOffset; public override void Deserialize(BinaryReader reader) { MySplineCore = BinarySerializeUtility.ReadInt(reader); MySplineRenderer = BinarySerializeUtility.ReadInt(reader); isFollowPosition = BinarySerializeUtility.ReadBool(reader); isFollowRotation = BinarySerializeUtility.ReadBool(reader); MySplineOffset = BinarySerializeUtility.ReadFloat(reader); base.Deserialize(reader); } public override void Serialize(BinaryWriter writer) { BinarySerializeUtility.WriteInt(writer, MySplineCore); BinarySerializeUtility.WriteInt(writer, MySplineRenderer); BinarySerializeUtility.WriteBool(writer, isFollowPosition); BinarySerializeUtility.WriteBool(writer, isFollowRotation); BinarySerializeUtility.WriteFloat(writer, MySplineOffset); base.Serialize(writer); } } } [Scriptable] public class SplineAnchor : ScriptableObject, IDependOnSplineCore { /// /// 加载并绑定到新样条线 /// /// 对象路径, 不存在时则立刻加载 [Convention.RScript.Variable.Attr.Method] public void LoadSpline(SplineCore core) { MySplineCore = core; } 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(); } /// /// 必须先执行LoadSpline加载样条线 /// /// 百分比所在位置,取值范围是[0,1] [Convention.RScript.Variable.Attr.Method] public void EvaluatePosition(float offset) { MySplineOffset = offset; Updater = () => transform.position = MySplineCore.MySplineComputer.EvaluatePosition(MySplineOffset); } /// /// 绑定到样条线渲染器上 /// 并设置跟随指定时间的时刻渲染器所生成的头部 /// /// 样条线渲染器对象 /// 时刻 /// 是否跟随位置, 默认开启 /// 是否跟随旋转, 默认开启 [Convention.RScript.Variable.Attr.Method] public void LoadSplineRenderer(BasicSplineRenderer splineRenderer, float time, bool isFollowPosition = true, bool isFollowRotation = true) { MySplineRenderer = splineRenderer; MySplineOffset = time; bool bIsFollowPosition = isFollowPosition; bool bIsFollowRotation = 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; }; } } } }