using UnityEngine; using UnityEditor; using Dreamteck.Splines; using System.Collections.Generic; public class SplineSimpleMerge : EditorWindow { [MenuItem("Tools/Splines/Simple Merge Selected Splines")] static void ShowWindow() => GetWindow("Merge Splines"); void OnGUI() { if (GUILayout.Button("合并选中的 SplineComputer")) { MergeSplines(); } } void MergeSplines() { var list = new List(); foreach (var transform in Selection.transforms) { if (!transform.TryGetComponent(out var computer)) continue; var points = computer.GetPoints(); for (var i = 0; i < points.Length; i++) { var splinePoint = points[i]; // 如果不是第一个段的第一个点,需要平滑衔接前一个点 if (i == 0 && list.Count > 0) { var lastIndex = list.Count - 1; var last = list[lastIndex]; // 计算两点之间方向 Vector3 dir = (splinePoint.position - last.position).normalized; float distance = Vector3.Distance(splinePoint.position, last.position) * 0.5f; // 设置上一个点的 tangent 和当前点的 tangent2(对称方向) last.tangent2 = last.position + dir * distance; splinePoint.tangent = splinePoint.position - dir * distance; list[lastIndex] = last; // 更新修改过的前一个点 } list.Add(splinePoint); } } if (list.Count == 0) { Debug.LogWarning("未找到任何 SplineComputer!"); return; } // 创建新的合并轨道 var go = new GameObject("Spline_Merged_Simple"); var newSpline = go.AddComponent(); newSpline.type = Spline.Type.Bezier; newSpline.SetPoints(list.ToArray()); Debug.Log($"✅ 合并成功,生成 {list.Count} 个 SplinePoint"); } }