Files
Convention-Unity-Demo/Assets/Scripts/MoreSpline/SplineAnchor.cs
2025-12-16 17:54:51 +08:00

109 lines
4.1 KiB
C#
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

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
{
public static SplineAnchor Make()
{
return new GameObject().AddComponent<SplineAnchor>();
}
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();
}
/// <summary>
/// 必须先执行LoadSpline加载样条线
/// </summary>
/// <param name="offset">百分比所在位置,取值范围是[01]</param>
[Convention.RScript.Variable.Attr.Method]
public void EvaluatePosition(float offset)
{
MySplineOffset = offset;
Updater = () => transform.position = MySplineCore.MySplineComputer.EvaluatePosition(MySplineOffset);
}
/// <summary>
/// 绑定到样条线渲染器上
/// 并设置跟随指定时间的时刻渲染器所生成的头部
/// </summary>
/// <param name="splineRenderer">样条线渲染器对象</param>
/// <param name="time">时刻</param>
/// <param name="isFollowPosition">是否跟随位置, 默认开启</param>
/// <param name="isFollowRotation">是否跟随旋转, 默认开启</param>
[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;
};
}
}
}
}