Пример #1
0
    public override void OnToolGUI(EditorWindow window)
    {
        if (Event.current.keyCode == KeyCode.Escape)
        {
            isInit = false;

            Selection.activeGameObject = null;
            Tools.current = Tool.None;
        }


        if (isInit)
        {
            if (Event.current.type == EventType.Layout)
            {
                HandleUtility.AddDefaultControl(2);
            }


            RaycastHit cHit;

            Ray cRay = SceneView.lastActiveSceneView.camera.ScreenPointToRay(HandleUtility.GUIPointToScreenPixelCoordinate(Event.current.mousePosition));

            Vector3 contactPoint = new Vector3(0f, 0f, 0f);

            if (Physics.Raycast(cRay, out cHit, Mathf.Infinity))
            {
                contactPoint = cHit.point;
            }


            if (Event.current.type == EventType.MouseUp)
            {
                targetTool = new GameObject(ToolName);

                PlaceByProjection comp = targetTool.AddComponent <PlaceByProjection>();

                comp.Calculate = true;

                targetTool.transform.position = cHit.point;

                targetTool.transform.Translate(0f, 3.5f, 0f);

                targetTool.transform.up = cHit.normal;


                Selection.activeGameObject = targetTool;

                SceneView.lastActiveSceneView.FrameSelected();

                isInit = false;

                Event.current.Use();
            }
            else if (Event.current.type == EventType.MouseMove)
            {
                Debug.DrawRay(contactPoint, cHit.normal * 3f, Color.green);
                Event.current.Use();
            }
            else if (Event.current.type == EventType.Layout)
            {
                Debug.DrawRay(contactPoint, cHit.normal * 3f, Color.green);
            }

            Handles.color = Color.green;
            Handles.DrawWireDisc(contactPoint, cHit.normal, 2f);
        }
    }
