Unity——控制物體移動的方法

原文鏈接:https://blog.csdn.net/liyuerge/article/details/79134337

控制物體移動的三種方法

一、常規方法

 //四個方向
        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 :力的方式


額額,差不多就是這樣,對於這裏函數的使用,大概就是這樣,但是在遊戲中如果追求更好的模擬真實場景中的效果,大家還是要多多練習,沒有實際練習過,你是想象不出效果來的。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章