zoukankan      html  css  js  c++  java
  • Unity3D 游戏开发构架篇 ——输入控制


    临近毕业之初。进入Unity3D这个行业,是一家小工作室。老板人非常不错,公司氛围也非常单纯。近期公司开发一款小游戏,初次上手,颇多周折,记录下自己的开发心得。主要涉及一些设计理念,互相交流。

    先说下项目背景。主要是一款闯关游戏,山寨了敲冰块与雷霆战机。

    一、人物控制

    // This script moves the character controller forward 
    // and sideways based on the arrow keys.
    //这个脚本用箭头键向前移动和側移角色控制器。

    // It also jumps when pressing space. //当按下空格键时。它跳起。 // Make sure to attach a character controller to the same game object. //确保把一个character controller组件附加到同一个游戏物体上。 //It is recommended that you make only one call to Move or SimpleMove per frame. //建议你每帧仅仅调用一次Move或者SimpleMove。

    var speed : float = 6.0; var jumpSpeed : float = 8.0; var gravity : float = 20.0; private var moveDirection : Vector3 = Vector3.zero; function Update() { var controller : CharacterController = GetComponent(CharacterController); if (controller.isGrounded) { // We are grounded, so recalculate // move direction directly from axes //我们着地了,所以直接通过轴又一次计算move direction。 moveDirection = Vector3(Input.GetAxis("Horizontal"), 0,Input.GetAxis("Vertical")); moveDirection = transform.TransformDirection(moveDirection); moveDirection *= speed; if (Input.GetButton ("Jump")) { moveDirection.y = jumpSpeed; } } // Apply gravity //应用重力。 moveDirection.y -= gravity * Time.deltaTime; // Move the controller //移动控制器。 controller.Move(moveDirection * Time.deltaTime); }


    上面的一段代码是圣典中的一段角色控制代码。也是我项目最原始的人物控制代码版本号。

    可是考虑到输入设备的不同。我们就要考虑到代码的重用性,比方Android移动平台和PC平台等等。

    二、设计思想

           能够把输入设备做一个输入模块,发出信号,其内部的逻辑实现都运动控制模块实现。这样就分离了开来。耦合性减少。

            大致思想例如以下图所看到的

           

    三、代码实现

    这个设计严格说起来可能还有点复杂,可是我本身非常赞赏这个做法——逻辑和表现的分离。

            以下附上核心代码

    类图例如以下

            

             


    PCInput.CS      

    public class PCInput : MonoBehaviour {
    
        private PlayControl mycontrol;
    	
        void Awake()
        {
            mycontrol = GetComponent<PlayControl>();
           
            DebugUtils.Assert(mycontrol != null );
    	
    	}
    	// Update is called once per frame
    	void Update () {
            mycontrol.ChangePosition(Input.GetAxis("Horizontal"));
    		
            if (Input.GetButton("Jump"))
            {
                //call jump 
                mycontrol.Set_Jump();
    		}    
    	}
    }
    PlayControl.CS

        public void ChangePosition(float x)
        {
            if (isGrounded()) {
                //print("isgrond");
                moveDirection = new Vector3(x, 0.0f, 0.0f);
    			if (Startjump) {
                    moveDirection.y = jumpSpeed;
                   
                }
                //仅仅有在地面才干控制速度
                moveDirection *= speed;
            }
            moveDirection.y -= gravity * Time.deltaTime;
    		controller.Move(moveDirection * Time.deltaTime);
        }
        public bool Startjump = false;
    
        void Recover()
        {
    	Startjump = false;
        }
        public void Set_Jump() {
            Startjump = true;
    		Invoke ("Recover", 0.1f);
        }

         Android就不发了。 本身都是一个思路。

    四、延伸

         事实上这个模块也能够用来控制动画。比方行走和精巧的动画能够由虚拟轴控制等等。

         欢迎大家对博客的留言讨论。CSDN的博客公布越来越慢,还须要验证码,烦死了,后期转到博客园去了。

  • 相关阅读:
    log4j配置只打印指定jar或包的DEBUG信息
    实现cookie跨域访问
    使用轻量级Spring @Scheduled注解执行定时任务
    Docker容器里时间与宿主机不同步
    Wildfly8 更改response header中的Server参数
    JBoss部署项目log4j配置会造成死锁问题,浏览器访问一直pending状态
    json-lib-2.4.jar Bug,json字符串中value为"[value]"结构时,解析为数组,不会解析成字符串
    【转载】分享下多年积累的对JAVA程序员成长之路的总结
    web项目嵌入Jetty运行的两种方式(Jetty插件和自制Jetty服务器)
    rabbitmq+haproxy+keepalived实现高可用集群搭建
  • 原文地址:https://www.cnblogs.com/mfrbuaa/p/5127833.html
Copyright © 2011-2022 走看看