Пример #2
0
    /*
     * private void OnSceneGUI()
     * {
     *
     * }
     */


    public override void OnInspectorGUI()
    {
        PlaceByProjection PlaceByProjection = (PlaceByProjection)target;

        EditorGUILayout.Separator();
        EditorGUILayout.Separator();

        //EditorGUILayout.LabelField("Projection Size", EditorStyles.boldLabel);
        //PlaceByProjection.ProjectionSize = EditorGUILayout.Vector2Field("",PlaceByProjection.ProjectionSize);

        EditorGUILayout.LabelField("Layer Mask", EditorStyles.boldLabel);
        PlaceByProjection.layerMask = EditorGUILayout.LayerField(PlaceByProjection.layerMask);

        EditorGUILayout.LabelField("Position Max Offset", EditorStyles.boldLabel);
        PlaceByProjection.OffsetMax = EditorGUILayout.Slider(PlaceByProjection.OffsetMax, 0f, 1f);

        EditorGUILayout.Separator();

        EditorGUILayout.LabelField("Distance", EditorStyles.boldLabel);
        PlaceByProjection.Distance = EditorGUILayout.Slider(PlaceByProjection.Distance, 0.01f, 1f);

        EditorGUILayout.Separator();

        EditorGUILayout.LabelField("Border", EditorStyles.boldLabel);
        PlaceByProjection.Border = EditorGUILayout.Slider(PlaceByProjection.Border, 0.01f, 1f);

        EditorGUILayout.Separator();

        GUILayout.BeginHorizontal();
        EditorGUILayout.LabelField("Random Y Rotation", EditorStyles.boldLabel);
        PlaceByProjection.RandomY = EditorGUILayout.Toggle("", PlaceByProjection.RandomY);
        GUILayout.EndHorizontal();

        EditorGUILayout.Separator();

        GUILayout.BeginHorizontal();
        EditorGUILayout.LabelField("Random XZ Rotation", EditorStyles.boldLabel);
        PlaceByProjection.RandomXZ = EditorGUILayout.Toggle("", PlaceByProjection.RandomXZ);
        GUILayout.EndHorizontal();

        EditorGUILayout.Separator();

        GUILayout.BeginHorizontal();
        EditorGUILayout.LabelField("Random Y Scale", EditorStyles.boldLabel);
        PlaceByProjection.RandomYScale = EditorGUILayout.Toggle("", PlaceByProjection.RandomYScale);
        GUILayout.EndHorizontal();

        EditorGUILayout.Separator();

        GUILayout.BeginHorizontal();
        EditorGUILayout.LabelField("Random Seed", EditorStyles.boldLabel);
        PlaceByProjection.seed = EditorGUILayout.IntSlider(PlaceByProjection.seed, 1, 10000);
        GUILayout.EndHorizontal();

        EditorGUILayout.Separator();

        GUILayout.BeginHorizontal();
        EditorGUILayout.LabelField("Normal Direction", EditorStyles.boldLabel);
        PlaceByProjection.NormalDirection = EditorGUILayout.Toggle("", PlaceByProjection.NormalDirection);
        GUILayout.EndHorizontal();

        GUILayout.BeginHorizontal();
        EditorGUILayout.LabelField("Calculate", EditorStyles.boldLabel);
        PlaceByProjection.Calculate = EditorGUILayout.Toggle("", PlaceByProjection.Calculate);
        GUILayout.EndHorizontal();

        EditorGUILayout.Separator();
        EditorGUILayout.Separator();

        Event evt = Event.current;

        GUIStyle BoxStyle = new GUIStyle(GUI.skin.box);

        BoxStyle.alignment = TextAnchor.MiddleCenter;
        BoxStyle.fontStyle = FontStyle.Italic;
        BoxStyle.fontSize  = 12;
        GUI.skin.box       = BoxStyle;

        Rect drop_area = GUILayoutUtility.GetRect(0.0f, 75.0f, GUILayout.ExpandWidth(true));

        GUI.Box(drop_area, "Drag Prefabs here!", BoxStyle);

        EditorGUILayout.Separator();
        EditorGUILayout.LabelField("Preview", EditorStyles.boldLabel);

        switch (evt.type)
        {
        case EventType.DragUpdated:
        case EventType.DragPerform:
            if (!drop_area.Contains(evt.mousePosition))
            {
                return;
            }

            DragAndDrop.visualMode = DragAndDropVisualMode.Copy;

            if (PlaceByProjection.ReplaceGameObject.Count != 0 && PlaceByProjection.TotalListTexture.Count != 0)
            {
                PlaceByProjection.ReplaceGameObject.Clear();
            }
            PlaceByProjection.TotalListTexture.Clear();

            if (evt.type == EventType.DragPerform)
            {
                DragAndDrop.AcceptDrag();

                for (int i = 0; i < DragAndDrop.objectReferences.Length; i++)
                {
                    PlaceByProjection.ReplaceGameObject.Add(DragAndDrop.objectReferences[i] as GameObject);
                    PlaceByProjection.TotalListTexture.Add(AssetPreview.GetAssetPreview(DragAndDrop.objectReferences[i]));
                }
            }
            break;
        }

        Rect boxRect = EditorGUILayout.BeginVertical();

        GUILayout.Box(GUIContent.none, GUILayout.Width(Screen.width), GUILayout.Height(2));

        PlaceByProjection.Index = GUILayout.SelectionGrid(PlaceByProjection.Index, PlaceByProjection.TotalListTexture.ToArray(), 6);

        EditorGUILayout.EndVertical();
        GUILayout.Box(GUIContent.none, GUILayout.Width(Screen.width), GUILayout.Height(2));

        EditorGUILayout.Separator();

        if (GUILayout.Button("Create"))
        {
            //PlaceByProjection.Calculate = false;
            PlaceByProjection.Remove();
            PlaceByProjection.Place();
        }

        EditorGUILayout.Separator();

        if (GUILayout.Button("Remove"))
        {
            PlaceByProjection.Remove();
        }

        EditorGUILayout.Separator();

        if (GUILayout.Button("Bake Meshes"))
        {
            PlaceByProjection.BakeMesh();
        }

        EditorGUILayout.Separator();

        //if (GUILayout.Button("Bake Meshes by materials"))
        //{
        //    CastRayBulk.BakeMeshByMaterials();
        //}

        if (GUI.changed || cachePosition != PlaceByProjection.transform.position || cacheScale != PlaceByProjection.transform.localScale || PlaceByProjection.transform.rotation.eulerAngles != cacheRotation)
        {
            PlaceByProjection.UpdateRaycast();
        }

        cachePosition = PlaceByProjection.transform.position;
        cacheScale    = PlaceByProjection.transform.localScale;
        cacheRotation = PlaceByProjection.transform.rotation.eulerAngles;

        this.Repaint();

        EditorGUILayout.Separator();
    }