最近在做一个射击游戏,需要做子弹的反弹效果:即当子弹碰撞到物体的时候可以向光线反射一样改变方向射击。
本来是想着可以利用unity自带的物理效果加力加碰撞来做,可是效果不好,不知道是我调的参数不对还是制作姿势不对,反正就是达不到光线一下反射的效果。
后来不得已改变思路,直接计算路线改变位移来实现。简单来说就是根据光线反射原理,知道入射向量,法向量,从而计算出反射向量,然后改变子弹移动方向为该反射向量。
主要用到的函数为Vector3.Reflect(inDir, inNor);
在实现的过程中最为难的一点就是纠正子弹的朝向,应该是美术资源的问题吧,我在制作的时候子弹路线很对,就是朝向不对,或许是自身坐标和世界坐标转化的问题,想到用Transform.TransformDirection()和Transform.InverseTransformDirection()来进行转化,也能实现。后来经过测试修改根本不用这样麻烦直接在世界坐标系上使用向量计算完成之后将Transform.forward改为反射向量就ok啦。
总而言之,制作该效果的时候卡到的问题就是子弹改变方向之后朝向纠正问题。做完了还是有点儿搞不明白,我觉得问题还是美术资源本身坐标和世界坐标的问题。
不过总算把想要的效果达到了,还算是happy。
补充:
以上的做法是需要将子弹的collider作为碰撞器来使用,在利用OnCollisionEnter方法的参数Collision可以直接获取碰撞点的法线,计算方便。
可是由于某种原因当子弹的collider需要作为触发器来使用,其OnTriggerEnter方法的参数Collider可不能直接获取到碰撞点的法线,为此没少头疼(为什么该方法就不可以呢)。最终想到一个方法,可以在发射子弹的时候同时在方向上发射一条射线做射线检测RayCast,其参数RaycastHit中可以获取入射点法线,从而继续利用上面的原理,实现反弹效果。唉,实现一个功能真不容易~