Files
Convention-Unity-Demo/Assets/Scripts/MoreSpline/SplineAnchor.cs

101 lines
3.7 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 System;
using System.Collections;
using UnityEngine;
namespace Demo.Game
{
public class SplineAnchor : ScriptableObject, IDependOnSplineCore, IDependOnSplineRenderer
{
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>
/// 加载并绑定到新样条线
/// </summary>
/// <param name="path">对象路径, 不存在时则立刻加载</param>
[ScriptableCall(DependOnSplineCoreUtility.LoadSplineDescription)]
public IEnumerator LoadSpline(string path)
{
yield return this.LoadSplineTool(path);
}
/// <summary>
/// 必须先执行LoadSpline加载样条线
/// </summary>
/// <param name="value">百分比所在位置,取值范围是[01]</param>
[ScriptableCall(@"
<summary>
必须先执行LoadSpline加载样条线
</summary>
<param name=""value"">百分比所在位置,取值范围是[01]</param>
")]
public void EvaluatePosition(string value)
{
MySplineOffset = Parse(value);
Updater = () => transform.position = MySplineCore.MySplineComputer.EvaluatePosition(MySplineOffset);
}
/// <summary>
/// 绑定到样条线渲染器上(必须已经加载),
/// 并设置跟随指定时间的时刻渲染器所生成的头部
/// </summary>
/// <param name="path">对象路径, 不存在时则立刻加载</param>
/// <param name="time">时刻</param>
/// <param name="isFollowPosition">是否跟随位置, 默认开启</param>
/// <param name="isFollowRotation">是否跟随旋转, 默认开启</param>
[ScriptableCall(@"
<summary>
绑定到样条线渲染器上(必须已经加载),
并设置跟随指定时间的时刻渲染器所生成的头部
</summary>
<param name=""path"">对象路径, 不存在时则立刻加载</param>
<param name=""time"">时刻</param>
<param name=""isFollowPosition"">是否跟随位置, 默认开启</param>
<param name=""isFollowRotation"">是否跟随旋转, 默认开启</param>
")]
public void LoadSplineRenderer(string path, string time, string isFollowPosition = "true", string isFollowRotation = "true")
{
MySplineRenderer = this.LoadSplineRendererTool(path);
MySplineOffset = Parse(time);
bool bIsFollowPosition = ConvertValue<bool>(isFollowPosition);
bool bIsFollowRotation = ConvertValue<bool>(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;
};
}
}
}
}