//private float optionsControlSize = 1.0f; public override void OnInspectorGUI() { LeanTweenPath path = target as LeanTweenPath; pos = path.transform.position; if( icon == null ){ icon = new Texture2D(1,1); icon.hideFlags = HideFlags.HideAndDontSave; icon.LoadImage( System.Convert.FromBase64String( iconString ) ); } Rect editorRect = EditorGUILayout.GetControlRect(); GUI.DrawTexture( new Rect(16, editorRect.y - 16, icon.width, icon.height) , icon ); EditorGUIUtility.labelWidth = 90f; LeanTweenPath.LeanTweenPathType pathTypeLast = path.pathType; path.pathType = (LeanTweenPath.LeanTweenPathType)EditorGUILayout.EnumPopup("Path Type", path.pathType); if(path.pathType!=pathTypeLast){ resetPath(); } EditorGUILayout.Separator(); bool isBezier = path.pathType == LeanTweenPath.LeanTweenPathType.bezier; int k; EditorGUILayout.BeginHorizontal(); GUI.color = LTEditor.shared.colorAddOn; path.creatorMaximized = EditorGUILayout.Foldout(path.creatorMaximized,"",LTEditor.shared.styleGroupFoldout); if(GUILayout.Button("Easy Path Creator", LTEditor.shared.styleGroupButton)) path.creatorMaximized = !path.creatorMaximized; EditorGUILayout.EndHorizontal(); if(path.creatorMaximized){ selectedCreate = (PathCreateType)EditorGUILayout.EnumPopup("Type to create:", selectedCreate ); optionsSize = EditorGUILayout.FloatField("Scale:", optionsSize); switch (selectedCreate) { case PathCreateType.RectangleRounded: optionsBevelSize = EditorGUILayout.Slider("Bevel Size:", optionsBevelSize, 0.0f,1.399f); break; case PathCreateType.Snake: optionsLength = EditorGUILayout.FloatField("Length:", optionsLength); break; case PathCreateType.Random: optionsLength = EditorGUILayout.FloatField("Length:", optionsLength); EditorGUILayout.LabelField("Min Range:", optionsRangeMin.ToString()); EditorGUILayout.LabelField("Max Range:", optionsRangeMax.ToString()); EditorGUILayout.MinMaxSlider(ref optionsRangeMin, ref optionsRangeMax, 0.0f, 10.0f); break; case PathCreateType.Circle: optionsSegments = closestSegment( EditorGUILayout.IntSlider("Segments:", optionsSegments, 4, MAX_SPLINES) ); break; case PathCreateType.Straight: optionsLength = EditorGUILayout.FloatField("Length:", optionsLength); optionsDirection = EditorGUILayout.Vector3Field("Direction:", optionsDirection); break; default: break; } if(isBezier && GUILayout.Button("Create New Path",LTEditor.shared.styleActionButton)){ // path.arraySize = count.intValue*4; switch (selectedCreate) { case PathCreateType.RectangleRounded: resetPath(); float b = optionsBevelSize; float n = 0.1f; addTo( new Vector3[]{ new Vector3(b,0f,0f),new Vector3(0f,0f,0f),new Vector3(0f,0f,0f),new Vector3(0f,b,0f) ,new Vector3(0f,b,0f),new Vector3(0f,b+n,0f),new Vector3(0f,3f-b-n,0f),new Vector3(0f,3f-b,0f) ,new Vector3(0f,3f-b,0f),new Vector3(0f,3f,0f),new Vector3(0f,3f,0f),new Vector3(b,3f,0f) ,new Vector3(b,3f,0f),new Vector3(3f-b-n,3f,0f),new Vector3(b+n,3f,0f),new Vector3(3f-b,3f,0f) ,new Vector3(3f-b,3f,0f),new Vector3(3f,3f,0f),new Vector3(3f,3f,0f),new Vector3(3f,3f-b,0f) ,new Vector3(3f,3f-b,0f),new Vector3(3f,b+n,0f),new Vector3(3f,b+n,0f),new Vector3(3f,b,0f) ,new Vector3(3f,b,0f),new Vector3(3f,0f,0f),new Vector3(3f,0f,0f),new Vector3(3f-b,0f,0f) ,new Vector3(3f-b,0f,0f),new Vector3(3f-b-n,0f,0f),new Vector3(b+n,0f,0f),new Vector3(b,0f,0f) } ); break; case PathCreateType.Snake: resetPath(); path.path = new Vector3[ (int)optionsLength*4 ]; k = 0; for(int i=0; i < path.path.Length; i++){ Vector3 vec3 = pos + new Vector3(k*optionsSize,0f,k*optionsSize); if(i%4==1){ vec3.x += 1*optionsSize; } if(i%4==2){ vec3.x += -1*optionsSize; } path.path[i] = vec3; if(i%2==0) k++; } break; case PathCreateType.Random: resetPath(); path.path = new Vector3[ (int)optionsLength*4 ]; k = 0; float rand = 0f; for(int i=0; i < path.path.Length; i++){ Vector3 vec3 = pos + new Vector3(k*optionsSize,0f,0f); if(i%4==1){ vec3.z += rand*optionsSize; } rand = Random.Range(optionsRangeMin,optionsRangeMax)*optionsSize; if(i%4==2){ vec3.z += -rand*optionsSize; } path.path[i] = vec3; if(i%2==0) k++; } break; case PathCreateType.Circle: resetPath(); //count.intValue = optionsSegments; Vector3[] v = generateCircularQuadraticBezierSegments(optionsSize,optionsSegments); //Debug.Log("v:"+v); addTo(v); break; case PathCreateType.Straight: resetPath(); path.path = new Vector3[ (int)optionsLength*4 ]; k = 0; for(int i=0; i < path.path.Length; i++){ path.path[i] = pos + k*optionsDirection*optionsSize; if(i%2==0) k++; } break; default: Debug.LogError("Unrecognized Option"); break; } } } EditorGUILayout.Separator(); EditorGUILayout.BeginHorizontal(); GUI.color = LTEditor.shared.colorGroupName; path.nodesMaximized = EditorGUILayout.Foldout(path.nodesMaximized,"",LTEditor.shared.styleGroupFoldout); if(GUILayout.Button("Nodes", LTEditor.shared.styleGroupButton)) path.nodesMaximized = !path.nodesMaximized; GUI.color = LTEditor.shared.colorDelete; bool deleted = GUILayout.Button("Clear All", LTEditor.shared.styleClearAllButton); if(deleted) resetPath(); EditorGUILayout.EndHorizontal(); k = 0; int j = 0; for(int i = 0; i < path.pts.Length && path.nodesMaximized; i++){ GUI.contentColor = LTEditor.shared.colorGroupName; Transform t = path.pts[i]; GUI.color = Color.white; if(t==null){ //EditorGUILayout.LabelField("Nothing here "+i); }else{ EditorGUILayout.BeginHorizontal(); string label; bool isPoint = true; if(isBezier){ isPoint = i==0||i%4==3; if(isPoint){ label = " Node"+j; j++; k = 0; }else{ label = " - Control"+k; k++; } }else{ label = " Node"+i; } Vector3 position = EditorGUILayout.Vector3Field(label, t.localPosition); if (GUI.changed){ Undo.RecordObject(t, "Transform Change "+t.gameObject.name); t.localPosition = FixIfNaN(position); } GUI.contentColor = Color.white; if(isPoint && i!=0){ GUI.color = LTEditor.shared.colorDelete; if( GUILayout.Button("Delete", LTEditor.shared.styleDeleteButton) ){ Undo.RecordObject(t, "Deleted Node "+t.gameObject.name); GameObject.DestroyImmediate(t.gameObject); // Debug.Log("before delete:"+path.count); path.count += isBezier ? -4 : -1; // Debug.Log("after:"+path.count); SceneView.RepaintAll(); } }else{ GUI.color = Color.white*0f; if( GUILayout.Button("Delete", LTEditor.shared.styleDeleteButton) ){ Debug.Log("does nothing"); } } EditorGUILayout.EndHorizontal(); } } GUI.color = LTEditor.shared.colorAddTween; GUILayout.BeginHorizontal(); GUILayout.FlexibleSpace(); if(GUILayout.Button("+ Node", GUILayout.Width(60))){ path.count += isBezier ? 4 : 1; SceneView.RepaintAll(); } GUILayout.EndHorizontal(); EditorGUILayout.Separator(); GUI.color = Color.white; if(GUILayout.Button("Reverse Path Direction")){ Vector3[] newPath = new Vector3[ path.pts.Length ]; for(int i=0; i < newPath.Length; i++){ // Debug.Log("pt at:"+(newPath.Length-i-1)+ " len:"+newPath.Length); Transform trans = path.pts[newPath.Length-i-1]; if(trans==null) trans = path.pts[newPath.Length-i-2]; newPath[i] = trans.position; } for(int i=0; i < path.pts.Length; i++){ if(path.pts[i]){ path.pts[i].position = newPath[i]; } } } float controlSizeBefore = path.controlSize; path.controlSize = EditorGUILayout.FloatField("Control Size", path.controlSize); if(path.controlSize!=controlSizeBefore) SceneView.RepaintAll(); // EditorGUILayout.LabelField("Count: "+path.count ); EditorGUILayout.Separator(); EditorGUILayout.Separator(); if(isBezier){ EditorGUILayout.LabelField("Import/Export", EditorStyles.boldLabel ); EditorGUILayout.BeginHorizontal(GUILayout.Width(200)); EditorGUILayout.LabelField("Code Type", GUILayout.Width(80) ); generateCode = EditorGUILayout.Popup( generateCode, new string[]{"C#","Unityscript"},GUILayout.Width(80)); EditorGUILayout.EndHorizontal(); if(generateCode!=generateCodeLast){ string codeFormat = generateCode==0 ? "new Vector3[]{ new Vector3(0f,0f,0f), ... }" : "[ Vector3(0.0,0.0,0.0), ... ]"; importArrValue = "Paste in format: "+codeFormat; generateCodeLast = generateCode; } EditorGUILayout.LabelField("Export:"); if(Application.isPlaying==false){ string outputStr; if(generateCode==0){ outputStr = "new Vector3[]{ "; for(int i=0; i < path.pts.Length; i++){ Transform trans = i>3 && i%4==0 ? path.pts[i-1] : path.pts[i]; if(trans!=null){ outputStr += "new Vector3("+trans.localPosition.x+"f,"+trans.localPosition.y+"f,"+trans.localPosition.z+"f)"; if(i<path.pts.Length-1) outputStr += ", "; } } outputStr += " }"; }else{ outputStr = "["; for(int i=0; i < path.pts.Length; i++){ Transform trans = i>3 && i%4==0 ? path.pts[i-1] : path.pts[i]; if(trans!=null){ outputStr += "Vector3("+trans.localPosition.x+","+trans.localPosition.y+","+trans.localPosition.z+")"; if(i<path.pts.Length-1) outputStr += ", "; } } outputStr += "]"; } scrollCodeViewPos = EditorGUILayout.BeginScrollView(scrollCodeViewPos, GUILayout.Height(70) ); EditorGUILayout.TextArea( outputStr, LTEditor.shared.styleCodeTextArea ); EditorGUILayout.EndScrollView(); }else{ EditorGUILayout.LabelField(" Not available during runtime"); } EditorGUILayout.LabelField("Import:"); importArrValue = EditorGUILayout.TextArea( importArrValue, LTEditor.shared.styleCodeTextArea ); GUILayout.BeginHorizontal(); GUILayout.FlexibleSpace(); if(GUILayout.Button(" Import Path ")){ // Debug.Log("index:"+importArrValue.IndexOf("Paste")+" val:"+importArrValue); if(importArrValue.IndexOf("Paste") < 0){ // Debug.Log("Importing"); string subImport = ""; if(generateCode==0){ int start = importArrValue.IndexOf("{"); int end = importArrValue.IndexOf("}"); if(start<0){ Debug.LogError("No starting bracket'{'"); }else if(end<0){ Debug.LogError("No ending bracket'}'"); }else{ subImport = importArrValue.Substring(start+1,end-1-start).Trim(); // Debug.Log("broken down importedArr:"+subImport); } }else{ int start = importArrValue.IndexOf("["); int end = importArrValue.IndexOf("]"); if(start<0){ Debug.LogError("No starting bracket'['"); }else if(end<0){ Debug.LogError("No ending bracket']'"); }else{ subImport = importArrValue.Substring(start+1,end-1-start).Trim(); // Debug.Log("broken down importedArr:"+subImport); } } string[] stringArr = subImport.Split(new string[]{"Vector3"}, System.StringSplitOptions.RemoveEmptyEntries); int len = generateCode==0 ? (stringArr.Length-1) : stringArr.Length; // Debug.Log("importing length:"+len); resetPath(); path.path = new Vector3[ len ]; k = 0; for(int i = 0; i < stringArr.Length; i++){ int start = stringArr[i].IndexOf("("[0]); int end = stringArr[i].IndexOf(")"[0]); // Debug.Log("i:"+i+" start:"+start+" end:"+end); if(start>=0 && end>0){ string vecStr = stringArr[i].Substring(start+1,end-1-start); // Debug.Log("vec:"+vecStr); string[] numArr = vecStr.Split(","[0]); for(j = 0; j < numArr.Length; j++){ if(numArr[j].IndexOf("("[0])>=0){ start = numArr[j].IndexOf("("[0]); numArr[j] = numArr[j].Substring(start+1); }else if(numArr[j].IndexOf(")"[0])>=0){ end = numArr[j].IndexOf(")"[0]); numArr[j] = numArr[j].Substring(0,end); } if(numArr[j].IndexOf("f"[0])>=0){ end = numArr[j].IndexOf("f"[0]); numArr[j] = numArr[j].Substring(0,end); } // Debug.Log("num:"+numArr[j]); } Vector3 vec3 = new Vector3(float.Parse(numArr[0]),float.Parse(numArr[1]),float.Parse(numArr[2])); path.path[k] = vec3; // Debug.Log("importing vec3:"+vec3); k++; } } } } GUILayout.EndHorizontal(); } }
//private float optionsControlSize = 1.0f; public override void OnInspectorGUI() { LeanTweenPath path = target as LeanTweenPath; pos = path.transform.position; GUI.DrawTexture(new Rect(16, EditorGUILayout.GetControlRect().y - 16, 16, 16), LTEditor.EditorIcon()); EditorGUIUtility.labelWidth = 90f; EditorGUILayout.LabelField("Settings", EditorStyles.boldLabel); EditorGUILayout.BeginHorizontal(); LeanTweenPath.LeanTweenPathType pathTypeLast = path.pathType; GUI.color = LTEditor.Shared.colorRefresh; path.pathType = (LeanTweenPath.LeanTweenPathType)EditorGUILayout.EnumPopup("Path Type", path.pathType); if (path.pathType != pathTypeLast) { Undo.RecordObject(path, "changing path type"); resetPath(); } bool isBezier = path.pathType == LeanTweenPath.LeanTweenPathType.bezier; EditorGUILayout.Space(); float controlSizeBefore = path.controlSize; GUI.color = Color.white; LTVisualShared.change(ref path.controlSize, EditorGUILayout.FloatField("Controls Size", path.controlSize, GUILayout.Width(120)), path, "changing control size"); if (path.controlSize != controlSizeBefore) { SceneView.RepaintAll(); } EditorGUILayout.EndHorizontal(); LTVisualShared.change(ref path.showArrows, EditorGUILayout.Toggle("Show Arrows", path.showArrows), path, "changing show arrows"); EditorGUILayout.Space(); GUI.color = LTEditor.Shared.colorRefresh; EditorGUILayout.Space(); EditorGUILayout.BeginHorizontal(); if (GUILayout.Button("Reverse Direction", LTEditor.Shared.styleActionButton)) { Undo.RecordObject(path, "reversing direction"); Vector3[] newPath = new Vector3[path.pts.Length]; for (int i = 0; i < newPath.Length; i++) { // Debug.Log("pt at:"+(newPath.Length-i-1)+ " len:"+newPath.Length); Transform trans = path.pts[newPath.Length - i - 1]; if (trans == null) { trans = path.pts[newPath.Length - i - 2]; } newPath[i] = trans.position; } for (int i = 0; i < path.pts.Length; i++) { if (path.pts[i]) { path.pts[i].position = newPath[i]; } } } if (isBezier && GUILayout.Button("Easy Path Creator", LTEditor.Shared.styleActionButton)) { Undo.RecordObject(path, "expanding"); path.creatorMaximized = !path.creatorMaximized; } EditorGUILayout.Space(); EditorGUILayout.EndHorizontal(); EditorGUILayout.Separator(); EditorGUILayout.Separator(); int k; if (isBezier) { GUI.color = Color.white; EditorGUILayout.BeginHorizontal(); LTVisualShared.change(ref path.creatorMaximized, EditorGUILayout.Foldout(path.creatorMaximized, "Easy Path Creator", LTEditor.Shared.styleAreaFoldout), path, "creator maximized"); EditorGUILayout.EndHorizontal(); if (path.creatorMaximized) { selectedCreate = (PathCreateType)EditorGUILayout.EnumPopup("Type to create:", selectedCreate); LTVisualShared.change(ref optionsSize, EditorGUILayout.FloatField("Scale:", optionsSize), path, "change scale"); switch (selectedCreate) { case PathCreateType.RectangleRounded: optionsBevelSize = EditorGUILayout.Slider("Bevel Size:", optionsBevelSize, 0.0f, 1.399f); break; case PathCreateType.Snake: optionsLength = EditorGUILayout.FloatField("Length:", optionsLength); break; case PathCreateType.Random: optionsLength = EditorGUILayout.FloatField("Length:", optionsLength); EditorGUILayout.LabelField("Min Range:", optionsRangeMin.ToString()); EditorGUILayout.LabelField("Max Range:", optionsRangeMax.ToString()); EditorGUILayout.MinMaxSlider(ref optionsRangeMin, ref optionsRangeMax, 0.0f, 10.0f); break; case PathCreateType.Circle: optionsSegments = closestSegment(EditorGUILayout.IntSlider("Segments:", optionsSegments, 4, MAX_SPLINES)); break; case PathCreateType.Straight: optionsLength = EditorGUILayout.FloatField("Length:", optionsLength); optionsDirection = EditorGUILayout.Vector3Field("Direction:", optionsDirection); break; default: break; } GUI.color = LTEditor.Shared.colorRefresh; EditorGUILayout.BeginHorizontal(); GUILayout.FlexibleSpace(); if (GUILayout.Button("Create New Path", LTEditor.Shared.styleActionButton)) { Undo.RecordObject(path, "creating new path"); // path.arraySize = count.intValue*4; switch (selectedCreate) { case PathCreateType.RectangleRounded: resetPath(); float b = optionsBevelSize; float n = 0.1f; addTo(new Vector3[] { new Vector3(b, 0f, 0f), new Vector3(0f, 0f, 0f), new Vector3(0f, 0f, 0f), new Vector3(0f, b, 0f) , new Vector3(0f, b, 0f), new Vector3(0f, b + n, 0f), new Vector3(0f, 3f - b - n, 0f), new Vector3(0f, 3f - b, 0f) , new Vector3(0f, 3f - b, 0f), new Vector3(0f, 3f, 0f), new Vector3(0f, 3f, 0f), new Vector3(b, 3f, 0f) , new Vector3(b, 3f, 0f), new Vector3(3f - b - n, 3f, 0f), new Vector3(b + n, 3f, 0f), new Vector3(3f - b, 3f, 0f) , new Vector3(3f - b, 3f, 0f), new Vector3(3f, 3f, 0f), new Vector3(3f, 3f, 0f), new Vector3(3f, 3f - b, 0f) , new Vector3(3f, 3f - b, 0f), new Vector3(3f, b + n, 0f), new Vector3(3f, b + n, 0f), new Vector3(3f, b, 0f) , new Vector3(3f, b, 0f), new Vector3(3f, 0f, 0f), new Vector3(3f, 0f, 0f), new Vector3(3f - b, 0f, 0f) , new Vector3(3f - b, 0f, 0f), new Vector3(3f - b - n, 0f, 0f), new Vector3(b + n, 0f, 0f), new Vector3(b, 0f, 0f) }); break; case PathCreateType.Snake: resetPath(); path.path = new Vector3[(int)optionsLength * 4]; k = 0; for (int i = 0; i < path.path.Length; i++) { Vector3 vec3 = pos + new Vector3(k * optionsSize, 0f, k * optionsSize); if (i % 4 == 1) { vec3.x += 1 * optionsSize; } if (i % 4 == 2) { vec3.x += -1 * optionsSize; } path.path[i] = vec3; if (i % 2 == 0) { k++; } } break; case PathCreateType.Random: resetPath(); path.path = new Vector3[(int)optionsLength * 4]; k = 0; float rand = 0f; for (int i = 0; i < path.path.Length; i++) { Vector3 vec3 = pos + new Vector3(k * optionsSize, 0f, 0f); if (i % 4 == 1) { vec3.z += rand * optionsSize; } rand = Random.Range(optionsRangeMin, optionsRangeMax) * optionsSize; if (i % 4 == 2) { vec3.z += -rand * optionsSize; } path.path[i] = vec3; if (i % 2 == 0) { k++; } } break; case PathCreateType.Circle: resetPath(); //count.intValue = optionsSegments; Vector3[] v = generateCircularQuadraticBezierSegments(optionsSize, optionsSegments); //Debug.Log("v:"+v); addTo(v); break; case PathCreateType.Straight: resetPath(); path.path = new Vector3[(int)optionsLength * 4]; k = 0; for (int i = 0; i < path.path.Length; i++) { path.path[i] = pos + k * optionsDirection * optionsSize; if (i % 2 == 0) { k++; } } break; default: Debug.LogError("Unrecognized Option"); break; } } EditorGUILayout.EndHorizontal(); EditorGUILayout.Space(); } // end if creatorMaximized } // end if isBezier EditorGUILayout.BeginHorizontal(); GUI.color = LTEditor.Shared.colorRefresh; LTVisualShared.change(ref path.nodesMaximized, EditorGUILayout.Foldout(path.nodesMaximized, "Nodes (" + path.count + ")", LTEditor.Shared.styleAreaFoldout), path, "nodes maximized"); //if(GUILayout.Button("Nodes", LTEditor.shared.styleGroupButton)) // path.nodesMaximized = !path.nodesMaximized; if (path.nodesMaximized) { if (isBezier) { bool refresh = GUILayout.Button("Refresh", GUILayout.Width(65), GUILayout.Height(22)); if (refresh) { Undo.RecordObject(path, "path refreshed"); Vector3[] from = path.vec3; path.path = new Vector3[from.Length]; for (int i = 0; i < from.Length; i++) { path.path[i] = from[i] - pos; } resetPath(); } } GUI.color = LTEditor.Shared.colorDestruct; bool deleted = GUILayout.Button("Delete All", GUILayout.Width(80), GUILayout.Height(22)); if (deleted) { Undo.RecordObject(path, "deleting all"); resetPath(); } } EditorGUILayout.EndHorizontal(); GUI.color = Color.white; if (path.nodesMaximized) { EditorGUILayout.Space(); bool needsPathScroll = path.pts.Length > 8; if (needsPathScroll) { scrollPathsViewPos = EditorGUILayout.BeginScrollView(scrollPathsViewPos, GUILayout.Height(150)); } k = 0; int j = 0; for (int i = 0; i < path.pts.Length; i++) { Transform t = path.pts[i]; GUI.color = LTEditor.Shared.colorNodes; if (t == null) { //EditorGUILayout.LabelField("Nothing here "+i); } else { EditorGUILayout.BeginHorizontal(); string label; bool isControl = true; if (isBezier) { isControl = i == 0 || i % 4 == 3; if (isControl) { label = " Node" + (j + 1); j++; k = 0; } else { label = " - Control" + k; k++; } } else { label = " Node" + i; } Vector3 position = EditorGUILayout.Vector3Field(label, t.localPosition); if (GUI.changed) { Undo.RecordObject(t, "Transform Change " + t.gameObject.name); t.localPosition = FixIfNaN(position); } if (isControl) { GUI.color = LTEditor.Shared.colorAdd; if (GUILayout.Button("+", LTEditor.Shared.styleOneCharButton)) { //Debug.Log("path.pts:"+path.pts); Undo.RecordObject(path, "adding new node"); path.addNodeAfter(i); SceneView.RepaintAll(); scrollPathsSetToEnd = 2; } if (i == 0) { GUI.color = Color.white * 0f; GUILayout.Button("X", LTEditor.Shared.styleOneCharButton); } GUI.color = LTEditor.Shared.colorDestruct; if (i != 0 && GUILayout.Button("X", LTEditor.Shared.styleOneCharButton)) { Undo.RecordObject(t, "Deleted Node " + t.gameObject.name); path.deleteNode(i); // Debug.Log("after:"+path.count); SceneView.RepaintAll(); } } else { GUI.color = Color.white * 0f; GUILayout.Button("X", LTEditor.Shared.styleOneCharButton); GUILayout.Button("X", LTEditor.Shared.styleOneCharButton); } EditorGUILayout.EndHorizontal(); } } if (needsPathScroll) { EditorGUILayout.EndScrollView(); } if (scrollPathsSetToEnd > 0) { scrollPathsSetToEnd--; scrollPathsViewPos = new Vector2(0, 10000f); } GUI.color = LTEditor.Shared.colorAdd; GUILayout.BeginHorizontal(); GUILayout.FlexibleSpace(); if (GUILayout.Button("+ Node", LTEditor.Shared.styleActionButton)) { Undo.RecordObject(path, "adding new node"); path.addNode(); SceneView.RepaintAll(); scrollPathsSetToEnd = 2; } GUILayout.EndHorizontal(); } GUI.color = Color.white; path.importMaximized = EditorGUILayout.Foldout(path.importMaximized, "Import/Export", LTEditor.Shared.styleAreaFoldout); if (path.importMaximized) { EditorGUILayout.BeginHorizontal(GUILayout.Width(160)); EditorGUILayout.LabelField("Code Type", GUILayout.Width(80)); generateCode = EditorGUILayout.Popup(generateCode, new string[] { "C#", "Unityscript" }, GUILayout.Width(80)); EditorGUILayout.EndHorizontal(); if (generateCode != generateCodeLast) { string codeFormat = generateCode == 0 ? "new Vector3[]{ new Vector3(0f,0f,0f), ... }" : "[ Vector3(0.0,0.0,0.0), ... ]"; importArrValue = "Paste in format: " + codeFormat; generateCodeLast = generateCode; } EditorGUILayout.LabelField("Exported:", EditorStyles.boldLabel); if (Application.isPlaying == false) { string outputStr; if (generateCode == 0) { outputStr = "new Vector3[]{ "; for (int i = 0; i < path.pts.Length; i++) { Transform trans = path.pts[i]; if (isBezier) { trans = i > 3 && i % 4 == 0 ? path.pts[i - 1] : path.pts[i]; } if (trans != null) { outputStr += "new Vector3(" + trans.position.x + "f," + trans.position.y + "f," + trans.position.z + "f)"; if (i < path.pts.Length - 1) { outputStr += ", "; } } } outputStr += " }"; } else { outputStr = "["; for (int i = 0; i < path.pts.Length; i++) { Transform trans = path.pts[i]; if (isBezier) { trans = i > 3 && i % 4 == 0 ? path.pts[i - 1] : path.pts[i]; } if (trans != null) { outputStr += "Vector3(" + trans.position.x + "," + trans.position.y + "," + trans.position.z + ")"; if (i < path.pts.Length - 1) { outputStr += ", "; } } } outputStr += "]"; } scrollCodeViewPos = EditorGUILayout.BeginScrollView(scrollCodeViewPos, GUILayout.Height((int)Mathf.Min(70f, path.pts.Length * 7f))); EditorGUILayout.TextArea(outputStr, LTEditor.Shared.styleCodeTextArea); EditorGUILayout.EndScrollView(); } else { EditorGUILayout.LabelField(" Not available during runtime"); } EditorGUILayout.LabelField("Import:", EditorStyles.boldLabel); importArrValue = EditorGUILayout.TextArea(importArrValue, LTEditor.Shared.styleCodeTextArea); GUI.color = LTEditor.Shared.colorRefresh; GUILayout.BeginHorizontal(); GUILayout.FlexibleSpace(); if (GUILayout.Button("Import Path", LTEditor.Shared.styleActionButton)) { Undo.RecordObject(path, "imported new path"); // Debug.Log("index:"+importArrValue.IndexOf("Paste")+" val:"+importArrValue); if (importArrValue.IndexOf("Paste") < 0) { // Debug.Log("Importing"); string subImport = ""; int start = importArrValue.IndexOf("{"); int end = importArrValue.IndexOf("}"); bool cSharpFormat = start >= 0; if (cSharpFormat) { if (start < 0) { Debug.LogError("No starting bracket'{'"); } else if (end < 0) { Debug.LogError("No ending bracket'}'"); } else { subImport = importArrValue.Substring(start + 1, end - 1 - start).Trim(); // Debug.Log("broken down importedArr:"+subImport); } } else { start = importArrValue.IndexOf("["); end = importArrValue.IndexOf("]"); if (start < 0) { Debug.LogError("No starting bracket'['"); } else if (end < 0) { Debug.LogError("No ending bracket']'"); } else { subImport = importArrValue.Substring(start + 1, end - 1 - start).Trim(); // Debug.Log("broken down importedArr:"+subImport); } } string[] stringArr = subImport.Split(new string[] { "Vector3" }, System.StringSplitOptions.RemoveEmptyEntries); int len = cSharpFormat ? (stringArr.Length - 1) : stringArr.Length; // Debug.Log("importing length:"+len); resetPath(); path.path = new Vector3[len]; k = 0; for (int i = 0; i < stringArr.Length; i++) { start = stringArr[i].IndexOf("("[0]); end = stringArr[i].IndexOf(")"[0]); // Debug.Log("i:"+i+" start:"+start+" end:"+end); if (start >= 0 && end > 0) { string vecStr = stringArr[i].Substring(start + 1, end - 1 - start); // Debug.Log("vec:"+vecStr); string[] numArr = vecStr.Split(","[0]); for (int j = 0; j < numArr.Length; j++) { if (numArr[j].IndexOf("("[0]) >= 0) { start = numArr[j].IndexOf("("[0]); numArr[j] = numArr[j].Substring(start + 1); } else if (numArr[j].IndexOf(")"[0]) >= 0) { end = numArr[j].IndexOf(")"[0]); numArr[j] = numArr[j].Substring(0, end); } if (numArr[j].IndexOf("f"[0]) >= 0) { end = numArr[j].IndexOf("f"[0]); numArr[j] = numArr[j].Substring(0, end); } // Debug.Log("num:"+numArr[j]); } Vector3 vec3 = new Vector3(float.Parse(numArr[0]), float.Parse(numArr[1]), float.Parse(numArr[2])); Debug.Log("importing k:" + k + " vec3:" + vec3); path.path[k] = vec3; k++; } } } } GUILayout.EndHorizontal(); } }
//private float optionsControlSize = 1.0f; public override void OnInspectorGUI() { LeanTweenPath path = target as LeanTweenPath; pos = path.transform.position; if (icon == null) { icon = new Texture2D(1, 1); icon.hideFlags = HideFlags.HideAndDontSave; icon.LoadImage(System.Convert.FromBase64String(iconString)); } Rect editorRect = EditorGUILayout.GetControlRect(); GUI.DrawTexture(new Rect(16, editorRect.y - 16, icon.width, icon.height), icon); EditorGUIUtility.labelWidth = 90f; LeanTweenPath.LeanTweenPathType pathTypeLast = path.pathType; path.pathType = (LeanTweenPath.LeanTweenPathType)EditorGUILayout.EnumPopup("Path Type", path.pathType); if (path.pathType != pathTypeLast) { resetPath(); } EditorGUILayout.Separator(); bool isBezier = path.pathType == LeanTweenPath.LeanTweenPathType.bezier; int k; EditorGUILayout.BeginHorizontal(); GUI.color = LTEditor.shared.colorAddOn; path.creatorMaximized = EditorGUILayout.Foldout(path.creatorMaximized, "", LTEditor.shared.styleGroupFoldout); if (GUILayout.Button("Easy Path Creator", LTEditor.shared.styleGroupButton)) { path.creatorMaximized = !path.creatorMaximized; } EditorGUILayout.EndHorizontal(); if (path.creatorMaximized) { selectedCreate = (PathCreateType)EditorGUILayout.EnumPopup("Type to create:", selectedCreate); optionsSize = EditorGUILayout.FloatField("Scale:", optionsSize); switch (selectedCreate) { case PathCreateType.RectangleRounded: optionsBevelSize = EditorGUILayout.Slider("Bevel Size:", optionsBevelSize, 0.0f, 1.399f); break; case PathCreateType.Snake: optionsLength = EditorGUILayout.FloatField("Length:", optionsLength); break; case PathCreateType.Random: optionsLength = EditorGUILayout.FloatField("Length:", optionsLength); EditorGUILayout.LabelField("Min Range:", optionsRangeMin.ToString()); EditorGUILayout.LabelField("Max Range:", optionsRangeMax.ToString()); EditorGUILayout.MinMaxSlider(ref optionsRangeMin, ref optionsRangeMax, 0.0f, 10.0f); break; case PathCreateType.Circle: optionsSegments = closestSegment(EditorGUILayout.IntSlider("Segments:", optionsSegments, 4, MAX_SPLINES)); break; case PathCreateType.Straight: optionsLength = EditorGUILayout.FloatField("Length:", optionsLength); optionsDirection = EditorGUILayout.Vector3Field("Direction:", optionsDirection); break; default: break; } if (isBezier && GUILayout.Button("Create New Path", LTEditor.shared.styleActionButton)) { // path.arraySize = count.intValue*4; switch (selectedCreate) { case PathCreateType.RectangleRounded: resetPath(); float b = optionsBevelSize; float n = 0.1f; addTo(new Vector3[] { new Vector3(b, 0f, 0f), new Vector3(0f, 0f, 0f), new Vector3(0f, 0f, 0f), new Vector3(0f, b, 0f) , new Vector3(0f, b, 0f), new Vector3(0f, b + n, 0f), new Vector3(0f, 3f - b - n, 0f), new Vector3(0f, 3f - b, 0f) , new Vector3(0f, 3f - b, 0f), new Vector3(0f, 3f, 0f), new Vector3(0f, 3f, 0f), new Vector3(b, 3f, 0f) , new Vector3(b, 3f, 0f), new Vector3(3f - b - n, 3f, 0f), new Vector3(b + n, 3f, 0f), new Vector3(3f - b, 3f, 0f) , new Vector3(3f - b, 3f, 0f), new Vector3(3f, 3f, 0f), new Vector3(3f, 3f, 0f), new Vector3(3f, 3f - b, 0f) , new Vector3(3f, 3f - b, 0f), new Vector3(3f, b + n, 0f), new Vector3(3f, b + n, 0f), new Vector3(3f, b, 0f) , new Vector3(3f, b, 0f), new Vector3(3f, 0f, 0f), new Vector3(3f, 0f, 0f), new Vector3(3f - b, 0f, 0f) , new Vector3(3f - b, 0f, 0f), new Vector3(3f - b - n, 0f, 0f), new Vector3(b + n, 0f, 0f), new Vector3(b, 0f, 0f) }); break; case PathCreateType.Snake: resetPath(); path.path = new Vector3[(int)optionsLength * 4]; k = 0; for (int i = 0; i < path.path.Length; i++) { Vector3 vec3 = pos + new Vector3(k * optionsSize, 0f, k * optionsSize); if (i % 4 == 1) { vec3.x += 1 * optionsSize; } if (i % 4 == 2) { vec3.x += -1 * optionsSize; } path.path[i] = vec3; if (i % 2 == 0) { k++; } } break; case PathCreateType.Random: resetPath(); path.path = new Vector3[(int)optionsLength * 4]; k = 0; float rand = 0f; for (int i = 0; i < path.path.Length; i++) { Vector3 vec3 = pos + new Vector3(k * optionsSize, 0f, 0f); if (i % 4 == 1) { vec3.z += rand * optionsSize; } rand = Random.Range(optionsRangeMin, optionsRangeMax) * optionsSize; if (i % 4 == 2) { vec3.z += -rand * optionsSize; } path.path[i] = vec3; if (i % 2 == 0) { k++; } } break; case PathCreateType.Circle: resetPath(); //count.intValue = optionsSegments; Vector3[] v = generateCircularQuadraticBezierSegments(optionsSize, optionsSegments); //Debug.Log("v:"+v); addTo(v); break; case PathCreateType.Straight: resetPath(); path.path = new Vector3[(int)optionsLength * 4]; k = 0; for (int i = 0; i < path.path.Length; i++) { path.path[i] = pos + k * optionsDirection * optionsSize; if (i % 2 == 0) { k++; } } break; default: Debug.LogError("Unrecognized Option"); break; } } } EditorGUILayout.Separator(); EditorGUILayout.BeginHorizontal(); GUI.color = LTEditor.shared.colorGroupName; path.nodesMaximized = EditorGUILayout.Foldout(path.nodesMaximized, "", LTEditor.shared.styleGroupFoldout); if (GUILayout.Button("Nodes", LTEditor.shared.styleGroupButton)) { path.nodesMaximized = !path.nodesMaximized; } GUI.color = LTEditor.shared.colorDelete; bool deleted = GUILayout.Button("Clear All", LTEditor.shared.styleClearAllButton); if (deleted) { resetPath(); } EditorGUILayout.EndHorizontal(); k = 0; int j = 0; for (int i = 0; i < path.pts.Length && path.nodesMaximized; i++) { GUI.contentColor = LTEditor.shared.colorGroupName; Transform t = path.pts[i]; GUI.color = Color.white; if (t == null) { //EditorGUILayout.LabelField("Nothing here "+i); } else { EditorGUILayout.BeginHorizontal(); string label; bool isPoint = true; if (isBezier) { isPoint = i == 0 || i % 4 == 3; if (isPoint) { label = " Node" + j; j++; k = 0; } else { label = " - Control" + k; k++; } } else { label = " Node" + i; } Vector3 position = EditorGUILayout.Vector3Field(label, t.localPosition); if (GUI.changed) { Undo.RecordObject(t, "Transform Change " + t.gameObject.name); t.localPosition = FixIfNaN(position); } GUI.contentColor = Color.white; if (isPoint && i != 0) { GUI.color = LTEditor.shared.colorDelete; if (GUILayout.Button("Delete", LTEditor.shared.styleDeleteButton)) { Undo.RecordObject(t, "Deleted Node " + t.gameObject.name); GameObject.DestroyImmediate(t.gameObject); // Debug.Log("before delete:"+path.count); path.count += isBezier ? -4 : -1; // Debug.Log("after:"+path.count); SceneView.RepaintAll(); } } else { GUI.color = Color.white * 0f; if (GUILayout.Button("Delete", LTEditor.shared.styleDeleteButton)) { Debug.Log("does nothing"); } } EditorGUILayout.EndHorizontal(); } } GUI.color = LTEditor.shared.colorAddTween; GUILayout.BeginHorizontal(); GUILayout.FlexibleSpace(); if (GUILayout.Button("+ Node", GUILayout.Width(60))) { path.count += isBezier ? 4 : 1; SceneView.RepaintAll(); } GUILayout.EndHorizontal(); EditorGUILayout.Separator(); GUI.color = Color.white; if (GUILayout.Button("Reverse Path Direction")) { Vector3[] newPath = new Vector3[path.pts.Length]; for (int i = 0; i < newPath.Length; i++) { // Debug.Log("pt at:"+(newPath.Length-i-1)+ " len:"+newPath.Length); Transform trans = path.pts[newPath.Length - i - 1]; if (trans == null) { trans = path.pts[newPath.Length - i - 2]; } newPath[i] = trans.position; } for (int i = 0; i < path.pts.Length; i++) { if (path.pts[i]) { path.pts[i].position = newPath[i]; } } } float controlSizeBefore = path.controlSize; path.controlSize = EditorGUILayout.FloatField("Control Size", path.controlSize); if (path.controlSize != controlSizeBefore) { SceneView.RepaintAll(); } // EditorGUILayout.LabelField("Count: "+path.count ); EditorGUILayout.Separator(); EditorGUILayout.Separator(); if (isBezier) { EditorGUILayout.LabelField("Import/Export", EditorStyles.boldLabel); EditorGUILayout.BeginHorizontal(GUILayout.Width(200)); EditorGUILayout.LabelField("Code Type", GUILayout.Width(80)); generateCode = EditorGUILayout.Popup(generateCode, new string[] { "C#", "Unityscript" }, GUILayout.Width(80)); EditorGUILayout.EndHorizontal(); if (generateCode != generateCodeLast) { string codeFormat = generateCode == 0 ? "new Vector3[]{ new Vector3(0f,0f,0f), ... }" : "[ Vector3(0.0,0.0,0.0), ... ]"; importArrValue = "Paste in format: " + codeFormat; generateCodeLast = generateCode; } EditorGUILayout.LabelField("Export:"); if (Application.isPlaying == false) { string outputStr; if (generateCode == 0) { outputStr = "new Vector3[]{ "; for (int i = 0; i < path.pts.Length; i++) { Transform trans = i > 3 && i % 4 == 0 ? path.pts[i - 1] : path.pts[i]; if (trans != null) { outputStr += "new Vector3(" + trans.localPosition.x + "f," + trans.localPosition.y + "f," + trans.localPosition.z + "f)"; if (i < path.pts.Length - 1) { outputStr += ", "; } } } outputStr += " }"; } else { outputStr = "["; for (int i = 0; i < path.pts.Length; i++) { Transform trans = i > 3 && i % 4 == 0 ? path.pts[i - 1] : path.pts[i]; if (trans != null) { outputStr += "Vector3(" + trans.localPosition.x + "," + trans.localPosition.y + "," + trans.localPosition.z + ")"; if (i < path.pts.Length - 1) { outputStr += ", "; } } } outputStr += "]"; } scrollCodeViewPos = EditorGUILayout.BeginScrollView(scrollCodeViewPos, GUILayout.Height(70)); EditorGUILayout.TextArea(outputStr, LTEditor.shared.styleCodeTextArea); EditorGUILayout.EndScrollView(); } else { EditorGUILayout.LabelField(" Not available during runtime"); } EditorGUILayout.LabelField("Import:"); importArrValue = EditorGUILayout.TextArea(importArrValue, LTEditor.shared.styleCodeTextArea); GUILayout.BeginHorizontal(); GUILayout.FlexibleSpace(); if (GUILayout.Button(" Import Path ")) { // Debug.Log("index:"+importArrValue.IndexOf("Paste")+" val:"+importArrValue); if (importArrValue.IndexOf("Paste") < 0) { // Debug.Log("Importing"); string subImport = ""; if (generateCode == 0) { int start = importArrValue.IndexOf("{"); int end = importArrValue.IndexOf("}"); if (start < 0) { Debug.LogError("No starting bracket'{'"); } else if (end < 0) { Debug.LogError("No ending bracket'}'"); } else { subImport = importArrValue.Substring(start + 1, end - 1 - start).Trim(); // Debug.Log("broken down importedArr:"+subImport); } } else { int start = importArrValue.IndexOf("["); int end = importArrValue.IndexOf("]"); if (start < 0) { Debug.LogError("No starting bracket'['"); } else if (end < 0) { Debug.LogError("No ending bracket']'"); } else { subImport = importArrValue.Substring(start + 1, end - 1 - start).Trim(); // Debug.Log("broken down importedArr:"+subImport); } } string[] stringArr = subImport.Split(new string[] { "Vector3" }, System.StringSplitOptions.RemoveEmptyEntries); int len = generateCode == 0 ? (stringArr.Length - 1) : stringArr.Length; // Debug.Log("importing length:"+len); resetPath(); path.path = new Vector3[len]; k = 0; for (int i = 0; i < stringArr.Length; i++) { int start = stringArr[i].IndexOf("("[0]); int end = stringArr[i].IndexOf(")"[0]); // Debug.Log("i:"+i+" start:"+start+" end:"+end); if (start >= 0 && end > 0) { string vecStr = stringArr[i].Substring(start + 1, end - 1 - start); // Debug.Log("vec:"+vecStr); string[] numArr = vecStr.Split(","[0]); for (j = 0; j < numArr.Length; j++) { if (numArr[j].IndexOf("("[0]) >= 0) { start = numArr[j].IndexOf("("[0]); numArr[j] = numArr[j].Substring(start + 1); } else if (numArr[j].IndexOf(")"[0]) >= 0) { end = numArr[j].IndexOf(")"[0]); numArr[j] = numArr[j].Substring(0, end); } if (numArr[j].IndexOf("f"[0]) >= 0) { end = numArr[j].IndexOf("f"[0]); numArr[j] = numArr[j].Substring(0, end); } // Debug.Log("num:"+numArr[j]); } Vector3 vec3 = new Vector3(float.Parse(numArr[0]), float.Parse(numArr[1]), float.Parse(numArr[2])); path.path[k] = vec3; // Debug.Log("importing vec3:"+vec3); k++; } } } } GUILayout.EndHorizontal(); } }