文章目录
- 前言
- 第一种解决思路
- 第二种方法
- 总结
- 感谢
- 完结
前言
当我们开发FPS游戏时(其实3d游戏基本都会遇到这样的问题),如果我们不做处理,肯定会出现人物或者枪的穿墙穿模问题,这是是一个常见的挑战。
这种问题会破坏游戏的真实性和可玩性,使玩家的体验受到影响。在这篇文章中,我将分享一些Unity小技巧,介绍如何解决FPS游戏枪的穿墙穿模问题。无论你是初学者还是经验丰富的开发者,本文都将为你提供有用的技术参考和实践经验。
第一种解决思路
就是新增一个摄像机,并将每个摄像机分配给不同的__深度 (Depth),用来单独渲染我们的人物(包括枪)
关于深度 (Depth)我们看看官方文档的解释
也就是深度 (Depth)值越大越优先渲染,默认摄像机设置为0
理论成立,我们来实践一下
我们把人物和枪都设置为player层,主相机不在渲染player层物体
在主相机下在新建一个摄像机,用于单独渲染player层,配置如下,这样就可以了,简单吧?
运行看看效果
这种我愿称之为自欺欺人法,可以看到,枪实际其实是已经穿模了,但是我们的视角看到是没有的
第二种方法
这是参考youtube大佬的解决思路:https://www.youtube.com/watch?v=bax-xjlfMPs
可以参考其他游戏的解决思路,大概就是人物碰壁旋转我们的武器
新增ClipPrevention 脚本,挂载在要旋转的武器上,大概的逻辑就是在角色前做一个射线检测,如果碰到墙壁则旋转武器
public class ClipPrevention : MonoBehaviour
{
public GameObject clipProjector;//检测点
public LayerMask layerMask;//检测层级
public float checkDistance;//检测距离
public Vector3 newDirection;//武器碰壁旋转参数
float lerpPos;
RaycastHit hit;
void Update()
{
// 发射射线,检测是否碰撞到物体
if (Physics.Raycast(clipProjector.transform.position, clipProjector.transform.forward, out hit, checkDistance, layerMask))
{
// 计算当前距离与最大距离之间的百分比
lerpPos = 1 - (hit.distance / checkDistance);
}
else
{
// 如果没有碰撞到任何物体,将百分比设为0
lerpPos = 0;
}
// 限制百分比在0到1之间
lerpPos = Mathf.Clamp01(lerpPos);
// 使用插值方法改变物体的旋转角度
transform.localRotation = Quaternion.Lerp(
Quaternion.Euler(Vector3.zero), // 指向正前方
Quaternion.Euler(newDirection), // 指向侧边
lerpPos // 两者之间的百分比位置
);
}
//在场景视图显示检测,方便调试
private void OnDrawGizmos()
{
Debug.DrawRay(clipProjector.transform.position, clipProjector.transform.forward * checkDistance, Color.red);
}
}
在人物前面放个检测点,射线检测和配置如下
效果
注意
:如果你的射击是通过摄像机发射的方法实现的,碰壁点击射击肯定还有问题,子弹还是朝前开的,解决思路是你可以在碰壁时改变发射口的位置到枪口,这样子弹就变为从枪口射出了,或者直接暴力的碰壁禁止射击,具体就看你自己的需求了
总结
第一种方法最大的优点就是简单,但是如果你有第三人称视角或者联机游戏,可能他就并不适合,在别人眼里你还是穿模的,这时候就需要考虑使用第二种方法了。
这里我只研究了两种方法,如果你还有其他好办法,也欢迎分享出来。
感谢
【视频】https://www.youtube.com/watch?v=bax-xjlfMPs
完结
赠人玫瑰,手有余香!如果文章内容对你有所帮助,请不要吝啬你的点赞评论和关注
,以便我第一时间收到反馈,你的每一次支持
都是我不断创作的最大动力。当然如果你发现了文章中存在错误
或者有更好的解决方法
,也欢迎评论私信告诉我哦!
好了,我是向宇
,https://xiangyu.blog.csdn.net
一位在小公司默默奋斗的开发者,出于兴趣爱好,最近开始自学unity,闲暇之余,边学习边记录分享,站在巨人的肩膀上,通过学习前辈们的经验总是会给我很多帮助和启发!php是工作,unity是生活!如果你遇到任何问题,也欢迎你评论私信找我, 虽然有些问题我也不一定会,但是我会查阅各方资料,争取给出最好的建议,希望可以帮助更多想学编程的人,共勉~