首页 > 代码库 > 编辑模式下,控制对象移动

编辑模式下,控制对象移动

  有时候我们可能会有这样的需求,就是在编辑模式下,控制移动场景中的物体,这里面有两个点要解决:

  (1)怎么在编辑模式下运行一个脚本;

  (2)怎么有效地响应鼠标按键。

  第一个问题可以使用编辑器属性ExecuteInEditMode让脚本在编辑模式也能实时地更新。下面的代码用来控制物体的移动,并且可以在编辑模式下运行:

using UnityEngine;using System.Collections;#if UNITY_EDITORusing UnityEditor;#endif[ExecuteInEditMode]public class MoveComponent : MonoBehaviour{    private CharacterController controller;    private float speed = 3f;    private float rotateSpeed = 50f;    public void Init()    {        controller = transform.GetComponent("CharacterController") as CharacterController;        if (controller == null) Debug.Log("CharacterController not add!");    }    public void MoveForward()    {        if (controller == null) return;        controller.Move(Time.fixedDeltaTime * transform.forward * speed);    }    public void MoveBack()    {        if (controller == null) return;        controller.Move(-Time.fixedDeltaTime * transform.forward * speed);    }    public void TurnLeft()    {        if (controller == null) return;        transform.Rotate(Vector3.up, -Time.fixedDeltaTime * rotateSpeed);    }    public void TurnRight()    {        if (controller == null) return;        transform.Rotate(Vector3.up, Time.fixedDeltaTime * rotateSpeed);    }}

  第二个问题的解决方法是使用EditorWindow的OnGUI来响应KeyDown消息,下面的代码通过创建一个测试物体,并为其添加MoveComponent来让其移动:

using UnityEngine;using UnityEditor;using System.Collections;#if UNITY_EDITORusing UnityEditor;#endifpublic class CameraHelperEditor : EditorWindow{    public static CameraHelperEditor window = null;    [MenuItem("MyEditor/CameraHelperEditor")]    public static void ShowWindow()    {        window = EditorWindow.GetWindow(typeof(CameraHelperEditor), false, "CameraHelperEditor") as CameraHelperEditor;    }    private const string Prefab = "Test/Cube";    private GameObject player = null;    private MoveComponent moveComp = null;    void OnGUI()    {        if (GUILayout.Button("Init"))        {            player = GameObject.Instantiate(Resources.Load(Prefab)) as GameObject;            player.AddComponent("CharacterController");            moveComp = player.AddComponent("MoveComponent") as MoveComponent;            moveComp.Init();        }        switch (Event.current.type)        {            case EventType.keyDown:                {                    if (Event.current.keyCode == KeyCode.W)                    {                        Debug.Log(Time.deltaTime);                        Debug.Log(Time.fixedDeltaTime);                        moveComp.MoveForward();                    }                    else if (Event.current.keyCode == KeyCode.S)                    {                        moveComp.MoveBack();                    }                    else if (Event.current.keyCode == KeyCode.A)                    {                        moveComp.TurnLeft();                    }                    else if (Event.current.keyCode == KeyCode.D)                    {                        moveComp.TurnRight();                    }                }                break;        }    }    void OnDestroy()    {        if(player != null)        {            GameObject.DestroyImmediate(player);            player = null;        }        moveComp = null;    }}

  可以看到按键消息的响应都是放在OnGUI里面处理的。

  对于该问题的解决我相信还有更好的方法,希望伙伴们能够留言给予指点。

 

编辑模式下,控制对象移动