Unity 之第一人稱無重力控制器

2021-07-30 16:44:40 字數 2433 閱讀 9613

最近在專案中遇到乙個需求,要求軟體中人物的操作為第一人稱視角,並且不包含重力。要求使用者可以自定義重力。

在經過一番思考之後,我想到了一種解決方案,那就是通過控制相機物體的transform屬性,來對相機進行移動。至於相機的視角,我參考了unity自帶的第一人稱視角控制器的**來實現。經過一番折騰是實現了,但是在測試過程中發現了乙個問題。

那就是

在移動過程中,相機穿越了牆壁!!!!

就算給相機物體新增乙個立方體gameobject作為父物體,並且給該父物體新增剛體,也還是沒有用。牆壁的碰撞器雖然會觸發碰撞事件。但是並沒有作用,相機還是會穿越牆壁。這樣完全不符合實際的使用需求。經過一番思考,猜測,驗證。並參考了系統的firstpersoncontroller檔案,終於找到了原因。原因是對於相機的移動,我是直接了對物體的transform值進行更改來使物體移動,這樣我雖然給物體新增了剛體,但是物體並有進行物理**動,因此物體不會遵循物理**動現象。

知道了原因,那麼就好結局了,既然是因為我對物體進行移動的操作方式有問題,那就換一種操作方式。unity有提供定義好的第一人稱控制器,那我去修改一下控制器的**,變成我需要的**即可。

在研究了unity自帶的控制器**之後,我發現unity對於移動物體的方式是,對需要移動的物體施加力來進行移動。通過獲取物體的rigidbody屬性,然後通過addforce的方式,來對物體進行移動。並且找到了控制器是通過sticktogroundhelper方法將物體固定在地板上,原理是物體向下發射一條射線,如果射線的長度不為0,物體會向下運動。那麼是要將sticktogroundhelper方法去除,剩下的**進行保留,那麼就可以實現最基本的無重力第一人稱視角。再通過自定義按鍵,給物體新增向上或者向下的力,來控制物體的向上或者向下運動,就能實現第一人稱無重力控制器。

最終的實現**如下:

public transform target; 

private

float slidermousevalue = 0.5f;

public

bool isscalefabric = false;

public

float keyboardspeed = 2f;

[serializable]

public

class movementsettings

if (input.y < 0)

if (input.y > 0)}}

public camera cam;

public movementsettings movementsettings = new movementsettings();

public mouselook mouselook = new mouselook();

private rigidbody m_rigidbody;

private

void

start()

private

void

update()

rotateview();

}if (input.getkeydown(keycode.z) && !isscalefabric && panels.canedit)

}private

void

inputkeydownz () else

}private

void

fixedupdate()

// }

m_rigidbody.drag = 5f;

// if (mathf.abs(input.x) < float.epsilon && mathf.abs(input.y) < float.epsilon && m_rigidbody.velocity.magnitude < 1f)

//

if (input.getkey(keycode.q))

if (input.getkey(keycode.e))}}

private vector2 getinput()

;movementsettings.updatedesiredtargetspeed(input);

return input;

}private

void

rotateview()

public

void

changemousespeed (uislider slider)

ps:如果需要更改視角的旋轉速度,可以參考**中的changemousespeed方法,另外如果移動速度過快,肯能會導致unity來不及檢測碰撞進行處理,最終使得物體仍然穿越牆壁。建議速度不要過大,另外也可以開啟unity中的 edit –> project settings –> time 的屬性面板,通過調節fixed timestep屬性值,來縮短檢測時間。

openGL實現第一人稱視角

最近做的乙個題目要求用opengl實現乙個漫遊功能,雖然不知道這個漫遊是不是指第一人稱 其實我覺得第三人稱俯視的那種也算 不過都差不多 主要使用opengl的glulookat函式,通過計算球面座標來實現 目錄 glulookat 實現過程 demo 最終效果 void glulookat gldo...

Unity第一人稱控制器踩坑記錄

在一次把2017的工程公升級到2018後,場景中有個動態建立第一人稱角色控制器的功能,在公升級後此功能建立出來的位置賦值無效,每次建立都會回到預製體原點,經過一步步查詢原因,是由於是unity2017自帶資源firstpersoncontroller中的問題,m collisionflags m c...

第一人稱視角漫遊(unity 暴風魔鏡)

沒用的話就不說了,直接開始。1 開啟unity,將場景的攝像機刪除掉。找到mojingmain.prefab,新增到場景中。2 搭建場景。3 場景中新增mojingfirstcharactercontroller.prefab和integrateinputmanager.prefab 4 建立乙個空...