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;
};
}
}
}
}