using Convention; using Demo.Game.Attr; using Dreamteck.Splines; using System.Collections; using System.IO; using UnityEngine; namespace Demo.Game { namespace ConfigType { public class SplineNodeConfig : ScriptLoadableConfig { public float NodeSize = 1; public Color NodeColor = Color.white; public bool IsSetupNodeRotation = false; public Vector3 NodeRotation = Vector3.zero; public int[] LinkSplineCores; public override void Deserialize(BinaryReader reader) { NodeSize = BinarySerializeUtility.ReadFloat(reader); NodeColor = BinarySerializeUtility.ReadColor(reader); IsSetupNodeRotation = BinarySerializeUtility.ReadBool(reader); NodeRotation = BinarySerializeUtility.ReadVec3(reader); LinkSplineCores = BinarySerializeUtility.DeserializeIntArray(reader); base.Deserialize(reader); } public override void Serialize(BinaryWriter writer) { BinarySerializeUtility.WriteFloat(writer, NodeSize); BinarySerializeUtility.WriteColor(writer, NodeColor); BinarySerializeUtility.WriteBool(writer, IsSetupNodeRotation); BinarySerializeUtility.WriteVec3(writer, NodeRotation); BinarySerializeUtility.SerializeArray(writer, LinkSplineCores); base.Serialize(writer); } } } [Scriptable] public class SplineNode : ScriptableObject { protected override bool IsSelfEnableUpdate => false; public static SplineNode Make() { var node = new GameObject("", typeof(Node)).AddComponent(); node.m_MyNode = node.GetOrAddComponent(); return node; } private Node m_MyNode; public float NodeSize = 1; public Color NodeColor = Color.white; public bool IsSetupNodeRotation = false; public Vector3 NodeRotation = Vector3.zero; public Node MyNode => m_MyNode; public void AddTo(SplineCore core) { int MyNodeContent = core.NodeContent; core.MySplineComputer.SetPointColor(MyNodeContent, NodeColor); core.MySplineComputer.SetPointSize(MyNodeContent, NodeSize); core.MySplineComputer.SetPointNormal(MyNodeContent, IsSetupNodeRotation ? NodeRotation.normalized : transform.up); MyNode.AddConnection(core.MySplineComputer, MyNodeContent); } /// /// 设置节点大小,默认为1 /// /// [Convention.RScript.Variable.Attr.Method] public void SetNodeSize(float size) { NodeSize = size; } /// /// 设置节点颜色,默认为(1,1,1,1) /// /// /// /// /// [Convention.RScript.Variable.Attr.Method] public void SetNodeColor(float r, float g, float b, float a) { NodeColor = new(r, g, b, a); } /// /// 设置节点旋转,节点正面forward向量为法线 /// /// /// /// [Convention.RScript.Variable.Attr.Method] public void SetNodeRotation(float x, float y, float z) { IsSetupNodeRotation = true; this.transform.localEulerAngles = NodeRotation = new(x, y, z); } } }