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

174 lines
5.3 KiB
C#
Raw Normal View History

2025-12-12 15:19:10 +08:00
using Convention;
2025-12-15 17:20:55 +08:00
using Demo.Game.Attr;
2025-12-12 15:19:10 +08:00
using Dreamteck.Splines;
2025-09-25 19:04:05 +08:00
using System;
using System.Collections;
using System.Collections.Generic;
2025-12-15 17:20:55 +08:00
using System.IO;
2025-09-25 19:04:05 +08:00
using UnityEngine;
namespace Demo.Game
{
2025-12-15 17:20:55 +08:00
namespace ConfigType
{
// SplineCore 配置
public class SplineCoreConfig : ScriptLoadableConfig
{
public SplineComputer.SampleMode MySampleMode;
public Spline.Type MyType;
public bool IsClose;
public override void Deserialize(BinaryReader reader)
{
MySampleMode = (SplineComputer.SampleMode)BinarySerializeUtility.ReadInt(reader);
MyType = (Spline.Type)BinarySerializeUtility.ReadInt(reader);
IsClose = BinarySerializeUtility.ReadBool(reader);
base.Deserialize(reader);
}
public override void Serialize(BinaryWriter writer)
{
BinarySerializeUtility.WriteInt(writer, (int)MySampleMode);
BinarySerializeUtility.WriteInt(writer, (int)MyType);
BinarySerializeUtility.WriteBool(writer, IsClose);
base.Serialize(writer);
}
}
}
2025-09-25 19:04:05 +08:00
public struct SplineClipDuration
{
public float ClipFrom;
public float ClipTo;
public SplineClipDuration(float clipFrom = 0, float clipTo = 1)
{
this.ClipFrom = clipFrom;
this.ClipTo = clipTo;
}
}
public interface IDependOnSplineCore : IScriptableObject
{
SplineCore MySplineCore { get; set; }
/// <summary>
/// 加载并绑定到新样条线
/// </summary>
2025-12-16 17:54:51 +08:00
/// <param name="path">对象路径, 不存在时则立刻加载</param>
[Convention.RScript.Variable.Attr.Method]
void LoadSpline(SplineCore core)
2025-09-25 19:04:05 +08:00
{
2025-12-16 17:54:51 +08:00
MySplineCore = core;
2025-09-25 19:04:05 +08:00
}
}
2025-12-12 15:19:10 +08:00
[Scriptable]
2025-09-25 19:04:05 +08:00
public class SplineCore : ScriptableObject
{
protected override bool IsSelfEnableUpdate => false;
2025-09-25 19:04:05 +08:00
public static SplineCore Make()
{
2025-12-02 15:57:04 +08:00
SplineCore result = new GameObject("").AddComponent<SplineCore>();
var core = result.GetOrAddComponent<SplineComputer>();
result.m_MySplineComputer = core;
2025-12-02 15:57:04 +08:00
core.multithreaded = true;
return result;
2025-09-25 19:04:05 +08:00
}
2025-11-24 18:02:57 +08:00
[Content] private SplineComputer m_MySplineComputer;
2025-09-25 19:04:05 +08:00
[Content] public int NodeContent = 0;
[Content] public List<SplineNode> MySplineNodes = new();
2025-09-25 19:04:05 +08:00
[Content] public SplineComputer.SampleMode MySampleMode = default;
[Content] public Spline.Type MyType = default;
public bool IsClose = false;
public SplineComputer MySplineComputer => m_MySplineComputer;
//{
// get
// {
// if (m_MySplineComputer == null)
// m_MySplineComputer = this.GetComponent<SplineComputer>();
// return m_MySplineComputer;
// }
//}
2025-11-24 18:02:57 +08:00
/// <summary>
/// <see cref="SplineCore"/>需要在子<see cref="SplineNode"/>都添加后再应用脚本才能使得节点生效
/// </summary>
/// <returns></returns>
protected override IEnumerator DoSomethingDuringApplyScript()
2025-09-25 19:04:05 +08:00
{
2025-11-24 18:02:57 +08:00
yield return base.DoSomethingDuringApplyScript();
2025-09-25 19:04:05 +08:00
NodeContent = 0;
MySplineComputer.SetPoints(new SplinePoint[MySplineNodes.Count]);
foreach (SplineNode node in MySplineNodes)
{
node.AddTo(this);
NodeContent++;
}
if (IsClose)
MySplineComputer.Close();
else
MySplineComputer.Break();
MySplineComputer.sampleMode = MySampleMode;
MySplineComputer.type = MyType;
MySplineComputer.Rebuild();
}
protected override void UpdateTicks(float currentTime, float deltaTime, TickType tickType)
{
2025-11-24 18:02:57 +08:00
if (tickType != TickType.Update)
2025-09-25 19:04:05 +08:00
MySplineComputer.Rebuild();
}
public override IEnumerator UnloadScript()
{
yield return base.UnloadScript();
NodeContent = 0;
MySplineNodes.Clear();
IsClose = false;
}
/// <summary>
/// 设置样条线类型
/// </summary>
/// <param name="mode">CatmullRom, BSpline, Bezier, Linear </param>
[Convention.RScript.Variable.Attr.Method]
2025-11-24 18:02:57 +08:00
public void SetType(Spline.Type mode)
2025-09-25 19:04:05 +08:00
{
2025-11-24 18:02:57 +08:00
MyType = mode;
2025-09-25 19:04:05 +08:00
}
/// <summary>
/// 设置采样类型
/// </summary>
/// <param name="mode">Default, Uniform, Optimized</param>
[Convention.RScript.Variable.Attr.Method]
2025-11-24 18:02:57 +08:00
public void SetSampleMode(SplineComputer.SampleMode mode)
2025-09-25 19:04:05 +08:00
{
2025-11-24 18:02:57 +08:00
MySampleMode = mode;
2025-09-25 19:04:05 +08:00
}
/// <summary>
/// 闭环曲线
/// </summary>
[Convention.RScript.Variable.Attr.Method]
2025-09-25 19:04:05 +08:00
public void SetClose()
{
IsClose = true;
}
/// <summary>
2025-11-24 18:02:57 +08:00
/// 加入节点或者添加节点组件后加入节点
2025-09-25 19:04:05 +08:00
/// </summary>
/// <param name="path">脚本位置</param>
[Convention.RScript.Variable.Attr.Method]
2025-11-25 17:04:19 +08:00
public void LoadNode(SplineNode node)
{
2025-11-25 17:04:19 +08:00
MySplineNodes.Add(node);
}
2025-09-25 19:04:05 +08:00
}
}