【unity小技巧】两种办法解决FPS游戏枪或者人物穿墙穿模问题

简介: 【unity小技巧】两种办法解决FPS游戏枪或者人物穿墙穿模问题

前言

当我们开发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);
    }
}

在人物前面放个检测点,射线检测和配置如下

效果

image.png

注意:如果你的射击是通过摄像机发射的方法实现的,碰壁点击射击肯定还有问题,子弹还是朝前开的,解决思路是你可以在碰壁时改变发射口的位置到枪口,这样子弹就变为从枪口射出了,或者直接暴力的碰壁禁止射击,具体就看你自己的需求了

URP项目武器穿模相机处理?(2024/1/11补充)

URP项目相机参数有所不同,这里继续补充一下,实现和方法一一样的效果

主相机取消武器层的渲染

新建一个相机单独渲染武器

总结

第一种方法最大的优点就是简单,但是如果你有第三人称视角或者联机游戏,可能他就并不适合,在别人眼里你还是穿模的,这时候就需要考虑使用第二种方法了。

感谢

【视频】https://www.youtube.com/watch?v=bax-xjlfMPs

目录
相关文章
|
4天前
|
存储 JSON 关系型数据库
【unity实战】制作unity数据保存和加载系统——大型游戏存储的最优解
【unity实战】制作unity数据保存和加载系统——大型游戏存储的最优解
14 2
|
4天前
|
图形学
【制作100个unity游戏之29】使用unity复刻经典游戏《愤怒的小鸟》(完结,附带项目源码)(上)
【制作100个unity游戏之29】使用unity复刻经典游戏《愤怒的小鸟》(完结,附带项目源码)
10 2
|
4天前
|
图形学
【unity小技巧】Unity中实现一个战斗连击连招系统,可以动态添加减少连击连招段数功能
【unity小技巧】Unity中实现一个战斗连击连招系统,可以动态添加减少连击连招段数功能
5 0
|
4天前
|
存储 JSON 图形学
【unity实战】制作unity数据保存和加载系统——小型游戏存储的最优解
【unity实战】制作unity数据保存和加载系统——小型游戏存储的最优解
6 0
|
4天前
|
存储 图形学
【unity小技巧】unity事件系统创建通用的对象交互的功能
【unity小技巧】unity事件系统创建通用的对象交互的功能
7 0
|
4天前
|
图形学
【unity小技巧】unity通过代码进行更改后处理效果
【unity小技巧】unity通过代码进行更改后处理效果
6 0
|
4天前
|
图形学
【unity小技巧】unity3D寻路指示轨迹预测
【unity小技巧】unity3D寻路指示轨迹预测
10 0
|
4天前
|
图形学
【制作100个unity游戏之29】使用unity复刻经典游戏《愤怒的小鸟》(完结,附带项目源码)(下)
【制作100个unity游戏之29】使用unity复刻经典游戏《愤怒的小鸟》(完结,附带项目源码)(下)
8 0
|
4天前
|
存储 JSON 关系型数据库
【制作100个unity游戏之27】使用unity复刻经典游戏《植物大战僵尸》,制作属于自己的植物大战僵尸随机版和杂交版13(完结,附带项目源码)
【制作100个unity游戏之27】使用unity复刻经典游戏《植物大战僵尸》,制作属于自己的植物大战僵尸随机版和杂交版13(完结,附带项目源码)
11 0
|
4天前
|
图形学
【制作100个unity游戏之27】使用unity复刻经典游戏《植物大战僵尸》,制作属于自己的植物大战僵尸随机版和杂交版12(附带项目源码)
【制作100个unity游戏之27】使用unity复刻经典游戏《植物大战僵尸》,制作属于自己的植物大战僵尸随机版和杂交版12(附带项目源码)
11 0