上一章節(jié)中我們介紹了Transform組件的屬性和方法。我們發(fā)現(xiàn) Transform 中有right,up和forward,而 Vector3 類中也有right,up和forward,他們是一回事嘛?我們使用Forward來說明兩者之間的區(qū)別。我們知道,改變游戲?qū)ο蟮膒osition位置,就可以形成移動效果。如果我們讓游戲?qū)ο笱刂鴉orward的方向,游戲?qū)ο髴?yīng)該如何移動呢?
接下來,我們創(chuàng)建一個“SampleScene3”的新場景,并創(chuàng)建一個“Cube”游戲?qū)ο蟆?/span>
需要注意的是,我們要將這個“Cube”放置到世界坐標(biāo)系的原點(diǎn)(0,0,0)的位置。我們點(diǎn)擊選中“Cube”游戲?qū)ο?,然后在它的Inspector檢視面板中做如下修改。
然后創(chuàng)建一個“CubeTransformTest.cs”腳本,并將該腳本附加到“Cube”游戲?qū)ο笊厦?。我們按下“W”鍵的時候,“Cube”游戲?qū)ο笠蚯埃╖軸正方向)移動1個單位:
腳本代碼如下
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
public class CubeTransformTest : MonoBehaviour
{
// Start is called before the first frame update
void Start()
{
}
// Update is called once per frame
void Update()
{
if (Input.GetKeyDown(KeyCode.W))
{
transform.position += new Vector3(0, 0, 1);
}
}
}
以上代碼非常簡單,就是按下“W”按鍵的時候,我們修改游戲?qū)ο蟮膖ransform組件的position屬性,讓其沿著Z軸正方向移動1米的長度。
為了能夠更好的查看“Cube”的移動效果,我們將攝像機(jī)移動到“Cube”的上方,同時朝向下方,也就是“俯視”當(dāng)前場景,那么攝像機(jī)的參數(shù)設(shè)置如下:
因?yàn)椤癈ube”位于世界坐標(biāo)系原點(diǎn)(0,0,0)位置,因此我們將攝像機(jī)放置(0,5,0)位置,也就是“Cube”的上方5個單位高度位置。然后我們將攝像機(jī)在X軸旋轉(zhuǎn)90度,讓攝像機(jī)朝向“Cube”,這樣,我們就能夠“俯視”這個“Cube”游戲?qū)ο罅?。接下來?我們就可以Play當(dāng)前工程,然后按下“W”鍵來移動這個“Cube”。
以上就是運(yùn)行后的內(nèi)容,接下來我們按下“W”鍵
我們前后對比發(fā)現(xiàn),立方體Cube向前移動了一段距離。其實(shí),我們上面也介紹了Vector3.forward就是Vector3(0, 0, 1),那么我們的代碼也可以這樣寫,
void Update()
{
if (Input.GetKeyDown(KeyCode.W))
{
//transform.position += new Vector3(0, 0, 1);
transform.position += Vector3.forward;
}
}
我們重新“Play”當(dāng)前工程,按下“W”鍵之后,發(fā)現(xiàn)“Cube”也向前移動了,說明Vector3.forward就是Vector3(0, 0, 1),這個是沒有問題的。接下來, 我們試試transform.forward代碼
void Update()
{
if (Input.GetKeyDown(KeyCode.W))
{
//transform.position += new Vector3(0, 0, 1);
//transform.position += Vector3.forward;
transform.position += transform.forward;
}
}
我們再重新“Play”當(dāng)前工程,按下“W”鍵之后,發(fā)現(xiàn)“Cube”也向前移動了,跟之前沒有任何區(qū)別,這說明transform.forward 約等于Vector3(0, 0, 1)。他們之間肯定是有區(qū)別的。
接下來,我們添加旋轉(zhuǎn)代碼,測試旋轉(zhuǎn)后的移動,如下所示:
void Update()
{
if (Input.GetKeyDown(KeyCode.W))
{
transform.position += new Vector3(0, 0, 1);
//transform.position += Vector3.forward;
//transform.position += transform.forward;
}
// 向左旋轉(zhuǎn)45度
if (Input.GetKeyDown(KeyCode.Q))
{
transform.eulerAngles += new Vector3(0, -45, 0);
}
// 向右旋轉(zhuǎn)45度
if (Input.GetKeyDown(KeyCode.E))
{
transform.eulerAngles += new Vector3(0, 45, 0);
}
}
請注意,我們添加旋轉(zhuǎn)代碼的同時,還重新使用了“Vector3(0,0,1)”移動代碼。我們重新Play當(dāng)前工程,先旋轉(zhuǎn)“cube”然后在再移動“cube”,入下所示:
?
?
我們發(fā)現(xiàn),當(dāng)我們選擇“Cube”之后再移動的話,“Cube”仍然沿Z軸正方向移動。也就是說,“Vector3(0,0,1)”是世界坐標(biāo)系的正前方(Z軸正方向),它不會受游戲物體的旋轉(zhuǎn)影響。同時我們再測試“Vector3.forward”代碼,發(fā)現(xiàn)他們兩個一樣的效果。這說明
Vector3.forward = Vector3(0,0,1)? ?
兩者都代表世界坐標(biāo)系的正前方(Z軸正方向)
接下來,我們再來測試“transform.forward”的效果。
if (Input.GetKeyDown(KeyCode.W))
{
//transform.position += new Vector3(0, 0, 1);
//transform.position += Vector3.forward;
transform.position += transform.forward;
}
?
?文章來源:http://www.zghlxwxcb.cn/news/detail-430029.html
我們發(fā)現(xiàn),旋轉(zhuǎn)后的移動方向改變了,它不是世界坐標(biāo)系的前方,而是當(dāng)前“Cube”游戲?qū)ο蟮谋镜刈鴺?biāo)系的前方。他們的區(qū)別相當(dāng)于“東西南北”和“前后左右”的概念?!皷|西南北”是相對于世界坐標(biāo)系的,不管人如何旋轉(zhuǎn),方向不會改變;但是“前后左右”是相對于每一個人而言的,人的朝向不同(旋轉(zhuǎn)不同),“前后左右”的方向是不一樣的。兩者只是參考系不同,有時候世界坐標(biāo)系方便一下,有時候本地坐標(biāo)系方便一些。也就是說,transform.forward代表的是游戲?qū)ο蟮恼胺剑ū镜刈鴺?biāo)系Z軸正方向),而Vector3.forward 等效于Vector3(0,0,1),兩者都代表世界坐標(biāo)系的正前方(Z軸正方向)。文章來源地址http://www.zghlxwxcb.cn/news/detail-430029.html
到了這里,關(guān)于第十二章 Transform組件(下)的文章就介紹完了。如果您還想了解更多內(nèi)容,請?jiān)谟疑辖撬阉鱐OY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!