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
相关产品推荐
相关产品推荐

