Пример #1
0
        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;
            }
        }
Пример #3
0
        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));
        }
Пример #4
0
        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));
        }
Пример #5
0
        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;
                    }
                }
            }
        }
Пример #6
0
        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);
            }
        }
Пример #7
0
 public ControlPointSetting(Twist twist, Thickness thickness)
 {
     Twist     = twist;
     Thickness = thickness;
 }