控制物體移動的三種方法
一、常規方法
//四個方向
if (Input.GetKey(KeyCode.W))
{
transform.Translate(Vector3.forward*moveSpeed*Time.deltaTime);
}
if (Input.GetKey(KeyCode.S))
{
transform.Translate(Vector3.back * moveSpeed * Time.deltaTime);
}
if (Input.GetKey(KeyCode.A))
{
transform.Translate(Vector3.left * moveSpeed * Time.deltaTime);
}
if (Input.GetKey(KeyCode.D))
{
transform.Translate(Vector3.right * moveSpeed * Time.deltaTime);
}
二、使用unity自帶的移動方式
float H = Input.GetAxis("Horizontal");
float V = Input.GetAxis("Vertical");
if (H!=0 || V!=0)
{
transform.Translate(new Vector3(H,0,V)*Time.deltaTime*moveSpeed,Space.World);
}
else
{
//沒有移動
}
三、通過剛體控制移動(必須添加剛體)
//通過剛體控制物體移動,需要添加剛體
Vector3 moveForward = Vector3.zero;
if (Input.GetKey(KeyCode.W))
{
moveForward.z += 1;
}
if (Input.GetKey(KeyCode.S))
{
moveForward.z += -1;
}
if (Input.GetKey(KeyCode.A))
{
moveForward.x += -1;
}
if (Input.GetKey(KeyCode.D))
{
moveForward.x += 1;
}
GetComponent<Rigidbody>().MovePosition(Quaternion.LookRotation(transform.forward) * moveForward * moveSpeed * Time.fixedDeltaTime + transform.position);
Unity3D 物體移動方式總結
1. 簡介
在unity3d中,有多種方式可以改變物體的座標,實現移動的目的,其本質是每幀修改物體的position。
2. 通過Transform組件移動物體
Transform 組件用於描述物體在空間中的狀態,它包括 位置(position), 旋轉(rotation)和 縮放(scale)。 其實所有的移動都會導致position的改變,這裏所說的通過Transform組件來移動物體,指的是直接操作Transform來控制物體的位置(position)。
2.1 Transform.Translate
該方法可以將物體從當前位置,移動到指定位置,並且可以選擇參照的座標系。 當需要進行座標系轉換時,可以考慮使用該方法以省去轉換座標系的步驟。
public function Translate(translation: Vector3, relativeTo: Space = Space.Self): void;
2.2 Vector3.Lerp, Vector3.Slerp, Vector3.MoveTowards
Vector3 既可以表示三維空間中的一個點,也可以表示一個向量。這三個方法均爲插值方法, Lerp爲線性插值,Slerp爲球形插值, MoveTowards在Lerp的基礎上增加了限制最大速度功能。 當需要從指定A點移動到B點時,可以考慮時候這些方法。
2.3 Vector3.SmoothDamp
該方法是可以平滑的從A逐漸移動到B點,並且可以控制速度,最常見的用法是相機跟隨目標。
2.4 Transform.position
有時重新賦值position能更快實現我們的目標。
3. 通過Rigidbody組件移動物體
Rigidbody組件用於模擬物體的物理狀態,比如物體受重力影響,物體被碰撞後的擊飛等等。
注意:關於Rigidbody的調用均應放在FixedUpdate方法中,該方法會在每一次執行物理模擬前被調用。
3.1 Rigidbody.velocity
設置剛體速度可以讓物體運動並且忽略靜摩擦力,這會讓物體快速從靜止狀態進入運動狀態。
3.2 Rigidbody.AddForce
給剛體添加一個方向的力,這種方式適合模擬物體在外力的作用下的運動狀態。
3.3 Rigidbody.MovePosition
剛體受到物理約束的情況下,移動到指定點。
4. 通過CharacterController組件移動物體
CharacterController用於控制第一人稱或第三人稱角色的運動,使用這種方式可以模擬人的一些行爲,比如限制角色爬坡的最大斜度,步伐的高度等。
4.1 CharacterController.SimpleMove
用於模擬簡單運動,並且自動應用重力,返回值表示角色當前是否着地。
4.2 CharacterController.Move
模擬更復雜的運動,重力需要通過代碼實現,返回值表示角色與周圍的碰撞信息。
unity物體移動三種方式之——Transform.Translate
在unity中,經常遇到的一個問題就是物體移動的問題,Unity引擎給出了很多種解決方案,這裏先給大家介紹一種——Transform.Translate函數。
在Unity中這是最基礎的一種物體移動的方式之一,物體會按照你給的速度方程移動。
首先,我們先創建一個場景,加入一個Terrain或者是Plane,這裏我加的是Terrain,爲了美觀,我在Terrain上刷了一層草地,繪製了一個小山包,然後添加一個Sphere,作爲我們要移動的對象。新建一個腳本move.cs,綁定到腳本上,並在vs中打開:
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
public class move : MonoBehaviour {
// Use this for initialization
void Start () {
}
// Update is called once per frame
void Update () {
//使小球按照y軸正方向以每幀1的單位長度移動
transform.Translate(Vector3.up * Time.deltaTime, Space.World);
}
}
效果圖:
transform.Translate()函數中,前一個變量是物體的移動速度,這裏的速度是一個矢量,既包含大小寫包含方向,後一個變量是相對座標系,這裏的相對座標系有兩個值,一個是世界座標,一個是自身座標,如果第一個座標不填寫的話,默認爲自身座標系。這裏我們將座標體系修改爲自身座標系看一下效果:
transform.Translate(Vector3.up * Time.deltaTime, Space.Self);
這裏我爲了看到效果,將小球按照x軸旋轉了90°。
我們還可以這樣:
transform.Translate(new Vector3 (1,1,1) * Time.deltaTime, Space.World);
通過這個函數,我們可以將控制物體按照任何方向進行移動
unity物體移動三種方式之——AddForceAtPosition(二)
上次介紹了給物體施加力的一個函數AddForcePosition(),介紹了這個函數的三個參數和效果,今天我們繼續來介紹這個函數。
這個函數是通過給物體施加力的方式,來使物體運動,我們都學過牛頓三定律,物體的的速度受物體質量的影響,當你用10N的力去推一個質量爲1kg的物體和一個100kg的物體的時候(沒有阻力的情況下),他們的速度是不相同的。同樣,在untiy中,這個道理同樣成立,因爲unity本來就可以模仿真實世界的受力情況。讓我們來看一下。
首先來說,使用 AddForcePosition()函數的物體,本身必須有Rigibody組件,在Rigibody組件中我們可以選擇物體是否受重力影響,
第一個紅框是代表物體的質量(密度),第二個紅框代表是否受重力影響,其他參數,大家可以參考官方文檔,可以點擊組件右上角的小書(帶一個小問號)的按鈕即可。
現在,我再代碼中將物體質量設置爲5,我們來看效果:
我們可以看出小球速度非常快,輕易就擊倒了目標,
我們再看看我將小球質量調整爲30以後的效果:
小球的速度變得非常慢。
這裏我們可以看出質量對於物體的運動速度的影響(恆力條件下),所以,我們在用這個函數的時候,一定要注意物體的質量。
unity物體移動三種方式之——AddForceAtPosition
上次說了物體移動的三種方式中的Transform.Translate,今天我們來說說另外一種方式——AddForceAtPosition()。這種方式是通過給物體目標方向上的一個力,讓物體運動,就好比你投籃,給了籃球一個朝向球籃方向的力。
效果如圖:
代碼如下:
if(Input.GetMouseButton(0))
{
Ray ray = Camera.main.ScreenPointToRay(Input.mousePosition);
RaycastHit hit;
if(Physics.Raycast(ray, out hit))
{
if(hit.collider.name =="Cube")
{
Vector3 direction = hit.transform.position - obj.transform.position;
//發射炮彈
obj.GetComponent<Rigidbody>().AddForceAtPosition(direction, hit.transform.position,ForceMode.Impulse);
}
}
}
帶註釋的那一句,就是給小球在hit.transform.position位置上施加一個direction大小的forceMode.Impulse方式的力
函數的官方解釋:
public void AddForceAtPosition(Vector3 force, Vector3 position, ForceMode mode = ForceMode.Force);
其中三個參數:
Vector3 force:力(矢量)
Vector3 position:施加力的位置
ForceMode mode :力的方式
額額,差不多就是這樣,對於這裏函數的使用,大概就是這樣,但是在遊戲中如果追求更好的模擬真實場景中的效果,大家還是要多多練習,沒有實際練習過,你是想象不出效果來的。