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

Unity 2D游戏角色自动移动时碰撞失效问题求助

解决2D游戏角色碰撞失效及自动移动到目标点停止的问题

问题根源

你当前用transform.Translate()直接修改角色位置,这种方式完全绕开了Unity的物理引擎,所以不会触发任何碰撞检测,导致角色直接穿过障碍物甚至移出画布。

解决步骤

1. 配置物理组件

给角色和障碍物添加正确的物理组件,让Unity物理引擎能识别碰撞:

  • 角色对象:
    • 添加Rigidbody2D组件,设置Body Type为Dynamic,Gravity Scale设为0(不需要重力),勾选Freeze Rotation Z防止角色意外旋转。
    • 添加Collider2D组件(比如BoxCollider2D),不要勾选Is Trigger(触发模式不会产生物理碰撞),调整Collider大小匹配角色的视觉范围。
  • 障碍物对象(沙发/书桌等):
    • 添加Collider2D组件(比如BoxCollider2D),不要勾选Is Trigger,调整大小覆盖物体的碰撞区域。如果是静态障碍物,给对象添加Static标签可优化物理性能。

2. 修改移动逻辑,使用物理引擎API

把transform.Translate()替换为Rigidbody2D的移动方法,让物理引擎处理碰撞。同时添加目标点检测,实现到达后自动停止。修改后的CharacterConstantMove脚本如下:

using UnityEngine;

public class CharacterConstantMove : MonoBehaviour
{
    GameManager Game_Manager;
    private Rigidbody2D rb;
    public Transform targetPoint; // 在Inspector面板拖拽书桌/沙发的Transform到这里
    public float stopDistance = 0.5f; // 到达目标点附近的停止阈值

    void Start()
    {
        GameObject gameController = GameObject.FindGameObjectWithTag("GameController");
        Game_Manager = gameController.GetComponent<GameManager>();
        rb = GetComponent<Rigidbody2D>();
        
        // 初始化刚体参数
        rb.freezeRotation = true;
        rb.gravityScale = 0f;
    }

    void FixedUpdate()
    {
        if (targetPoint == null) return;

        // 计算角色到目标点的方向和距离
        Vector2 direction = (targetPoint.position - transform.position).normalized;
        float distanceToTarget = Vector2.Distance(transform.position, targetPoint.position);

        if (distanceToTarget > stopDistance)
        {
            // 用MovePosition移动,物理引擎会自动处理碰撞
            Vector2 nextPosition = (Vector2)transform.position + direction * Game_Manager.moveSpeed * Time.fixedDeltaTime;
            rb.MovePosition(nextPosition);
        }
        else
        {
            // 到达目标点后停止移动
            rb.velocity = Vector2.zero;
        }
    }
}

3. 验证效果

运行游戏后,角色会自动向目标点移动,遇到障碍物时会被物理引擎阻挡;到达目标点附近时会自动停止,不会继续穿模或移出画布。

额外注意事项

  • 确保所有障碍物的Collider2D没有重叠,且完全覆盖物体的可碰撞区域,避免角色从边缘穿过去。
  • 如果需要多个目标点,可以扩展逻辑为目标点列表,让角色依次移动。

内容的提问来源于stack exchange,提问作者kylorius beno

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.23 13:24:46