private void InitBezier() { if (BezierSpline == null) { BezierSpline = new GameObject().AddComponent <CatlikeBezierSpline>(); BezierSpline.transform.parent = null;//SpaceTimeParrametrs.Center; BezierSpline.transform.position = Vector3.zero; } if (BezierInitied) { return; } Debug.LogError("InitBezier"); BezierInitied = true; BezierSpline.points = new Vector3[Positions.Count * 3 - 2]; BezierSpline.modes = new CatlikeBezierControlPointMode[(int)Mathf.Ceil((BezierSpline.points.Length + 1) / 3f)]; for (int i = 0; i < Positions.Count; i++) { BezierSpline.SetControlPoint(i * 3, Positions[i].Position); Vector3 currenControllPointPos = Positions[i].Position; if (i != 0) { Vector3 preDirPos = BezierSpline.points[(i - 1) * 3 + 1]; BezierSpline.points[i * 3 - 1] = Vector3.Lerp(preDirPos, currenControllPointPos, 0.66f); } if (i != 0 && i != Positions.Count - 1) { Vector3 toNextCPDistance = Positions[i + 1].Position - currenControllPointPos; Vector3 prev = (currenControllPointPos - BezierSpline.points[i * 3 - 1]).normalized; BezierSpline.points[i * 3 + 1] = currenControllPointPos + (prev * (toNextCPDistance.magnitude / 3)); } } }
public override void OnInspectorGUI() { spline = target as CatlikeBezierSpline; EditorGUI.BeginChangeCheck(); bool loop = EditorGUILayout.Toggle("Loop", spline.Loop); if (EditorGUI.EndChangeCheck()) { Undo.RecordObject(spline, "Toggle Loop"); EditorUtility.SetDirty(spline); spline.Loop = loop; } if (selectedIndex >= 0 && selectedIndex < spline.ControlPointCount) { DrawSelectedPointInspector(); } if (GUILayout.Button("Add Curve")) { Undo.RecordObject(spline, "Add Curve"); spline.AddCurve(); EditorUtility.SetDirty(spline); } }
private void OnSceneGUI() { spline = target as CatlikeBezierSpline; handleTransform = spline.transform; handleRotation = Tools.pivotRotation == PivotRotation.Local ? handleTransform.rotation : Quaternion.identity; Vector3 p0 = ShowPoint(0); for (int i = 1; i < spline.ControlPointCount; i += 3) { Vector3 p1 = ShowPoint(i); Vector3 p2 = ShowPoint(i + 1); Vector3 p3 = ShowPoint(i + 2); Handles.color = Color.gray; Handles.DrawLine(p0, p1); Handles.DrawLine(p2, p3); Handles.DrawBezier(p0, p3, p1, p2, Color.white, null, 2f); p0 = p3; } ShowDirections(); }