public float GetPathPercentageAtPoint(CameraPathBezierControlPoint point) { List <CameraPathBezierControlPoint> cps = new List <CameraPathBezierControlPoint>(_controlPoints); int index = cps.IndexOf(point); return(((float)index) / ((float)numberOfCurves)); }
//Delete a point in the path specified by the point itself. //deletePoint - component of the point //destroy - should the gameboject be destoryed? public void DeletePoint(CameraPathBezierControlPoint deletePoint, bool destroy) { List <CameraPathBezierControlPoint> rebuildList = new List <CameraPathBezierControlPoint>(_controlPoints); rebuildList.Remove(deletePoint); _controlPoints = rebuildList.ToArray(); if (destroy) { DestroyImmediate(deletePoint.gameObject); } RecalculateStoredValues(); }
//Add a new control point specified by the index of where you want to place it. public void AddNewPoint(int index) { GameObject newPoint = new GameObject("Control Point"); newPoint.transform.parent = transform; if (numberOfControlPoints == 0) { newPoint.transform.localPosition = Vector3.zero; } else if (numberOfControlPoints == 1) { newPoint.transform.localPosition = _controlPoints[0].transform.rotation * Vector3.forward * 5.0f; } else { if (index < numberOfControlPoints) //place point within the path { CameraPathBezierControlPoint pointA = _controlPoints[Mathf.Clamp(index - 1, 0, numberOfUseablePoints)]; CameraPathBezierControlPoint pointB = _controlPoints[Mathf.Clamp(index, 0, numberOfUseablePoints)]; Debug.Log(pointA.name + " " + pointB.name); Vector3 p0 = pointA.transform.position; Vector3 p1 = pointA.worldControlPoint; Vector3 p2 = pointB.worldControlPoint; Vector3 p3 = pointB.transform.position; newPoint.transform.position = CalculateBezierPoint(0.5f, p0, p1, p2, p3); Quaternion p = _controlPoints[Mathf.Clamp(index - 2, 0, numberOfUseablePoints)].transform.rotation; Quaternion q = _controlPoints[Mathf.Clamp(index - 1, 0, numberOfUseablePoints)].transform.rotation; Quaternion a = _controlPoints[Mathf.Clamp(index, 0, numberOfUseablePoints)].transform.rotation; Quaternion b = _controlPoints[Mathf.Clamp(index + 1, 0, numberOfUseablePoints)].transform.rotation; newPoint.transform.rotation = CalculateCubicRotation(p, a, b, q, 0.5f); } else { //place point at the end of the path Vector3 endDirection = (GetPathPosition(1.0f) - GetPathPosition(0.95f)).normalized; newPoint.transform.position = _controlPoints[index - 1].transform.position + endDirection * 5.0f; newPoint.transform.rotation = _controlPoints[index - 1].transform.rotation; } } CameraPathBezierControlPoint cpScript = newPoint.AddComponent <CameraPathBezierControlPoint>(); cpScript.name = "control point " + index; cpScript.bezier = this; List <CameraPathBezierControlPoint> rebuildList = new List <CameraPathBezierControlPoint>(_controlPoints); rebuildList.Insert(index, cpScript); _controlPoints = rebuildList.ToArray(); RecalculateStoredValues(); }
//Delete a point in the path specified by the point index. //index - cthe index in point array to delete //destroy - should the gameboject be destoryed? public void DeletePoint(int index, bool destroy) { List <CameraPathBezierControlPoint> rebuildList = new List <CameraPathBezierControlPoint>(_controlPoints); CameraPathBezierControlPoint deletePoint = rebuildList[index]; rebuildList.RemoveAt(index); _controlPoints = new CameraPathBezierControlPoint[rebuildList.Count]; _controlPoints = rebuildList.ToArray(); if (destroy) { DestroyImmediate(deletePoint.gameObject); } RecalculateStoredValues(); }
public float GetPathPercentageAtPoint(CameraPathBezierControlPoint point) { List<CameraPathBezierControlPoint> cps = new List<CameraPathBezierControlPoint>(_controlPoints); int index = cps.IndexOf(point); return ((float)index) / ((float)numberOfCurves); }
//Delete a point in the path specified by the point itself. //deletePoint - component of the point //destroy - should the gameboject be destoryed? public void DeletePoint(CameraPathBezierControlPoint deletePoint, bool destroy) { List<CameraPathBezierControlPoint> rebuildList = new List<CameraPathBezierControlPoint>(_controlPoints); rebuildList.Remove(deletePoint); _controlPoints = rebuildList.ToArray(); if (destroy) DestroyImmediate(deletePoint.gameObject); RecalculateStoredValues(); }
public override void OnInspectorGUI() { CameraPathBezier bezier = (CameraPathBezier)target; int numberOfControlPoints = bezier.numberOfControlPoints; if (numberOfControlPoints > 0) { if (numberOfControlPoints > 1) { GUILayout.Space(10); bezier.lineColour = EditorGUILayout.ColorField("Line Colour", bezier.lineColour); GUILayout.Space(5); bezier.mode = (CameraPathBezier.viewmodes)EditorGUILayout.EnumPopup("Camera Mode", bezier.mode); GUILayout.Space(5); if (bezier.mode == CameraPathBezier.viewmodes.target) { if (bezier.target == null) { EditorGUILayout.HelpBox("No target has been specified in the bezier path", MessageType.Warning); } EditorGUILayout.BeginHorizontal(); EditorGUILayout.LabelField("Look at Target"); bezier.target = (Transform)EditorGUILayout.ObjectField(bezier.target, typeof(Transform), true); EditorGUILayout.EndHorizontal(); GUILayout.Space(5); } bool newValue = EditorGUILayout.Toggle("Loop", bezier.loop); if (newValue != bezier.loop) { Undo.RecordObject(bezier, "Set Loop"); bezier.loop = newValue; bezier.RecalculateStoredValues(); } } else { if (numberOfControlPoints == 1) { EditorGUILayout.HelpBox("Click Add New Point to add additional points, you need at least two points to make a path.", MessageType.Info); } } GUILayout.Space(5); if (GUILayout.Button("Reset Path")) { if (EditorUtility.DisplayDialog("Resetting path?", "Are you sure you want to delete all control points?", "Delete", "Cancel")) { //Undo.RegisterSceneUndo("Reset Camera Path"); bezier.ResetPath(); return; } } GUILayout.Space(10); GUILayout.Box(EditorGUIUtility.whiteTexture, GUILayout.Height(2), GUILayout.Width(Screen.width - 20)); GUILayout.Space(3); //scrollPosition = EditorGUILayout.BeginScrollView(scrollPosition); for (int i = 0; i < numberOfControlPoints; i++) { CameraPathBezierControlPoint go = bezier.controlPoints[i]; if (go == null) { go = (CameraPathBezierControlPoint)EditorGUILayout.ObjectField(null, typeof(CameraPathBezierControlPoint), true); } else { go = (CameraPathBezierControlPoint)EditorGUILayout.ObjectField(go.name, go, typeof(CameraPathBezierControlPoint), true); } EditorGUILayout.BeginHorizontal(); if (GUILayout.Button("Delete")) { //Undo.RegisterSceneUndo("Delete Camera Path point"); bezier.DeletePoint(i, true); numberOfControlPoints = bezier.numberOfControlPoints; EditorUtility.SetDirty(bezier); return; } if (i == numberOfControlPoints - 1) { if (GUILayout.Button("Add New Point At End")) { //Undo.RegisterSceneUndo("Create a new Camera Path point"); bezier.AddNewPoint(i + 1); EditorUtility.SetDirty(bezier); } } else { if (GUILayout.Button("Add New Point Between")) { //Undo.RegisterSceneUndo("Create a new Camera Path point"); bezier.AddNewPoint(i + 1); EditorUtility.SetDirty(bezier); } } EditorGUILayout.EndHorizontal(); GUILayout.Space(7); GUILayout.Box(EditorGUIUtility.whiteTexture, GUILayout.Height(2), GUILayout.Width(Screen.width - 25)); GUILayout.Space(7); } //EditorGUILayout.EndScrollView(); } else { if (GUILayout.Button("Add New Point At End")) { //Undo.RegisterSceneUndo("Create a new Camera Path point"); bezier.AddNewPoint(); EditorUtility.SetDirty(bezier); } EditorGUILayout.HelpBox("Click Add New Point to add points and begin the path, you will need two points to create a path.", MessageType.Info); } if (GUI.changed) { bezier.RecalculateStoredValues(); EditorUtility.SetDirty(bezier); } }
void OnEnable() { bezierControlPoint = (CameraPathBezierControlPoint)target; bezier = bezierControlPoint.bezier; animator = bezier.GetComponent<CameraPathBezierAnimator>(); }
void OnEnable() { bezierControlPoint = (CameraPathBezierControlPoint)target; bezier = bezierControlPoint.bezier; animator = bezier.GetComponent <CameraPathBezierAnimator>(); }