Files
Net.Like.Xue.Tokyo/Packages-Local/Net.BITKit.Bounds.Unity/AutoConnectSplines.cs

68 lines
2.1 KiB
C#
Raw Normal View History

2025-06-24 23:49:13 +08:00
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<SplineSimpleMerge>("Merge Splines");
void OnGUI()
{
if (GUILayout.Button("合并选中的 SplineComputer"))
{
MergeSplines();
}
}
void MergeSplines()
{
var list = new List<SplinePoint>();
foreach (var transform in Selection.transforms)
{
if (!transform.TryGetComponent<SplineComputer>(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<SplineComputer>();
newSpline.type = Spline.Type.Bezier;
newSpline.SetPoints(list.ToArray());
Debug.Log($"✅ 合并成功,生成 {list.Count} 个 SplinePoint");
}
}