Unity2D C#:物体碰撞后无法切换方向的问题求助
Unity2D物体碰撞后未切换移动方向的问题排查与解决
问题描述
在Unity2D中用C#编写了zackenblock物体的移动逻辑,预期物体初始向右移动,碰撞指定Tilemap后切换为向左移动,但实际物体仅持续向右移动,碰撞后方向无变化。
相关代码
zackenblock移动脚本(zackenblock_move.cs)
using System.Collections; using System.Collections.Generic; using UnityEngine; public class zackenblock_move : MonoBehaviour { public static bool col = false; public float speed = 10f; void Start() { } void Update() { if (zackenblock_col.collosin != col) { col = zackenblock_col.collosin; } } void FixedUpdate() { if (col == false){ transform.Translate(Vector3.right * Time.deltaTime * speed); } else { transform.Translate(Vector3.left * Time.deltaTime * speed); } } void OnCollisionEnter(Collision collision){ if (collision.gameObject.name == "Level1_part2") { Debug.Log("Do something here"); col = true; } else if (collision.gameObject.name == "Level") { Debug.Log("Do something here"); col = false; } } }
Tilemap碰撞脚本(zackenblock_col.cs)
using System.Collections; using System.Collections.Generic; using UnityEngine; public class zackenblock_col : MonoBehaviour { public static bool collosin; void Start() { } void Update() { if (Input.GetKey(KeyCode.M)) { collosin = true; } } void OnCollisionEnter(Collision collision){ if (collision.gameObject.name == "zackenblock") { Debug.Log("Do something here"); collosin = true; } } }
场景配置说明
- 场景内包含
zackenblock移动物体、Level和Level1_part2两个Tilemap区域。 - Tilemap已添加碰撞相关组件,
zackenblock为需实现往返移动的目标物体。
问题原因与修复方案
1. 2D碰撞API使用错误
当前代码用了3D物理的OnCollisionEnter(Collision)回调,Unity2D环境下必须使用OnCollisionEnter2D(Collision2D),否则碰撞事件完全不会触发。
修改zackenblock_move.cs中的碰撞回调:
void OnCollisionEnter2D(Collision2D collision){ if (collision.gameObject.name == "Level1_part2") { Debug.Log("碰撞到Level1_part2,切换向左移动"); col = true; } else if (collision.gameObject.name == "Level") { Debug.Log("碰撞到Level,切换向右移动"); col = false; } }
2. 冗余静态变量逻辑干扰
zackenblock_move中的Update方法会同步另一个脚本的collosin变量到col,但自身的碰撞回调已经能直接控制col,这个同步逻辑完全多余,甚至可能覆盖正确的方向值,直接删除该Update方法即可。
3. 缺少必要的2D物理组件
- 给
zackenblock添加Rigidbody 2D组件,若不需要物理受力效果,将Body Type设置为Kinematic。 - 确认Tilemap已添加
Tilemap Collider 2D,如果Tile是不规则形状,需额外添加Composite Collider 2D组件,并勾选Tilemap Collider 2D的Used By Composite选项。
测试验证
修复后运行场景,zackenblock碰撞到对应Tilemap时会触发方向切换;若之前按M键能改变方向,说明静态变量赋值逻辑正常,核心问题就是碰撞API和组件配置错误。
内容的提问来源于stack exchange,提问作者user20714226
相关产品推荐
相关产品推荐

