You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Unity2D俯视角类Diablo游戏:Tile Palette墙体与投射物碰撞失效求助

俯视角2D类Diablo游戏墙体与投射物碰撞失效问题

我正在Unity开发俯视角2D类Diablo游戏,遇到Tile Palette制作的墙体无法与投射物(手里剑)碰撞的问题:投射物会直接穿墙而过。已开启两者的Collider2D组件,且投射物与敌人的碰撞功能运行正常,经过数小时搜索仍未找到原因。

相关代码

投射物脚本

using System.Collections;
using System.Collections.Generic;
using UnityEngine;

public class Projectile : MonoBehaviour
{
    public float speed;
    public int damage;

    void OnCollisionEnter2D(Collision2D other)
    {
        if (other.gameObject.tag == "wall")
        {
            Destroy(this.gameObject);
        }
    }

    void Update()
    {
        transform.Translate(Vector3.up * speed * Time.deltaTime);
    }
}

墙体脚本

using System.Collections;
using System.Collections.Generic;
using UnityEngine;

public class WallsDestroys : MonoBehaviour
{
    void OnCollisionEnter2D(Collision2D other)
    {
        if (other.gameObject.tag == "Projectile")
        {
            Destroy(other.gameObject);
        }
    }
}

排查与解决方向

  • Tilemap碰撞组件配置:Tile Palette创建的墙体属于Tilemap对象,需确保:
    • 已添加Tilemap Collider 2D组件,且勾选Used By Composite;
    • 添加Composite Collider 2D组件(默认Tilemap碰撞是分散的小碰撞体,Composite可合并为连续碰撞区域,避免投射物从缝隙穿过)。
  • 碰撞体模式检查:确认投射物和墙体的Collider2D组件均未勾选Is Trigger(触发模式不会触发OnCollisionEnter2D)。
  • 图层碰撞矩阵验证:打开Edit > Project Settings > Physics 2D,检查投射物所在图层与墙体所在图层的碰撞关系是否启用,未被误禁用。
  • 移动方式替换:transform.Translate直接修改位置,不经过物理引擎碰撞检测,高速移动时易出现穿模。建议改用Rigidbody2D.velocity或Rigidbody2D.MovePosition驱动移动,依赖物理引擎处理碰撞。
  • 标签准确性核对:确认墙体标签为wall、投射物标签为Projectile,注意标签大小写敏感,无拼写错误。
  • Rigidbody2D组件检查:投射物需添加Rigidbody2D组件,Body Type设为Dynamic(若需物理驱动)或Kinematic(需手动处理碰撞响应),无组件则物理碰撞无法触发。

内容的提问来源于stack exchange,提问作者Charles Marchand

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.13 09:51:05