c# - Unity 编辑器脚本 - 使用 MouseOver 获取游戏对象

标签 c# unity-game-engine editor mouseevent

我正在尝试创建一个自定义编辑器,但遇到了一些麻烦。 我在现场有一个 Base GO - http://prntscr.com/cz2f2r

这个 GO 调用外部方法并在场景上创建网格。在方法 OnSceneGUI() 中,当它处于焦点时,我始终可以获得 EditorManager ( gameObject )。

如何监听场景 View 上的鼠标事件来识别光标下的不同对象?

我的代码:

using UnityEngine;
using UnityEditor;

[CustomEditor( typeof(GridManager))]
[CanEditMultipleObjects]
public class CIGridManager : Editor 
{
        private Vector2 _gridSize = new Vector2 (10, 10);

        private GridManager _gridManager;

        private bool _gridConfigureOpen = false;
        private bool _gridCustomizerOpen = false;

        private Color _selectedColor;

        public override void OnInspectorGUI()
        {
                base.OnInspectorGUI();

                _gridManager = target as GridManager;

                if ( !_gridManager.initialized() ) 
                {
                        EditorGUILayout.HelpBox ("Grid Manager is not Initialized. Please click init and go construct!", MessageType.Error);
                        if (GUILayout.Button ("Init Grid Manager")) 
                        {
                                _gridManager.initialize (_gridManager.GetComponent<GridViewGenerator>(), _gridManager.GetComponent<GridSettingsStorage>());
                        }
                }
                else 
                {
                        _gridConfigureOpen = EditorGUILayout.Foldout (_gridConfigureOpen, "Grid Configuration Block");
                        _gridCustomizerOpen = EditorGUILayout.Foldout (_gridCustomizerOpen, "Grid Customize Block");

                        if (_gridConfigureOpen) 
                        {
                                EditorGUILayout.LabelField("Grid Settings", EditorStyles.centeredGreyMiniLabel);

                                _gridSize = EditorGUILayout.Vector2Field("GridSize", _gridSize);

                                if(GUILayout.Button("Generate Grid"))
                                {
                                        if (_gridSize.x > 0 && _gridSize.y > 0)
                                        {   
                                                _gridManager.getGridSettingsStorage ().setLayerSize (_gridSize);
                                                _gridManager.generateGridLayer ();

                                                SceneView.RepaintAll();
                                        }
                                        else
                                        {

                                        }
                                }

                                if (GUILayout.Button ("Destroy All")) 
                                {
                                        _gridManager.destroyChank ();
                                }
                        }

                        if (_gridCustomizerOpen) 
                        {
                                EditorGUILayout.LabelField("Grid Customize", EditorStyles.centeredGreyMiniLabel);
                                _selectedColor = EditorGUILayout.ColorField (_selectedColor);
                        }
                }
        }

        void OnSceneGUI()
        {
                //Problem!
                // How to listen to mouse events on scene view to identify defferents object under the cursor? not only the EditorManager
        }
}

最佳答案

找到答案!

void OnEnable()
{
    SceneView.onSceneGUIDelegate += this.OnSceneMouseOver;
}


void OnSceneMouseOver(SceneView view)
 {
  Ray ray = HandleUtility.GUIPointToWorldRay(Event.current.mousePosition);
  RaycastHit hit;
  //And add switch Event.current.type for checking Mouse click and switch tiles
  if (Physics.Raycast (ray, out hit, 100f)) 
  {
   Debug.DrawRay (ray.origin, hit.transform.position, Color.blue, 5f);
   Debug.Log (hit.transform.name);
   Debug.Log (hit.transform.position);
  }
 }

关于c# - Unity 编辑器脚本 - 使用 MouseOver 获取游戏对象,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40256774/

相关文章:

c# - 如何从 XML 文件导入/读取数据?

c# - 计算谁先冲过终点线 (C# UNITY)

c# - 在 Unity 中使用 Reflection.Emit 设置静态字段的值失败

c# - 我怎样才能在触摸 "Kinematic"Rigidbody2D上移动?

java - 每帧通过 OpenGL 渲染两次,不同的库

c# - 如何在 ASP.NET MVC 区域中使用 Web 窗体的母版页

c# - Xamarin.iOS 主线程和后台线程运行不正常

c# - 以 Json : 400 Bad request 发送图像

c++ - 不使用 Ctrl+Space 的 Netbeans 中的可变代码完成

visual-studio-2010 - VS 2010 + ReSharper 6.1 - 插入新行的快捷方式?