游戏开发时犯的一些小错误及改正方法

博客围绕游戏开发中的碰撞检测等问题展开。包括人物行走离开地面是因碰撞检测错开;子弹碰到玩家消失、碰到其他物体不消失的原因及解决办法;子弹生成自带位置偏移量的问题及处理;人物跳到平台左右移动卡砖块的原因是tilemap砖块图形多层,建议不同层级不用一个tilemap。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

在这里插入图片描述
在这里插入图片描述
1.注意这里,本来人物是与地面有接触(甚至穿模),当让人物自己行走的时候,会出现离开地面一段距离,这是为什么呢。是因为人物与地面发生了碰撞检测,导致错开。

2.为什么当我给子弹添加上了这个脚本之后,当子弹碰到玩家的时候子弹会消失,但是碰到其他物体的时候,子弹不会消失呢?

碰撞检测与触发检测的知识点没有完全弄明白:
首先是碰到了这样的问题:
在这里插入图片描述

那首先需要明白“触发”所需的条件
其中一个物体是刚体,其中一个物体是触发器即可,且两个物体的碰撞体积有相交的部分。
可以其中一个物体既是刚体也是触发器(例如我们让子弹具有这个属性)
也可以一个物体是刚体,另外一个刚体是触发器。
当然两个物体都是触发器,两个物体都是刚体也是可以的。

(带有角色控制器的话也会算入“具有刚体”这样的条件)

因此一般来说,让子弹实现碰到其他物体后便消失,我们是选择让子弹本身就具有刚体和触发器的属性。然后使用以下函数:

    private void OnTriggerEnter(Collider other)
    {
       Destroy(this.gameObject);
    }

但是如果子弹的生成方式如图:在物体周围生成子弹,那么子弹和子弹,还有子弹和产生子弹的这个方块也会发生触发函数,所以也会消失
在这里插入图片描述

因此我们就需要这样:

    private void OnTriggerEnter(Collider other)
    {
        if (other.tag == "Bullet")
        {
            return;
        }
        else
        {
            if (other.gameObject.tag == "Player")
            {
                Destroy(other.gameObject);
                SceneManager.LoadScene(SceneManager.GetActiveScene().buildIndex);
            }
            //Debug.Log("11111");
            Destroy(this.gameObject);
        }


    }

总结一下的话应该就是:子弹碰到任何其他物体(除了子弹自身(通过标签实现)),子弹都会消失
为了这么做,得给子弹添加上刚体和触发器,并给子弹自身添加上标签

这样就成功了。


3.将子弹拖拽到场景中时如果位置不是零,在生成子弹的时候,会使得子弹不是在母体的位置生成而是会自带位置偏移量
在这里插入图片描述
这是因为一开始直接拖拽到场景里 然后位置不是0 然后就拖拽到文件里面成为预制体了结果自带位置偏移量,那么生成子弹时就会自带偏移量
在这里插入图片描述
清零后效果正常。在这里插入图片描述


4.在设定人物从下往上跳到平台上时
当人物左右移动时会出现卡到砖块间的bug
在这里插入图片描述
(此时平台具有这些组件)
在这里插入图片描述

这是因为这个tilemap的砖块图形中包含了多层,这时候这个弧形会变成这样
在这里插入图片描述
如果只有一层,弧形会是这样,此时人物不会卡到砖块间
在这里插入图片描述
说明这种不同层级间最好不要用一个tilemap来实现

Input.GetMouseButton(0)
和Input.GetMouseButtonDown(0)

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值