溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊(cè)×
其他方式登錄
點(diǎn)擊 登錄注冊(cè) 即表示同意《億速云用戶服務(wù)條款》

Unity3D場(chǎng)景漫游以及碰撞防止反彈

發(fā)布時(shí)間:2020-08-03 08:59:42 來(lái)源:網(wǎng)絡(luò) 閱讀:8326 作者:速度速度撒 欄目:游戲開(kāi)發(fā)

這兩天一直在做一個(gè)漫游的東西,漫游的代碼,網(wǎng)上各種各樣,都有,但是在漫游的過(guò)程中出現(xiàn)一個(gè)問(wèn)題,那就是碰到墻壁之后會(huì)穿墻,或者是會(huì)反彈,攝像機(jī)一直在抖動(dòng),這樣看起來(lái)很不爽,

漫游的程序就不多少了,有好多,我這用了兩種:

  1.采用滑動(dòng)的偏移量來(lái)控制移動(dòng),這包括三種,

      第一一種是鼠標(biāo)的Input.GetMouseButtonDown(0)和Input.GetMouseButton(0)計(jì)算偏移量;

      第二種就是使用虛擬軸

      float offetX = Input.GetAxis("Mouse X");//左右滑動(dòng)

      float offetY = Input.GetAxis("Mouse Y");//上下滑動(dòng)

      來(lái)控制移動(dòng)和旋轉(zhuǎn);

      第三種,采用就是移動(dòng)平臺(tái)下的手指滑動(dòng),這個(gè)也有好多,也可以用

FingerGestures插件;

     這個(gè)可以看一看宣雨松的博客,講的很詳細(xì),http://www.xuanyusong.com/archives/1869

     也可以用Input.GetTouch(0)手指滑動(dòng);

  總之一句話就是用的偏差量來(lái)控制移動(dòng)和旋轉(zhuǎn);

 2.防止攝像機(jī)穿墻:

   相碰的兩個(gè)物體都要添加Collider,運(yùn)動(dòng)的那個(gè)物體定要加剛體(給攝像機(jī)加一個(gè)Capsule子對(duì)象,將Collider和Rigidbody加載Capsule的父對(duì)象身上),但是防止穿墻就得靠Rigidbody組件的Constraints屬性了,分別有Freeze Position(x,y,z)和Freeze Rotation(x,y,z);固定位置和角度,Freeze Rotation(x,y,z)勾上哪一個(gè)軸,碰撞之后不超哪一個(gè)軸旋轉(zhuǎn),F(xiàn)reeze Position(x,y,z)控制位置,防止穿墻,x和z軸不能勾,這樣碰撞之后就不會(huì)穿墻。

 3.防止碰撞反彈

    這個(gè)也不是很難,就是想不到這個(gè)問(wèn)題出在哪,你看了之后就會(huì)明白,其實(shí)作為剛體,gameObject運(yùn)動(dòng)之后,rigidbody.velocity的值是不為Vector(0,0,0),作為剛體,碰撞后本來(lái)就會(huì)反彈,因而會(huì)一直在動(dòng),朝著反彈的方向,所以很鬧心,但是我們可以將rigidbody.velocity歸0,沒(méi)有速度了就不會(huì)反彈了,因?yàn)槭俏锢硖匦缘?,所以不要寫在Update中,

 void FixedUpdate()

  {

    this.GetComponent<Rigidbody>().rigidbody.velocity = new Vector3(0, 0, 0);

  }

這就完美的解決了,如果有問(wèn)題,提出來(lái)我們繼續(xù)討論

向AI問(wèn)一下細(xì)節(jié)

免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如果涉及侵權(quán)請(qǐng)聯(lián)系站長(zhǎng)郵箱:is@yisu.com進(jìn)行舉報(bào),并提供相關(guān)證據(jù),一經(jīng)查實(shí),將立刻刪除涉嫌侵權(quán)內(nèi)容。

AI