Unity

Unity

官方網站:點擊進入
官方粉絲團:點擊進入

《Unity》 鍵盤移動控制 (下)

【Unity】 【3D】 【鍵盤控制】
作者:Jerrard Liu 時間:2015-10-06
原文:Unity - 鍵盤移動控制 - 下 
作者: Jerrard Liu


在上次我們完成方向的控制,接下來把人物移動補上後就完成了。但在之前先把剩下的方向補上,補完之後就是完整的八方向控制。

《Unity》 鍵盤移動控制 (下)

新增左前、右前、左後、右後四個物件,把物件加入腳本eightDirectionControl.cs下的target陣列之下。
接著修改eightDirectionControl.cs的內容:
using UnityEngine;
using System.Collections;

public class eightDirectionControl : MonoBehaviour {

        public GameObject model;
        private Animator animator;
        public GameObject [] target = new GameObject[8];

        public float speed;
        void Start () {
                animator = model.GetComponent<Animator> ();
        }

        void Update () {
                animator.SetBool("RunState",false);
                Vector3 targetDir = transform.forward;////(2)
                if (Input.GetKey (KeyCode.W) && Input.GetKey (KeyCode.D)) {////(1)
                        targetDir = target[1].transform.position - transform.position;////(2)
                        animator.SetBool("RunState",true);
                }
                else if (Input.GetKey (KeyCode.S) && Input.GetKey (KeyCode.D)) {
                        targetDir = target[3].transform.position - transform.position;
                        animator.SetBool("RunState",true);
                }
                else if (Input.GetKey (KeyCode.S) && Input.GetKey (KeyCode.A)) {
                        targetDir = target[5].transform.position - transform.position;
                        animator.SetBool("RunState",true);
                }
                else if (Input.GetKey (KeyCode.W) && Input.GetKey (KeyCode.A)) {
                        targetDir = target[7].transform.position - transform.position;
                        animator.SetBool("RunState",true);
                }
                else if(Input.GetKey(KeyCode.W)){
                        targetDir = target[0].transform.position - transform.position;
                        animator.SetBool("RunState",true);
                }
                else if(Input.GetKey(KeyCode.S)){
                        targetDir = target[4].transform.position - transform.position;
                        animator.SetBool("RunState",true);
                }
                else if(Input.GetKey(KeyCode.A)){
                        targetDir = target[6].transform.position - transform.position;
                        animator.SetBool("RunState",true);
                }
                else if(Input.GetKey(KeyCode.D)){
                        targetDir = target[2].transform.position - transform.position;
                        animator.SetBool("RunState",true);
                }

                float step = speed * Time.deltaTime;////(2)
                Vector3 newDir = Vector3.RotateTowards(transform.forward, targetDir, step, 0.0F);
                transform.rotation = Quaternion.LookRotation(newDir);

        }
}
(1)新增四個方向的控制,條件是同時按下兩個鍵的時候成立;如右前方的話就是同時按下W和D。
(2)條件式成立時裡面的內容有點太長,稍微把內容做了修改。
到這裡確定好方向控制後新增移動用的腳本MoveControl.cs,這個腳本要做的事情是當按鍵按下時人物要朝著現在面向的方向移動:
using UnityEngine;
using System.Collections;

public class MoveControl : MonoBehaviour {
        public GameObject model;
        public float speed;

        void Update () {
                if(Input.GetKey(KeyCode.W) 
                   ||Input.GetKey(KeyCode.S)
                   ||Input.GetKey(KeyCode.A)
                   ||Input.GetKey(KeyCode.D)){
                        transform.Translate(model.transform.forward*speed*Time.deltaTime);
                }
        }
}
使用transform.Translate做移動,移動方向是模型朝著的方向,也就是model.transform.forward。
至於這個腳本要掛在哪裡:

《Unity》 鍵盤移動控制 (下)

新增3D物件MoveControl,這裡同樣是用Cube再隱藏render,在MoveControl之下加入Model。
將物件Model加入腳本Model,最後在調整速度就後把target的render隱藏就完成了。
在做到一半的時候想到物理碰撞、跳躍等等功能還沒完成,這些就另外寫,這次就到這裡。
模型素材:結月ゆかりVer3.5 https://bowlroll.net/file/6518 by お宮

6月23日修正:
有關回應模型下沉問題為target 位置錯誤造成,這部分已修正。
另外Unity版本已升到5.1,MouseLook的程式碼也跟著更新,但目前暫時還是以舊版程式碼為主。

※其他相關資訊:

《Unity》 鍵盤移動控制 (上)
x