private void Update() { if (transform.localPosition != m_localPosition) { m_localPosition = transform.localPosition; if (m_spline != null) { m_spline.SetControlPointLocal(m_index, m_localPosition); } } }
private void Update() { if (m_spline == null) { return; } if (transform.localPosition != m_localPosition) { if (m_spline.SetControlPointLocal(m_index, transform.localPosition)) { m_localPosition = transform.localPosition; } else { transform.localPosition = m_localPosition; } } if (transform.rotation != m_rotation) { if (m_index % 3 == 0) { Vector3 v = Vector3.back; int prevIndex = m_index - 1; if (prevIndex < 0) { prevIndex = m_index + 1; v = Vector3.forward; } Vector3 prevPt = m_spline.GetControlPoint(prevIndex); Vector3 pt = m_spline.GetControlPoint(m_index); Vector3 toPrev = (transform.rotation * v).normalized * (pt - prevPt).magnitude; Twist twist = m_spline.GetTwist(m_index); m_rotation = transform.rotation; twist.Data = transform.eulerAngles.z; m_updateAngle = false; m_spline.SetTwist(m_index, twist); m_spline.SetControlPoint(prevIndex, pt + toPrev); m_updateAngle = true; } else { transform.rotation = m_rotation; } } Thickness thickness = m_spline.GetThickness(m_index); Vector3 thicknessData = thickness.Data; if (transform.localScale != thicknessData) { thickness.Data = transform.localScale; m_spline.SetThickness(m_index, thickness); } }
private void ShowPoint(int index, Vector3 point) { if (!CanShowPoint(index)) { return; } Handles.color = ModeColors[(int)m_splineBase.GetControlPointMode(index)]; if (index % 3 == 0) { Handles.color = Color.green; } float size = HandleUtility.GetHandleSize(point); Handles.DrawCapFunction dcf = Handles.DotCap; if (index == 0) { size *= 2f; } if (Handles.Button(point, m_handleRotation, size * HandleSize, size * PickSize, dcf)) { m_selectedIndex = index; SplineControlPoint controlPoint = m_splineBase.GetComponentsInChildren <SplineControlPoint>(true).Where(cpt => cpt.Index == index).FirstOrDefault(); if (controlPoint != null) { Selection.activeGameObject = controlPoint.gameObject; } Repaint(); } if (m_selectedIndex == index) { int curveIndex = (m_selectedIndex - 1) / 3; int prevCurveIndex = curveIndex - 1; int nextCurveIndex = curveIndex + 1; if (m_splineBase.Loop) { if (prevCurveIndex < 0) { prevCurveIndex = m_splineBase.CurveCount - 1; } if (nextCurveIndex > m_splineBase.CurveCount - 1) { nextCurveIndex = 0; } } GUIStyle style = new GUIStyle(); style.normal.textColor = Color.green; if (prevCurveIndex >= 0) { float prevLen = m_splineBase.EvalLength(prevCurveIndex); float prevCur = m_splineBase.EvalCurveLength(prevCurveIndex, GetStepsPerCurve()); Handles.Label(m_splineBase.GetPoint(0.5f, prevCurveIndex), string.Format("Len: {0:0.00} m, Cur: {1:0.00} m", prevLen, prevCur), style); } if (nextCurveIndex < m_splineBase.CurveCount) { float nextLen = m_splineBase.EvalLength(nextCurveIndex); float nextCur = m_splineBase.EvalCurveLength(nextCurveIndex, GetStepsPerCurve()); Handles.Label(m_splineBase.GetPoint(0.5f, nextCurveIndex), string.Format("Len: {0:0.00} m, Cur: {1:0.00} m", nextLen, nextCur), style); } float cur = m_splineBase.EvalCurveLength(curveIndex, GetStepsPerCurve()); float len = m_splineBase.EvalLength(curveIndex); Handles.Label(m_splineBase.GetPoint(0.5f, curveIndex), string.Format("Len: {0:0.00} m, Cur: {1:0.00} m", len, cur), style); EditorGUI.BeginChangeCheck(); point = Handles.DoPositionHandle(point, m_handleRotation); if (EditorGUI.EndChangeCheck()) { Undo.RecordObject(m_splineBase, UNDO_MOVEPOINT); EditorUtility.SetDirty(m_splineBase); m_splineBase.SetControlPointLocal(index, m_handleTransform.InverseTransformPoint(point)); } } }