剩下兩週上課囉,大家加油!!
在一開始我們在課程完成了椅子(角色的移動嘛),但遠遠的看著他移動好像缺少了一些遊戲體驗 嗎?><
這週我們就來改變遊戲的視角吧~~
原本WASD AD控制Y軸旋轉(轉頭),後來改成WASD控制平移座標,把旋轉特別移出來到滑鼠上,滑鼠可以控制Y軸及另一軸的旋轉(轉頭、仰頭低頭)
V1.0版本
public class ChairMove : MonoBehaviour
{
public float Speed = 1.0f;
private Rigidbody rb;
// Start is called before the first frame update
void Start()
{
rb = GetComponent<Rigidbody>();
}
// Update is called once per frame
void Update()
{
this.gameObject.transform.Translate(Input.GetAxis("Vertical") * Speed * Time.deltaTime, 0, 0);
this.gameObject.transform.Rotate(0, Input.GetAxis("Horizontal") * 60 * Time.deltaTime, 0);
BaseMove();
}
private void BaseMove()
{
if (Input.GetKeyDown(KeyCode.Space))
//if (Input.GetKeyDown("Space")) 或打這句話也行
{
rb.AddForce(new Vector2(0, 200));
}
}
}
V2.0版本
public class ChairCamera : MonoBehaviour
{
public float speed = 1.0f;
//滑鼠
private Vector2 rotation; //旋轉值
public Vector2 sensitivity; //滑鼠靈敏度
private Vector2 GetmouseInput()
{
Vector2 input = new Vector2(Input.GetAxis("Mouse X"), Input.GetAxis("Mouse Y"));
return input;
}
// Start is called before the first frame update
void Start()
{
}
// Update is called once per frame
void Update()
{
Camera1Move();
if (Input.GetKey(KeyCode.Mouse2))
{
MouseControl();
}
}
private void Camera1Move()
{
this.gameObject.transform.Translate(Input.GetAxis("Horizontal") * speed * Time.deltaTime, 0, Input.GetAxis("Vertical") * speed * Time.deltaTime );
}
private void MouseControl()
{
rotation += GetmouseInput() * sensitivity * Time.deltaTime; //滑鼠移動
this.gameObject.transform.localEulerAngles = new Vector3(-rotation.y, rotation.x, 0); //滑鼠鏡頭角度
}
}
接著我們就細講囉~~
一樣先準備............一張椅子(角色)、一個不會掉下去的地板
#椅子讓他乾淨,不綁腳本(Script)在身上
剛剛有說把滑鼠變成移動視角嘛,換句話說就是椅子就要跟相機一起。
所以就是把相機(視角)椅子(物件)用空物件(GameObject)綁一起。
像是這樣!!(這時候要確認一下,空物件跟相機的XYZ座標要對得上哦)
好~等等會把平移+視角的移動寫在同一個腳本,並且賦予在空物件上
新增一個腳本 叫ChairCameraMove
,先把他加在Character(空物件)上
打開腳本後,我們先處理平移部分
打個速度的公開變數,等等才可去外面方便調整
public float speed = 1.0f;
之後寫一個移動的方法
private void
CharacterMove
()
{
this.gameObject.transform.Translate(Input.GetAxis("Horizontal") * speed * Time.deltaTime, 0, Input.GetAxis("Vertical") * speed * Time.deltaTime);
}
CharacterMove
();
移動跟之前一樣,讓他每分每秒都要持續偵測,所以要寫在Update 方法內讓他跑。
不過跟之前比較不一樣。之前是直接打在Update裡面嘛,要另外寫個方法是因為,後續如果有B、C、D等等角色也想要這方法,直接呼叫方法名稱就可以用了。
這前一個腳本打的 :)
(先試看看可不可以正常移動)
OK就繼續下一步,滑鼠移動~~
宣告三個變數 ROTATION、SENSITIVITY、GAMEMOUSEINPUT
private Vector2 rotation; //旋轉值
public Vector2 sensitivity; //滑鼠靈敏度
private Vector2 GetmouseInput()
{
Vector2 input = new Vector2(Input.GetAxis("Mouse X"), Input.GetAxis("Mouse Y"));
return input;
}
#
Input.GetAxis("Mouse X")
和 Input.GetAxis("Mouse Y")
來獲取滑鼠在水平方向和垂直方向上的移動。Vector2
向量中並返回。然後寫一個方法滑鼠移動~~
private void
MouseControl()
{
rotation += GetmouseInput() * sensitivity * Time.deltaTime; //滑鼠移動
this.gameObject.transform.localEulerAngles = new Vector3(-rotation.y, rotation.x, 0); //滑鼠鏡頭角度
}
rotation.x
用來控制水平方向的旋轉(左右)。rotation.y
用來控制垂直方向的旋轉(上下),並且取反(-rotation.y
),這樣滑鼠向上移動時視角會向上移動,向下移動時視角會向下移動,符合一般用戶的操作習慣。2D 3D邏輯有點不一樣 :)
#這個如果不懂正負,直接遊戲試試比較快~
+=這什麼,他是指定運算子,舉例最快~~
i=5; ....這個很直覺就是i等於5,沒錯吧
i+=5;...那這個的話大家就比較不知道了,因為我們平常不會這樣算,他就是 i=i+5,會一直壘加上去
那如果我把剛剛 rotation 的+拿掉 ,就會變成,每次動都會歸零。不適用於轉視角這~
再把Rigidbody的Rotation凍結起來~,不然撞到東西會東倒西歪
最後成果展示,變得更讚了~