天天看點

Unity中子彈反彈效果的制作

最近在做一個射擊遊戲,需要做子彈的反彈效果:即當子彈碰撞到物體的時候可以向光線反射一樣改變方向射擊。

本來是想着可以利用unity自帶的實體效果加力加碰撞來做,可是效果不好,不知道是我調的參數不對還是制作姿勢不對,反正就是達不到光線一下反射的效果。

後來不得已改變思路,直接計算路線改變位移來實作。簡單來說就是根據光線反射原理,知道入射向量,法向量,進而計算出反射向量,然後改變子彈移動方向為該反射向量。

主要用到的函數為Vector3.Reflect(inDir, inNor);

在實作的過程中最為難的一點就是糾正子彈的朝向,應該是美術資源的問題吧,我在制作的時候子彈路線很對,就是朝向不對,或許是自身坐标和世界坐标轉化的問題,想到用Transform.TransformDirection()和Transform.InverseTransformDirection()來進行轉化,也能實作。後來經過測試修改根本不用這樣麻煩直接在世界坐标系上使用向量計算完成之後将Transform.forward改為反射向量就ok啦。

總而言之,制作該效果的時候卡到的問題就是子彈改變方向之後朝向糾正問題。做完了還是有點兒搞不明白,我覺得問題還是美術資源本身坐标和世界坐标的問題。

不過總算把想要的效果達到了,還算是happy。

補充:

以上的做法是需要将子彈的collider作為碰撞器來使用,在利用OnCollisionEnter方法的參數Collision可以直接擷取碰撞點的法線,計算友善。

可是由于某種原因當子彈的collider需要作為觸發器來使用,其OnTriggerEnter方法的參數Collider可不能直接擷取到碰撞點的法線,為此沒少頭疼(為什麼該方法就不可以呢)。最終想到一個方法,可以在發射子彈的時候同時在方向上發射一條射線做射線檢測RayCast,其參數RaycastHit中可以擷取入射點法線,進而繼續利用上面的原理,實作反彈效果。唉,實作一個功能真不容易~

繼續閱讀