public static void Create() { Camera sceneCam = SceneView.lastActiveSceneView.camera; Thickness thickness = new Thickness(Vector3.one, 0, 1); Twist twist = new Twist(0, 0, 1); Selection.activeGameObject = SplineEditor.CreateSpline(sceneCam.ViewportToWorldPoint(new Vector3(0.5f, 0.5f, 5f)), thickness, twist).gameObject; }
private void Spawn() { int index = 0; int nextIndex = index + 1; Twist twist = m_spline.GetTwist(index); Vector3 ptPrev = m_spline.GetControlPoint(index); Vector3 pt = m_spline.GetControlPoint(nextIndex); GameObject paperplaneGo = (GameObject)Instantiate(PaperplanePrefab, m_spline.GetPoint(0.0f), Quaternion.AngleAxis(twist.Data, pt - ptPrev) * Quaternion.LookRotation(pt - ptPrev)); SplineFollow splineFollow = paperplaneGo.GetComponent <SplineFollow>(); splineFollow.Spline = m_spline; if (!SmoothFollow.enabled) { SmoothFollow.SetTarget(paperplaneGo.transform); SmoothFollow.enabled = true; } }
public float GetTwist(float t, int curveIndex) { Twist current = m_settings[curveIndex].Twist; Twist next = m_settings[curveIndex + 1].Twist; float t1 = Mathf.Clamp01(current.T1); float t2 = Mathf.Clamp01(current.T2); if (t <= t1) { t = 0.0f; } else if (t >= t2) { t = 1.0f; } else { t = Mathf.Clamp01((t - t1) / (t2 - t1)); } return(Mathf.Lerp(current.Data, next.Data, t)); }
public void SetTwist(int index, Twist twist) { int settingIndex = (index + 1) / 3; m_settings[settingIndex].Twist = twist; if (m_loop) { if (settingIndex == m_settings.Length - 1) { m_settings[0] = m_settings[m_settings.Length - 1]; } else if (settingIndex == 0) { m_settings[m_settings.Length - 1] = m_settings[0]; } } #if UNITY_EDITOR m_persistentVersions[0]++; OnVersionChanged(); #endif OnCurveChanged(index, Math.Max(0, (index - 1) / 3)); }
public void UpdateAngle(bool forceUpdateAngle = false) { if (m_spline == null) { return; } Twist twist = m_spline.GetTwist(m_index); int cIndex = m_index % 3; if (cIndex == 0) { int prevIndex = m_index - 1; if (prevIndex > 0) { Vector3 ptPrev = m_spline.GetControlPoint(prevIndex); Vector3 pt = m_spline.GetControlPoint(m_index); m_rotation = Quaternion.AngleAxis(twist.Data, pt - ptPrev) * Quaternion.LookRotation(pt - ptPrev); transform.rotation = m_rotation; } else { int nextIndex = m_index + 1; Vector3 ptPrev = m_spline.GetControlPoint(m_index); Vector3 pt = m_spline.GetControlPoint(nextIndex); m_rotation = Quaternion.AngleAxis(twist.Data, pt - ptPrev) * Quaternion.LookRotation(pt - ptPrev); transform.rotation = m_rotation; } } else { bool updateAngle = true; #if UNITY_EDITOR if (UnityEditor.EditorWindow.focusedWindow == UnityEditor.SceneView.lastActiveSceneView) { if (Event.current == null || Event.current.type != EventType.mouseUp) { updateAngle = false; } } #endif if (updateAngle || forceUpdateAngle) { if (cIndex == 1) { int prevIndex = m_index - 1; Vector3 ptPrev = m_spline.GetControlPoint(prevIndex); Vector3 pt = m_spline.GetControlPoint(m_index); m_rotation = Quaternion.AngleAxis(twist.Data, pt - ptPrev) * Quaternion.LookRotation(pt - ptPrev); transform.rotation = m_rotation; } else { int nextIndex = m_index + 1; Vector3 ptPrev = m_spline.GetControlPoint(m_index); Vector3 pt = m_spline.GetControlPoint(nextIndex); m_rotation = Quaternion.AngleAxis(twist.Data, pt - ptPrev) * Quaternion.LookRotation(pt - ptPrev); transform.rotation = m_rotation; } } } }
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); } }
public ControlPointSetting(Twist twist, Thickness thickness) { Twist = twist; Thickness = thickness; }