推进同化RScript
This commit is contained in:
@@ -22,12 +22,37 @@ namespace Demo.Game
|
||||
public abstract class BasicSplineRenderer : Updatement<SplineClipDuration>, IAssetBundleLoader, IDependOnSplineCore
|
||||
{
|
||||
[Content] public SplineCore MySplineCore { get; set; }
|
||||
[Content] public MeshRenderer MyMeshRenderer;
|
||||
[Content] private MeshFilter m_MeshFilter;
|
||||
[Content] private MeshRenderer m_MyMeshRenderer;
|
||||
[Header("LineRenderer.Material")]
|
||||
[Content] public string LinesAssetBundlePath;
|
||||
[Content] public AssetBundle LinesAssetBundle;
|
||||
[Content] public string LineMaterial;
|
||||
[Content] public Material MyLineMaterial;
|
||||
[Content] public Material LineDefaultMaterial;
|
||||
|
||||
public override void ResetEnterGameStatus()
|
||||
{
|
||||
base.ResetEnterGameStatus();
|
||||
MyMeshRenderer.material = LineDefaultMaterial;
|
||||
}
|
||||
|
||||
public MeshFilter MyMeshFilter
|
||||
{
|
||||
get
|
||||
{
|
||||
if (m_MeshFilter == null)
|
||||
m_MeshFilter = this.GetOrAddComponent<MeshFilter>();
|
||||
return m_MeshFilter;
|
||||
}
|
||||
}
|
||||
public MeshRenderer MyMeshRenderer
|
||||
{
|
||||
get
|
||||
{
|
||||
if (m_MyMeshRenderer == null)
|
||||
m_MyMeshRenderer = this.GetOrAddComponent<MeshRenderer>();
|
||||
return m_MyMeshRenderer;
|
||||
}
|
||||
}
|
||||
|
||||
public abstract Vector3 EvaluateClipFromPosition(float time);
|
||||
|
||||
@@ -37,26 +62,6 @@ namespace Demo.Game
|
||||
|
||||
public abstract SplineSample EvaluateClipTo(float time);
|
||||
|
||||
public override IEnumerator LoadScript(string script)
|
||||
{
|
||||
yield return base.LoadScript(script);
|
||||
// Bind and Init Spline
|
||||
var splineGameObject = MySplineCore.gameObject;
|
||||
this.GetOrAddComponent<MeshFilter>();
|
||||
MyMeshRenderer = this.GetOrAddComponent<MeshRenderer>();
|
||||
MyMeshRenderer.enabled = true;
|
||||
if (string.IsNullOrEmpty(LinesAssetBundlePath) == false)
|
||||
{
|
||||
var ir = LinesAssetBundle.LoadAssetAsync<Material>(LineMaterial);
|
||||
ir.completed += x =>
|
||||
{
|
||||
MyLineMaterial = ir.asset as Material;
|
||||
};
|
||||
yield return ir;
|
||||
}
|
||||
MyMeshRenderer.material = MyLineMaterial;
|
||||
}
|
||||
|
||||
public override IEnumerator UnloadScript()
|
||||
{
|
||||
if (string.IsNullOrEmpty(LinesAssetBundlePath) == false)
|
||||
@@ -73,15 +78,15 @@ namespace Demo.Game
|
||||
/// <param name="to"></param>
|
||||
/// <param name="curveType">可取值为30种缓动曲线</param>
|
||||
[Convention.RScript.Variable.Attr.Method]
|
||||
public void Add(string time, float from, float to, string curveType)
|
||||
public void Add(float time, float from, float to, string curveType)
|
||||
{
|
||||
ManualAddEntry(time, new(from, to), Enum.Parse<MathExtension.EaseCurveType>(curveType));
|
||||
}
|
||||
|
||||
[Convention.RScript.Variable.Attr.Method]
|
||||
public IEnumerator LoadSpline(string path)
|
||||
public void LoadSpline(string path)
|
||||
{
|
||||
yield return this.LoadSplineTool(path);
|
||||
this.LoadSplineTool(path);
|
||||
}
|
||||
|
||||
|
||||
@@ -97,14 +102,15 @@ namespace Demo.Game
|
||||
/// <param name="ab"></param>
|
||||
/// <param name="material"></param>
|
||||
[Convention.RScript.Variable.Attr.Method]
|
||||
public IEnumerator LoadMaterial(string ab, string material)
|
||||
public void LoadMaterial(string ab, string material)
|
||||
{
|
||||
yield return this.LoadAssetBundle(ab, x =>
|
||||
{
|
||||
LinesAssetBundlePath = ab;
|
||||
LinesAssetBundle = x;
|
||||
LineMaterial = material;
|
||||
});
|
||||
MyMeshRenderer.enabled = true;
|
||||
LinesAssetBundlePath = ab;
|
||||
this.LoadAssetBundle(ab, x =>
|
||||
{
|
||||
LinesAssetBundle = x;
|
||||
LineDefaultMaterial = LinesAssetBundle.LoadAsset<Material>(material);
|
||||
});
|
||||
}
|
||||
|
||||
protected override SplineClipDuration Lerp(SplineClipDuration begin, SplineClipDuration end, float t)
|
||||
@@ -117,11 +123,9 @@ namespace Demo.Game
|
||||
{
|
||||
[Content] public TMeshGenerator MyMeshGenerator;
|
||||
|
||||
public override IEnumerator LoadScript(string script)
|
||||
protected override IEnumerator DoSomethingDuringApplyScript()
|
||||
{
|
||||
yield return base.LoadScript(script);
|
||||
// Setup Mesh Generater
|
||||
MyMeshRenderer.material = MyLineMaterial;
|
||||
yield return base.DoSomethingDuringApplyScript();
|
||||
MyMeshGenerator = this.GetOrAddComponent<TMeshGenerator>();
|
||||
MyMeshGenerator.spline = MySplineCore.MySplineComputer;
|
||||
SetupMeshGenerator(MyMeshGenerator);
|
||||
@@ -142,9 +146,9 @@ namespace Demo.Game
|
||||
/// </summary>
|
||||
/// <param name="mode">Clip, UniformClip, Clamp, UniformClamp</param>
|
||||
[Convention.RScript.Variable.Attr.Method]
|
||||
public void SetUVMode(string mode)
|
||||
public void SetUVMode(MeshGenerator.UVMode mode)
|
||||
{
|
||||
MyUVMode = Enum.Parse<MeshGenerator.UVMode>(mode);
|
||||
MyUVMode = mode;
|
||||
}
|
||||
|
||||
#endregion
|
||||
|
||||
@@ -27,37 +27,37 @@ namespace Demo.Game
|
||||
/// </summary>
|
||||
/// <param name="path">对象路径, 不存在时则立刻加载</param>
|
||||
[Convention.RScript.Variable.Attr.Method]
|
||||
public IEnumerator LoadSpline(string path)
|
||||
public void LoadSpline(string path)
|
||||
{
|
||||
yield return this.LoadSplineTool(path);
|
||||
this.LoadSplineTool(path);
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// 必须先执行LoadSpline加载样条线
|
||||
/// </summary>
|
||||
/// <param name="value">百分比所在位置,取值范围是[0,1]</param>
|
||||
/// <param name="offset">百分比所在位置,取值范围是[0,1]</param>
|
||||
[Convention.RScript.Variable.Attr.Method]
|
||||
public void EvaluatePosition(string value)
|
||||
public void EvaluatePosition(float offset)
|
||||
{
|
||||
MySplineOffset = Parse(value);
|
||||
MySplineOffset = offset;
|
||||
Updater = () => transform.position = MySplineCore.MySplineComputer.EvaluatePosition(MySplineOffset);
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// 绑定到样条线渲染器上(必须已经加载),
|
||||
/// 绑定到样条线渲染器上
|
||||
/// 并设置跟随指定时间的时刻渲染器所生成的头部
|
||||
/// </summary>
|
||||
/// <param name="path">对象路径, 不存在时则立刻加载</param>
|
||||
/// <param name="splineRenderer">样条线渲染器对象</param>
|
||||
/// <param name="time">时刻</param>
|
||||
/// <param name="isFollowPosition">是否跟随位置, 默认开启</param>
|
||||
/// <param name="isFollowRotation">是否跟随旋转, 默认开启</param>
|
||||
[Convention.RScript.Variable.Attr.Method]
|
||||
public void LoadSplineRenderer(string path, string time, string isFollowPosition = "true", string isFollowRotation = "true")
|
||||
public void LoadSplineRenderer(BasicSplineRenderer splineRenderer, float time, bool isFollowPosition = true, bool isFollowRotation = true)
|
||||
{
|
||||
MySplineRenderer = this.LoadSplineRendererTool(path);
|
||||
MySplineOffset = Parse(time);
|
||||
bool bIsFollowPosition = ConvertValue<bool>(isFollowPosition);
|
||||
bool bIsFollowRotation = ConvertValue<bool>(isFollowRotation);
|
||||
MySplineRenderer = splineRenderer;
|
||||
MySplineOffset = time;
|
||||
bool bIsFollowPosition = isFollowPosition;
|
||||
bool bIsFollowRotation = isFollowRotation;
|
||||
if (bIsFollowPosition && bIsFollowRotation)
|
||||
{
|
||||
Updater = () =>
|
||||
|
||||
@@ -22,7 +22,7 @@ namespace Demo.Game
|
||||
public interface IDependOnSplineCore : IScriptableObject
|
||||
{
|
||||
SplineCore MySplineCore { get; set; }
|
||||
IEnumerator LoadSpline(string path);
|
||||
void LoadSpline(string path);
|
||||
}
|
||||
|
||||
public static class DependOnSplineCoreUtility
|
||||
@@ -38,19 +38,13 @@ namespace Demo.Game
|
||||
/// 加载并绑定到新样条线
|
||||
/// </summary>
|
||||
/// <param name="path">对象相对路径,若对象不存在则作为脚本相对路径加载</param>
|
||||
public static IEnumerator LoadSplineTool(this IDependOnSplineCore self, string path)
|
||||
public static SplineCore LoadSplineTool(this IDependOnSplineCore self, string path)
|
||||
{
|
||||
var spline = self.SharedInterfaceScriptObject.FindWithPath(path, false);
|
||||
if (spline == null)
|
||||
yield return self.SharedInterfaceScriptObject.DoLoadSubScriptAsync(nameof(SplineCore), path, x => spline = x);
|
||||
if (spline is SplineCore sc)
|
||||
{
|
||||
self.MySplineCore = sc;
|
||||
}
|
||||
else
|
||||
{
|
||||
Debug.LogWarning($"{path} is not a SplineCore", self.SharedInterfaceScriptObject);
|
||||
}
|
||||
spline = self.SharedInterfaceScriptObject.NewSubScript(nameof(SplineCore), new ToolFile(path).GetFilename(true), path);
|
||||
self.MySplineCore = (SplineCore)spline;
|
||||
return self.MySplineCore;
|
||||
}
|
||||
}
|
||||
|
||||
@@ -61,18 +55,31 @@ namespace Demo.Game
|
||||
return new GameObject("", typeof(SplineComputer)).AddComponent<SplineCore>();
|
||||
}
|
||||
|
||||
[Content] public SplineComputer MySplineComputer;
|
||||
[Content] private SplineComputer m_MySplineComputer;
|
||||
[Content] public int NodeContent = 0;
|
||||
[Content] public List<SplineNode> MySplineNodes = new();
|
||||
[Content] public readonly List<SplineNode> MySplineNodes = new();
|
||||
[Content] public SplineComputer.SampleMode MySampleMode = default;
|
||||
[Content] public Spline.Type MyType = default;
|
||||
|
||||
public bool IsClose = false;
|
||||
|
||||
public override IEnumerator LoadScript(string script)
|
||||
public SplineComputer MySplineComputer
|
||||
{
|
||||
get
|
||||
{
|
||||
if(m_MySplineComputer==null)
|
||||
m_MySplineComputer= GetComponent<SplineComputer>();
|
||||
return m_MySplineComputer;
|
||||
}
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// <see cref="SplineCore"/>需要在子<see cref="SplineNode"/>都添加后再应用脚本才能使得节点生效
|
||||
/// </summary>
|
||||
/// <returns></returns>
|
||||
protected override IEnumerator DoSomethingDuringApplyScript()
|
||||
{
|
||||
MySplineComputer = GetComponent<SplineComputer>();
|
||||
yield return base.LoadScript(script);
|
||||
yield return base.DoSomethingDuringApplyScript();
|
||||
NodeContent = 0;
|
||||
MySplineComputer.SetPoints(new SplinePoint[MySplineNodes.Count]);
|
||||
foreach (SplineNode node in MySplineNodes)
|
||||
@@ -86,13 +93,12 @@ namespace Demo.Game
|
||||
MySplineComputer.Break();
|
||||
MySplineComputer.sampleMode = MySampleMode;
|
||||
MySplineComputer.type = MyType;
|
||||
yield return null;
|
||||
MySplineComputer.Rebuild();
|
||||
}
|
||||
|
||||
protected override void UpdateTicks(float currentTime, float deltaTime, TickType tickType)
|
||||
{
|
||||
if (tickType == TickType.Start || tickType == TickType.Reset)
|
||||
if (tickType != TickType.Update)
|
||||
MySplineComputer.Rebuild();
|
||||
}
|
||||
|
||||
@@ -109,9 +115,9 @@ namespace Demo.Game
|
||||
/// </summary>
|
||||
/// <param name="mode">CatmullRom, BSpline, Bezier, Linear </param>
|
||||
[Convention.RScript.Variable.Attr.Method]
|
||||
public void SetType(string mode)
|
||||
public void SetType(Spline.Type mode)
|
||||
{
|
||||
MyType = Enum.Parse<Spline.Type>(mode);
|
||||
MyType = mode;
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
@@ -119,9 +125,9 @@ namespace Demo.Game
|
||||
/// </summary>
|
||||
/// <param name="mode">Default, Uniform, Optimized</param>
|
||||
[Convention.RScript.Variable.Attr.Method]
|
||||
public void SetSampleMode(string mode)
|
||||
public void SetSampleMode(SplineComputer.SampleMode mode)
|
||||
{
|
||||
MySampleMode = Enum.Parse<SplineComputer.SampleMode>(mode);
|
||||
MySampleMode = mode;
|
||||
}
|
||||
|
||||
|
||||
@@ -135,47 +141,13 @@ namespace Demo.Game
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// 加载并加入新节点
|
||||
/// 加入节点或者添加节点组件后加入节点
|
||||
/// </summary>
|
||||
/// <param name="path">脚本位置</param>
|
||||
[Convention.RScript.Variable.Attr.Method]
|
||||
public IEnumerator LoadNode(string path)
|
||||
{
|
||||
yield return DoLoadSubScriptAsync(nameof(SplineNode), path, node =>
|
||||
{
|
||||
if (node is SplineNode _node)
|
||||
{
|
||||
MySplineNodes.Add(_node);
|
||||
}
|
||||
else
|
||||
{
|
||||
Debug.LogError($"{path} is not {nameof(SplineNode)}", this);
|
||||
}
|
||||
});
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// 加入节点脚本对象
|
||||
/// </summary>
|
||||
[Convention.RScript.Variable.Attr.Method]
|
||||
public void AddNode(ScriptableObject node)
|
||||
public void LoadNode(ScriptableObject node)
|
||||
{
|
||||
MySplineNodes.Add(node.GetOrAddComponent<SplineNode>());
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// 加入已加载的节点,如果目标脚本不是SplineNode,
|
||||
/// 那么为其添加SplineNode组件
|
||||
/// </summary>
|
||||
/// <param name="path">脚本位置</param>
|
||||
[Convention.RScript.Variable.Attr.Method]
|
||||
public void AddNode(string path)
|
||||
{
|
||||
var node = FindWithPath(path);
|
||||
if (node != null)
|
||||
{
|
||||
AddNode(node);
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@@ -11,17 +11,22 @@ namespace Demo.Game
|
||||
return new GameObject("", typeof(Node)).AddComponent<SplineNode>();
|
||||
}
|
||||
|
||||
public Node MyNode;
|
||||
private Node m_MyNode;
|
||||
public float NodeSize = 1;
|
||||
public Color NodeColor = Color.white;
|
||||
public bool IsSetupNodeRotation = false;
|
||||
public Vector3 NodeRotation = Vector3.zero;
|
||||
public int MyNodeContent = 0;
|
||||
|
||||
public override IEnumerator LoadScript(string script)
|
||||
|
||||
public Node MyNode
|
||||
{
|
||||
MyNode = GetComponent<Node>();
|
||||
yield return base.LoadScript(script);
|
||||
get
|
||||
{
|
||||
if (m_MyNode == null)
|
||||
m_MyNode = GetComponent<Node>();
|
||||
return m_MyNode;
|
||||
}
|
||||
}
|
||||
|
||||
public void AddTo(SplineCore core)
|
||||
@@ -38,9 +43,9 @@ namespace Demo.Game
|
||||
/// </summary>
|
||||
/// <param name="size"></param>
|
||||
[Convention.RScript.Variable.Attr.Method]
|
||||
public void SetNodeSize(string size)
|
||||
public void SetNodeSize(float size)
|
||||
{
|
||||
NodeSize = Parse(size);
|
||||
NodeSize = size;
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
@@ -51,9 +56,9 @@ namespace Demo.Game
|
||||
/// <param name="b"></param>
|
||||
/// <param name="a"></param>
|
||||
[Convention.RScript.Variable.Attr.Method]
|
||||
public void SetNodeColor(string r, string g, string b, string a)
|
||||
public void SetNodeColor(float r, float g, float b, float a)
|
||||
{
|
||||
NodeColor = new(Parse(r), Parse(g), Parse(b), Parse(a));
|
||||
NodeColor = new(r, g, b, a);
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
@@ -63,10 +68,10 @@ namespace Demo.Game
|
||||
/// <param name="y"></param>
|
||||
/// <param name="z"></param>
|
||||
[Convention.RScript.Variable.Attr.Method]
|
||||
public void SetNodeRotation(string x, string y, string z)
|
||||
public void SetNodeRotation(float x, float y, float z)
|
||||
{
|
||||
IsSetupNodeRotation = true;
|
||||
this.transform.localEulerAngles = NodeRotation = new(Parse(x), Parse(y), Parse(z));
|
||||
this.transform.localEulerAngles = NodeRotation = new(x, y, z);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user