2019年8月15日 星期四

【Unity官方教學分享】移動和旋轉(Translate and Rotate)

網頁連結

如何使用transform下的兩個函式;Translate和Rotate去影響一個非剛體物件的位置和角度。

在以下的範例,我們可以看到移動Translate的引數是一個vector3,而數值為Z軸1,X及Y為0。
另外這個範例在Unity執行時的一個frame都會運作,因為它是寫在Unpate中。
using System.Collections;
using System.Collections.Generic;
using UnityEngine;

public class TransformFunctions : MonoBehaviour
{
    void Start()
    {
        
    }

    void Update()
    {
        transform.Translate(new Vector3(0, 0, 1));
    }
}

運行Unity後可以看到物件往Z軸的方向開始移動,但它的速度非常快,畢竟它在每一個frame都會移動它的位置,所以我們可以乘上Time.deltaTime,這代表接下來移動相同距離需要1秒
另外我們使用Vector3(0, 0, 1),但為了表示得更清楚可以使用Vector3.forword。
最後我們也可以讓移動速度變的可控,在乘上一個變數moveSpeed,腳本修改成以下的內容:
using System.Collections;
using System.Collections.Generic;
using UnityEngine;

public class TransformFunctions : MonoBehaviour
{
    public float moveSpeed = 10.0f;

    void Start()
    {
        
    }

    void Update()
    {
        transform.Translate(Vector3.forward * moveSpeed * Time.deltaTime);
    }
}
透過改變moveSpeed數值,可以注意到移動速度變的可控制了。

如果我們不想讓它自己執行移動,可以加上鍵盤輸入,使用者按下方向鍵"↑"時物件就會移動。
要往後移動同理,往後移動要給它一個負值並改為方向鍵"↓"
using System.Collections;
using System.Collections.Generic;
using UnityEngine;

public class TransformFunctions : MonoBehaviour
{
    public float moveSpeed = 10.0f;

    void Start()
    {
        
    }

    void Update()
    {
        if(Input.GetKey(KeyCode.UpArrow))
            transform.Translate(Vector3.forward * moveSpeed * Time.deltaTime);
        if (Input.GetKey(KeyCode.DownArrow))
            transform.Translate(-Vector3.forward * moveSpeed * Time.deltaTime);
    }
}

接著我們來看旋轉Rotate,和Translate相同帶入一個vector3,這裡我們用Vector3.up,
也就是旋轉Y軸,使用方向鍵"←"和"→"並乘上一個旋轉量值turnSpeed:
using System.Collections;
using System.Collections.Generic;
using UnityEngine;

public class TransformFunctions : MonoBehaviour
{
    public float moveSpeed = 10.0f;
    public float turnSpeed = 50.0f;

    void Start()
    {
        
    }

    void Update()
    {
        if(Input.GetKey(KeyCode.UpArrow))
            transform.Translate(Vector3.forward * moveSpeed * Time.deltaTime);
        if (Input.GetKey(KeyCode.DownArrow))
            transform.Translate(-Vector3.forward * moveSpeed * Time.deltaTime);
        if (Input.GetKey(KeyCode.LeftArrow))
            transform.Rotate(Vector3.up * turnSpeed * Time.deltaTime);
        if (Input.GetKey(KeyCode.RightArrow))
            transform.Rotate(-Vector3.up * turnSpeed * Time.deltaTime);
    }
}


最後要注意的是,如果想用Translate和Rotate移動旋轉帶有collider的物件,並且和其他物件產生物理碰撞的結果請使用物理(physics)相關的函式才能做到,這次就到這裡。

沒有留言:

張貼留言

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

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