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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.09 05:40:41