Пример #1
0
    void InteractiveTemplate(SceneView view, Event ev)
    {
        if (active == null)
        {
            return;
        }

        if (ev.type == EventType.DragUpdated || ev.type == EventType.DragPerform)
        {
            var data = DragAndDrop.GetGenericData("MittEntrance") as GateTags;
            if (data != null)
            {
                dragTemplate = data;
                if (ev.type == EventType.DragUpdated)
                {
                    float d; RaycastHit hit;

                    Vector3 center = activeObject.transform.TransformPoint(active.center);
                    Vector3 normal = -view.camera.transform.forward;
                    if (!ev.shift)
                    {
                        normal = HittUtility.Align(normal);
                    }

                    Plane plane = new Plane(normal, center);
                    Ray   ray   = HittUtility.MouseRay(ev, view);
                    plane.Raycast(ray, out d);
                    Vector3 point = ray.GetPoint(d);

                    if (!ev.shift)
                    {
                        point = HittUtility.Snap(point - center, HandleUtility.GetHandleSize(center) * 0.2f) + center;
                    }
                    if (!(ev.control || ev.command) && Physics.Linecast(point, center, out hit))
                    {
                        point = hit.point;
                    }

                    dragStop = new DragStop()
                    {
                        pos = point, center = center, normal = normal
                    };

                    DragAndDrop.visualMode = DragAndDropVisualMode.Link;
                    ev.Use();
                }
                else
                {
                    {
                        Undo.RecordObject(activeObject, "Add new Entrance");
                        active.AddEntrance(new Entrance()
                        {
                            position = activeObject.transform.InverseTransformPoint(dragStop.pos),
                            rotation = HittUtility.Conjugate(activeObject.transform.rotation) * Quaternion.LookRotation(dragStop.pos - dragStop.center),
                            tag      = dragTemplate.hash
                        });
                        template.Populate();
                    }
                    dragTemplate = null;
                    DragAndDrop.activeControlID = 0;
                    DragAndDrop.AcceptDrag();
                    ev.Use();
                }
            }
        }
        else if (ev.type == EventType.DragExited)
        {
            dragTemplate = null;
        }

        if (ev.type == EventType.Repaint)
        {
            if (dragTemplate != null)
            {
                var r = Mathf.Min(Vector3.Magnitude(dragStop.pos - dragStop.center) * 0.5f, 1);
                var c = dragTemplate.color; Handles.color = c;
                Handles.DrawLine(dragStop.center, dragStop.pos);
                c.a *= 0.5f; Handles.color = c;
                Handles.DrawWireDisc(dragStop.center, dragStop.normal, r);
                c.a *= 0.2f; Handles.color = c;
                Handles.DrawSolidDisc(dragStop.center, dragStop.normal, r);
            }
        }
    }
Пример #2
0
    void EntranceGUI()
    {
        var      ev = Event.current;
        var      ms = ev.mousePosition;
        GateTags e  = null;

        EditorGUILayout.Space();

        EditorGUILayout.BeginHorizontal();
        EditorGUI.BeginChangeCheck();

        if (template.gates.Length > 0)
        {
            e       = template.gates[HittUtility.Clamp(template.gates, activeEntrance)];
            e.name  = EditorGUILayout.TextField(e.name);
            e.color = EditorGUILayout.ColorField(e.color);
            e.size  = EditorGUILayout.Vector3Field(GUIContent.none, e.size);
        }

        if (GUILayout.Button("+", GUILayout.Width(50)))
        {
            Undo.RecordObject(template, "Add new Entrance Template");
            ArrayUtility.Add(ref template.gates, e == null ? new GateTags() : e.Clone());
        }

        if (GUILayout.Button("-", GUILayout.Width(50)) && template.gates.Length > 1)
        {
            Undo.RecordObject(template, "Delete Entrance Template");
            ArrayUtility.RemoveAt(ref template.gates, activeEntrance);
            activeEntrance--;
        }

        if (EditorGUI.EndChangeCheck())
        {
            SceneView.RepaintAll();
        }
        EditorGUILayout.EndHorizontal();

        Styles.MakeGrid(new Vector2(150, 50), template.gates.Length, delegate(Rect r, int i)
        {
            var g = template.gates[i];
            var c = GUI.color;

            if (ev.type == EventType.Repaint)
            {
                GUI.color = g.color;
                GUI.Box(r, Texture2D.whiteTexture);
                GUI.color = c;
                GUI.Label(r, g.name, Styles.labelStyles[(Styles.IsDark(g.color) ? 1 : 0) + (activeEntrance == i ? 2 : 0)]);
            }

            if (ev.type == EventType.MouseDown && r.Contains(ms))
            {
                activeEntrance = i;
                if (active != null)
                {
                    DragAndDrop.PrepareStartDrag();
                    DragAndDrop.objectReferences = new UnityEngine.Object[] { template };
                    DragAndDrop.SetGenericData("MittEntrance", g);
                    DragAndDrop.visualMode = DragAndDropVisualMode.Copy;
                    DragAndDrop.StartDrag("Make Prefab");
                }
                else
                {
                    Repaint();
                }
            }
        });
    }