在做射击游戏的时候(尤其是第三人称越肩),我们可能会用Raycast去做面向前方的射线检测。
RaycastHit hit;
if (Physics.Raycast(transform.position, transform.forward, out hit, MaxDistance))
{
// 子弹击中目标,触发技能效果
Debug.Log($"[{GetType()}] 子弹击中目标:{hit.collider.name}");
DoDamage(hit.collider);
}
看似没什么问题,但有的时候会感觉朝向有些偏移,命中率不高。这种情况一般都是跟父级物体的rotation、轴向有些关系,尤其是我们在做人物IK瞄准、动画的时候。可能会因为各个骨骼IK权重的不同等原因,实际上枪口不一定是真的、绝对的朝向目标。
如果要做到接近指哪打哪的程度,我们可以在做射线检测之前做如下调整,这个调整建议放在子弹Instantiate那块,把子弹的rotation给调整一下。
假设之前的子弹出生是这个样子:
projectileSpawnRotation = AimTransform.rotation;
* AimTransform指枪口。
调整后应该是这个样子:
projectileSpawnRotation = Quaternion.LookRotation(_ik.Aim.solver.IKPosition - AimTransform.position);
区别在于我们不完全依赖于枪口的旋转,我们会将瞄准的点和枪口位置相减,算出来以枪口为参考系的朝向。这样的话基本能提高我们子弹的命中率。
Anyway, happy programming!