zoukankan      html  css  js  c++  java
  • 编辑模式下,控制对象移动

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

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

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

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

    using UnityEngine;
    using System.Collections;
    
    #if UNITY_EDITOR
    using 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_EDITOR
    using UnityEditor;
    #endif
    public 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里面处理的。

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

  • 相关阅读:
    Linux下修改Apache即httpd的端口
    jenkins.JenkinsException: Error in request. Possibly authentication failed
    jenkins-python 获取正在运行的Job
    通过python-jenkins 获取job的输出日志
    电子公文传输系统团队项目
    接口重复请求报错问题排查
    创建couchbase的bucket 提示RAM不够用 all the ram in the cluster is already allocated to existing bucekets,delete some buckets,,
    tornado重定向的几种方式
    tornado进行登录案例
    tornado设置cookie和查看cookie,含加密
  • 原文地址:https://www.cnblogs.com/sifenkesi/p/3963338.html
Copyright © 2011-2022 走看看