/// <summary> /// Road Root is an editor helper object during authoring. /// </summary> /// <returns>The road root.</returns> public static RoadRoot GetRoadRoot() { // RoadRoot is removed during gameplay (for avoiding false collision detection) if (Application.isPlaying) { return(null); } GameObject root = GameObject.Find("__UnityRoadRoot"); if (root != null) { return(root.GetComponent <RoadRoot>()); } else { GameObject obj = new GameObject(); obj.name = "__UnityRoadRoot"; obj.hideFlags = HideFlags.HideAndDontSave; RoadRoot rr = obj.AddComponent <RoadRoot>(); BoxCollider bc = obj.GetComponent <BoxCollider>(); bc.size = new Vector3(1000000.0f, 0.0f, 1000000.0f); return(rr); } }
private static void _EditRoad_Create_DrawNextPathPreview(RoadRoot root, Event e, int controlID) { RoadCreateOperation op = root.currentOperation as RoadCreateOperation; if (op == null) { return; } Ray r = HandleUtility.GUIPointToWorldRay(e.mousePosition); RaycastHit hit; if (Physics.Raycast(r, out hit)) { Waypoint from = op.lastWaypoint; Vector3 curPos = hit.point; Vector3 tangent = Vector3.Lerp(from.transform.position, curPos, 0.5f); Handles.DrawBezier(from.transform.position, // start pos curPos, // end pos tangent, // start tangent tangent, // end tangent Color.magenta, // color null, // Texture 3.0f); // width } }
public static void DoSceneGUI() { int controlID = GUIUtility.GetControlID(FocusType.Passive); Event e = Event.current; RoadRoot root = RoadUtility.GetRoadRoot(); switch (root.selectedTool) { case RoadRoot.ToolType.Select: break; case RoadRoot.ToolType.Road: _EditRoad(root, e, controlID); break; case RoadRoot.ToolType.Decal: break; case RoadRoot.ToolType.SidePoints: break; case RoadRoot.ToolType.Wall: break; } }
/// <summary> /// HACK: force invoke Repaint Event in SceneView. /// OnSceneGUI() will not be redrawn unless Repaint Event is kicked, /// so moving last waypoint by zero to force make repaint happen. /// </summary> private static void _EditRoad_Create_ForceInvokeRepaint(RoadRoot root) { RoadCreateOperation op = root.currentOperation as RoadCreateOperation; if (op != null) { op.lastWaypoint.transform.Translate(new Vector3(0, 0, 0)); } }
void OnGUI() { if (m_root == null) { m_root = RoadUtility.GetRoadRoot(); } if (m_root != null) { EditorGUILayout.BeginVertical(); GUILayout.Label("Tool:", EditorStyles.boldLabel); m_root.selectedTool = (RoadRoot.ToolType)GUILayout.SelectionGrid((int)m_root.selectedTool, toolLabel, 1); if (m_root.selectedTool == RoadRoot.ToolType.Road) { Selection.activeGameObject = m_root.gameObject; } switch (m_root.selectedTool) { case RoadRoot.ToolType.Select: break; case RoadRoot.ToolType.Road: GUILayout.Label("Mode:", EditorStyles.boldLabel); if (m_root.activeRoad == null) { m_root.selectedRoadToolMode = (RoadRoot.RoadToolType)GUILayout.SelectionGrid((int)m_root.selectedRoadToolMode, roadToolModeLabel_NoRoadSelected, 1); } else { m_root.selectedRoadToolMode = (RoadRoot.RoadToolType)GUILayout.SelectionGrid((int)m_root.selectedRoadToolMode, roadToolModeLabel_RoadSelected, 1); } break; case RoadRoot.ToolType.Decal: break; case RoadRoot.ToolType.SidePoints: break; case RoadRoot.ToolType.Wall: break; } EditorGUILayout.EndVertical(); } else { EditorGUILayout.HelpBox("RoadTool is not available during gameplay.", MessageType.Info); } }
void OnEnable() { m_target = target as Path; RoadRoot rr = RoadUtility.GetRoadRoot(); if (!serializedObject.isEditingMultipleObjects) { rr.SetActivePath(m_target); } else { rr.SetActivePath(null); } }
private static void _EditRoad(RoadRoot root, Event e, int controlID) { switch (root.selectedRoadToolMode) { case RoadRoot.RoadToolType.Create: _EditRoad_Create(root, e, controlID); break; case RoadRoot.RoadToolType.AddWaypoint: _EditRoad_AddWaypoint(root, e, controlID); break; case RoadRoot.RoadToolType.RemoveWaypoint: _EditRoad_RemoveWaypoint(root, e, controlID); break; } }
private static void _EditRoad_RemoveWaypoint(RoadRoot root, Event e, int controlID) { switch (e.GetTypeForControl(controlID)) { case EventType.MouseDown: GUIUtility.hotControl = controlID; Debug.Log("[RemoveWaypoint]Mouse Down" + e.mousePosition); Event.current.Use(); break; case EventType.MouseUp: GUIUtility.hotControl = 0; Debug.Log("[RemoveWaypoint]Mouse Up" + e.mousePosition); Event.current.Use(); break; } }
private static void _EditRoad_Create(RoadRoot root, Event e, int controlID) { switch (e.GetTypeForControl(controlID)) { case EventType.mouseMove: // to draw preview line in scene, invoke repaint event when mouse is moved. _EditRoad_Create_ForceInvokeRepaint(root); break; case EventType.Repaint: _EditRoad_Create_DrawNextPathPreview(root, e, controlID); break; case EventType.MouseDown: GUIUtility.hotControl = controlID; if (e.clickCount == 2) { RoadCreateOperation op = root.currentOperation as RoadCreateOperation; if (op != null) { Selection.activeGameObject = op.End(); } } Event.current.Use(); break; case EventType.MouseUp: GUIUtility.hotControl = 0; Ray ray = HandleUtility.GUIPointToWorldRay(e.mousePosition); RaycastHit hit; if (Physics.Raycast(ray, out hit)) { RoadCreateOperation op = root.currentOperation as RoadCreateOperation; if (op == null) { root.BeginCreateRoadOperation(hit.point); } else { op.Continue(hit.point); } } Event.current.Use(); break; } }
void OnEnable() { root = serializedObject.FindProperty("m_root"); roadMesh = serializedObject.FindProperty("m_roadMesh"); meshQuality = serializedObject.FindProperty("m_meshQuality"); roadWidth = serializedObject.FindProperty("defaultWidth"); defaultMaterial = serializedObject.FindProperty("m_defaultMaterial"); m_target = target as Road; RoadRoot rr = RoadUtility.GetRoadRoot(); if (!serializedObject.isEditingMultipleObjects) { rr.SetActiveRoad(m_target); } else { rr.SetActiveRoad(null); } }
void OnEnable() { centerRatio = serializedObject.FindProperty("centerRatio"); angle = serializedObject.FindProperty("angle"); width = serializedObject.FindProperty("m_width"); last = serializedObject.FindProperty("m_last"); next = serializedObject.FindProperty("m_next"); m_target = serializedObject.targetObject as Waypoint; RoadRoot rr = RoadUtility.GetRoadRoot(); if (!serializedObject.isEditingMultipleObjects) { rr.SetActiveWaypoint(m_target); } else { rr.SetActiveRoad(null); } }
public RemoveWaypointOperation(RoadRoot r) { m_parent = r; }
public AddWaypointOperation(RoadRoot r) { m_parent = r; }
public RoadCreateOperation(RoadRoot r) { m_parent = r; }
void OnEnable() { m_target = target as RoadRoot; }