2015年5月3日 星期日

【Unity】鍵盤移動控制 - 下

上篇
在上次我們完成方向的控制,接下來把人物移動補上後就完成了。這次的結果點這裡
但在之前先把剩下的方向補上,補完之後就是完整的八方向控制。
透過鍵盤操控mmd4mecanim模型

新增左前、右前、左後、右後四個物件,把物件加入腳本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。
至於這個腳本要掛在哪裡:
透過鍵盤操控mmd4mecanim模型

新增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的程式碼也跟著更新,但目前暫時還是以舊版程式碼為主。

1 則留言:

  1. 用了你的方法
    但是角色碰撞後會偏移
    請問該如何調整

    回覆刪除

【自製小遊戲】水平思考猜謎(海龜湯)

遊戲連結 海龜湯的玩法是由出題者提出一個難以理解的事件,參與猜題者可以提出任何問題以試圖縮小範圍並找出事件背後真正的原因。但出題者僅能以「是」、「不是」或「沒有關係」來回答問題。 本遊戲蒐集各種論壇、平台的42個題目,提供給想玩海龜湯卻愁找不到題目的你們。 ...