private void OnEnable() { EditorApplication.update += Update; tool = (RiverTool)target; }
public override void OnInspectorGUI() { RiverTool rt = (RiverTool)target; GUILayout.BeginHorizontal(); if (GUILayout.Button("Init")) { string scene = System.IO.Path.GetFileNameWithoutExtension(UnityEditor.EditorApplication.currentScene); string str = scene + GameObject.FindObjectsOfType(typeof(RiverTool)).Length.ToString(); rt.gameObject.name = str + "_River"; rt.init(); GameObject p1 = new GameObject("P1"); p1.transform.parent = rt.transform; p1.transform.localPosition = Vector3.zero; GameObject p2 = new GameObject("P2"); p2.transform.parent = rt.transform; p2.transform.localPosition = Vector3.forward; GameObject p3 = new GameObject("P3"); p3.transform.parent = rt.transform; p3.transform.localPosition = Vector3.forward * 2; p1.AddComponent <CurvePoint>(); p2.AddComponent <CurvePoint>(); p3.AddComponent <CurvePoint>(); rt.points.Add(p1); rt.points.Add(p2); rt.points.Add(p3); rt.gameObject.AddComponent <TextureAnimator>(); rt.gameObject.GetComponent <TextureAnimator>().Speed = new Vector2(0.1f, 0); } if (GUILayout.Button("Delete")) { DestroyImmediate(rt.gameObject); return; } GUILayout.EndHorizontal(); if (GUILayout.Button("Add Point")) { GameObject pn = new GameObject("P" + (rt.points.Count + 1)); int c = rt.points.Count; Vector3 p1 = rt.points[c - 1].transform.localPosition; Vector3 p2 = rt.points[c - 2].transform.localPosition; float d = Vector3.Distance(p1, p2); pn.transform.parent = rt.transform; pn.transform.localPosition = Vector3.MoveTowards(p1, p2, -d); pn.AddComponent <CurvePoint>(); rt.points.Add(pn); UnityEditor.Selection.activeGameObject = pn; } // if(GUILayout.Button("Add Point")) // { // GameObject pn = new GameObject("P" + (rt.points.Count+1)); // pn.transform.parent = rt.transform; // float d = Vector3.Distance(rt.points[rt.points.Count - 2].transform.localPosition, rt.points[rt.points.Count - 1].transform.localPosition); // pn.transform.localPosition = Vector3.MoveTowards(rt.points[rt.points.Count - 1].transform.localPosition, rt.points[rt.points.Count - 2].transform.localPosition, -d); // pn.AddComponent<CurvePoint>(); // rt.points.Add(pn); // UnityEditor.Selection.activeGameObject = pn; // // } if (GUILayout.Button("Create Prefab")) { string filePath = UnityEditor.EditorUtility.SaveFilePanelInProject("Save Mesh Asset", rt.gameObject.name, "", ""); if (filePath == "") { return; } UnityEditor.AssetDatabase.CreateAsset(rt.mat, filePath + ".mat"); UnityEditor.AssetDatabase.CreateAsset(rt.mesh, filePath + ".asset"); GameObject go = GameObject.CreatePrimitive(PrimitiveType.Plane); go.transform.position = rt.gameObject.transform.position; go.transform.rotation = rt.gameObject.transform.rotation; go.transform.localScale = rt.gameObject.transform.localScale; go.name = rt.gameObject.name; go.GetComponent <MeshFilter>().sharedMesh = rt.mesh; go.GetComponent <MeshRenderer>().sharedMaterial = rt.mat; go.GetComponent <MeshRenderer>().sharedMaterial.mainTexture = rt.mat.mainTexture; go.AddComponent <TextureAnimator>(); go.GetComponent <TextureAnimator>().Speed = rt.gameObject.GetComponent <TextureAnimator>().Speed; DestroyImmediate(go.GetComponent <MeshCollider>()); UnityEditor.PrefabUtility.CreatePrefab(filePath + ".prefab", go); UnityEditor.AssetDatabase.Refresh(); return; } DrawDefaultInspector(); }
private void OnSceneGUI() { HandleUtility.AddDefaultControl(GUIUtility.GetControlID(FocusType.Passive)); RiverTool tool = (RiverTool)target; ///Skiping first vertice, origin moves whole transform for (int i = 1; i < tool.vertices.Count; i++) { float distFromCam = 1; if (Camera.current != null) { distFromCam = Vector3.Distance(Camera.current.transform.position, tool.transform.TransformPoint(tool.vertices[i])); if (distFromCam > handleMaxDistance) { distFromCam = 0; } } Vector3 newPos = tool.transform.InverseTransformPoint(Handles.FreeMoveHandle(tool.transform.TransformPoint(tool.vertices[i]), Quaternion.identity, distFromCam / handleSize, Vector3.one, Handles.CircleHandleCap)); if (newPos.y != tool.vertices[i].y) { tool.vertices[i] = new Vector3(newPos.x, tool.vertices[i].y, newPos.z); } else { tool.vertices[i] = newPos; } } if (hideShowNodeTools) { if (tool.nodes.Count > 0) { Handles.color = Color.white; for (int i = 0; i < tool.nodes.Count; i++) { float distFromCam = 1; if (Camera.current != null) { distFromCam = Vector3.Distance(Camera.current.transform.position, tool.transform.TransformPoint(tool.nodes[i].centerVector)); if (distFromCam > handleMaxDistance) { distFromCam = 0; continue; } } tool.nodes[i].centerVectorOffset = Handles.FreeMoveHandle(tool.transform.TransformPoint(tool.nodes[i].centerVector) + tool.nodes[i].centerVectorOffset, Quaternion.identity, distFromCam / handleSize, Vector3.one, Handles.RectangleHandleCap) - tool.transform.TransformPoint(tool.nodes[i].centerVector); tool.nodes[i].centerVectorOffset.y = 0; if (tool.nodes[i].centerVectorOffset.x > maxNodeCenterOffset) { tool.nodes[i].centerVectorOffset.x = maxNodeCenterOffset; } else if (tool.nodes[i].centerVectorOffset.x < -maxNodeCenterOffset) { tool.nodes[i].centerVectorOffset.x = -maxNodeCenterOffset; } if (tool.nodes[i].centerVectorOffset.z > maxNodeCenterOffset) { tool.nodes[i].centerVectorOffset.z = maxNodeCenterOffset; } else if (tool.nodes[i].centerVectorOffset.z < -maxNodeCenterOffset) { tool.nodes[i].centerVectorOffset.z = -maxNodeCenterOffset; } //tool.nodes[i].flowDirectionOffset_Angle = Handles.RadiusHandle(Quaternion.identity, tool.nodes[i].centerVector + tool.transform.position + tool.nodes[i].centerVectorOffset + Vector3.up, tool.nodes[i].flowDirectionOffset_Angle); tool.nodes[i].flowDirectionOffset = Handles.RotationHandle(Quaternion.Euler(tool.nodes[i].flowDirectionOffset), tool.nodes[i].centerVector + tool.transform.position + tool.nodes[i].centerVectorOffset).eulerAngles; Handles.ArrowHandleCap(0, tool.nodes[i].centerVector + tool.transform.position + tool.nodes[i].centerVectorOffset, Quaternion.Euler(tool.nodes[i].flowDirection + tool.nodes[i].flowDirectionOffset), (distFromCam / handleSize) * 10, EventType.Repaint); float slopeAngle = 1; if (i + 1 < tool.nodes.Count) { slopeAngle = tool.nodes[i].centerVector.y - tool.nodes[i + 1].centerVector.y; } if (slopeAngle == 0) { slopeAngle = 1; } Handles.Label(tool.nodes[i].centerVector, "Node: " + i.ToString() + "\n" + "Flow Direction:\n" + (tool.nodes[i].finalFlowDirection * slopeAngle).ToString()); } Handles.color = Color.red; for (int i = 0; i < tool.nodes.Count; i++) { if (i + 1 < tool.nodes.Count) { Vector3 pOne = tool.nodes[i].centerVector + tool.nodes[i].centerVectorOffset + tool.transform.position; Vector3 pTwo = tool.nodes[i + 1].centerVector + tool.nodes[i + 1].centerVectorOffset + tool.transform.position; Handles.DrawLine(pOne + tool.nodes[i].flowDirection, pTwo + tool.nodes[i + 1].flowDirection); } } } } }