Unity3D 移動物體方式總結

2021-10-03 12:18:44 字數 3285 閱讀 7356

在unity 3d中很多時候我們會想要移動乙個物體到別的位置,如讓想人物跑動起來,或者想要移動相機來跟隨人物。有很多種方法可以改變物體的座標,實現移動的目的,移動的本質是在每一幀中修改物體的position。在這裡把之前使用過的移動物體的方法做乙個總結。

transform 元件用於描述物體在空間中的狀態,它包括位置(position), 旋轉(rotation)和 縮放(scale)。 所有的移動都會導致position的改變,所以我們可以通過直接操作transform來控制物體的位置(position),而不用考慮碰撞。我們把他寫在update函式中,每一幀都呼叫變換乙個位置,看起來就是在移動。

1.transform.position = new vector3 targetpos

targetpos是乙個vector3的向量,是我們想要到達的座標位置,我們可以這樣:transform.position = new vector3(0, 1, 0),這樣物體就會直接到(0, 1, 0)這個位置。嚴謹來說對transform.position直接複製並不能稱作移動,而是直接改變物體的座標。

如果我們想要移動相機追隨物體移動時就可以在update函式中每一幀獲取物體的position,然後加上相機和物體初始的偏移量就可以讓物體一直出現在我們的鏡頭中了。

1.transform.translate(vector3 ,指定參照座標系(預設為space.self))

這裡的第乙個引數也是乙個vector3的向量,不同於上面transform.position中的vector3向量,它不是乙個位置座標。我們可以這麼寫:transform.translate(vector3.forward * time.deltatime * speed),vector3.forward是乙個向前的方向,time.deltatime是每一幀的增量時間,speed是我們自己定義的速度,也就是希望物體每秒移動的距離(如果不懂的可以看看另一位大大寫的這篇部落格,寫到很通俗易懂unity增量時間time.deltatime詳解)。第二個引數是參照座標系,預設為space.self,以自身為座標系,space.world是世界座標系。

rigidbody元件用於模擬物體的物理狀態,比如物體所受重力影響,物體被碰撞後的擊飛等等。

注意:關於rigidbody的呼叫均應放在fixedupdate方法中,該方法會在每一次執行物理模擬前被呼叫。

1.rigidbody.velocity = vector3

使用方法:rigidbody.velocity = vector3.forward * speed,讓物體向前以我們給的速度前進。

設定剛體速度可以讓物體運動並且忽略靜摩擦力,這會讓物體快速從靜止狀態進入運動狀態。

2.rigidbody.addforce()

使用方法:rigibody.addforce(transform.forward * thrust),這裡thrust是我們自己定義的乙個推力,它會給物體乙個向前的大小為thrust的推力,由於rigidbody的物理屬性而像前移動。這種方式適合模擬物體在外力的作用下的運動狀態。

3.rigidbody.moveposition(vector3 targetpos)

使用方法:rigidbody.moveposition(transform.position + new vector3(1, 0, 0)),讓物體從當前位置沿x軸移動一公尺。

剛體受到物理約束的情況下,移動到我們指定的位置。unity會幫我們在任何呈現的中間幀中都實現兩個位置之間的平滑過渡,讓我們感覺在連續的移動物體。

charactercontroller元件是乙個角色控制器元件,我們也可以通過它來控制物體移動。charactercontroller用於控制第一人稱或第三人稱角色的運動,使用這種方式可以模擬人的一些行為,比如限制角色爬坡的最大斜度,步伐的高度等。

1.******move()

使用方法:charactercontroller.******move(vector3.forwrd * time.deltatime * speed)

******move方法用於模擬簡單運動,並且自動應用重力,返回值表示角色當前是否著地。

2.move()

使用方法:charactercontroller.move(vector3.forwrd * time.deltatime * speed)

move方法模擬更複雜的運動,重力需要通過**實現,返回值表示角色與周圍的碰撞資訊。

vector3 既可以表示三維空間中的乙個點,也可以表示乙個向量。可以用vector3.lerp, vector3.slerp, vector3.movetowards這幾個方法。這三個方法均為插值方法, lerp為線性插值,slerp為球形插值, movetowards在lerp的基礎上增加了限制最大速度功能。 當需要從指定a點移動到b點時,可以考慮時候這些方法。

1.vector3.lerp()

使用方法:vector3.lerp(transform.position, targetpos, smoothing * time.deltatime)

第乙個引數是物體初始位置的座標,第二個引數是目標位置的座標,第三個引數是移動速度,smoothing是我們自己定義的平滑程度值,它的大小決定了從初始位置到目標位置移動的平滑程度。一般在移動相機時,我們會使用這個方法,使視野的移動更加平滑。

2.vector3.movetowards()

使用方法:vector3.movetowards(transform.position, targetpos,  maxdelta * time.deltatime)

其中前面兩個引數和lerp一樣,maxdelta是我們自己定義的,每次向目標點移動的距離。

3.vector3.slerp()

球型差值

4.vector3.smoothdamp()

使用方法:vector3.smoothdamp(vector3current, vector3target, ref float currentvelocity, float smoothtime, float maxspeed)

current是當前位置,target是目標位置,currentvelocity是當前速度(必須是乙個全域性變數),smoothtime是到達目標位置的時間,maxspeed是最大速度(預設為無窮大)。

Unity3D 物體移動方式總結

在unity3d中,有多種方式可以改變物體的座標,實現移動的目的,其本質是每幀修改物體的position。transform 元件用於描述物體在空間中的狀態,它包括 位置 position 旋轉 rotation 和 縮放 scale 其實所有的移動都會導致position的改變,這裡所說的通過tr...

Unity3D 物體移動方式總結

在unity3d中,有多種方式可以改變物體的座標,實現移動的目的,其本質是每幀修改物體的position。transform 元件用於描述物體在空間中的狀態,它包括 位置 position 旋轉 rotation 和 縮放 scale 其實所有的移動都會導致position的改變,這裡所說的通過tr...

Unity3D 物體移動方式總結

在unity3d中,有多種方式可以改變物體的座標,實現移動的目的,其本質是每幀修改物體的position。transform 元件用於描述物體在空間中的狀態,它包括 位置 position 旋轉 rotation 和 縮放 scale 其實所有的移動都會導致position的改變,這裡所說的通過tr...