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

Unity中角色与触发器碰撞时未移动到检查点位置该如何解决?

问题排查与修复方案

你代码里的触发器回调方法名大小写错误,Unity的内置生命周期方法要求首字母大写,小写的onTriggerEnter不会被引擎识别触发,这是最主要的问题。

除此之外还要检查以下配置项,避免其他触发逻辑异常:

  • 检查点GameObject必须挂载任意碰撞体组件(比如BoxCollider),且碰撞体的Is Trigger选项处于勾选状态
  • 玩家GameObject必须挂载碰撞体组件,同时必须挂载Rigidbody组件(如果你的玩家用的是CharacterController,可以勾选Rigidbody的Is Kinematic避免物理干扰),Unity的触发器事件要求碰撞双方至少有一方携带Rigidbody组件
  • 确认RespawnScript脚本挂载在检查点GameObject上,而非玩家对象
  • 检查检查点对象Inspector面板中RespawnScript组件的两个参数:player字段需拖入玩家对象,respawnPoint字段需拖入你要传送的目标位置对象,两个字段不能为空
  • 如果你使用CharacterController控制玩家移动,直接修改transform.position会被CharacterController的移动逻辑覆盖,需要先临时禁用组件再修改位置

修正后的参考代码如下:

using UnityEngine;

public class RespawnScript : MonoBehaviour {

    [SerializeField] private Transform player;
    [SerializeField] private Transform respawnPoint;

    // 注意方法名首字母大写才能被Unity识别
    private void OnTriggerEnter(Collider other) {
        // 增加标签判断,避免其他对象触碰检查点时误触发传送
        if (other.CompareTag("Player")) {
            // 适配CharacterController的特殊处理逻辑,没用CharacterController可以删掉这三行
            CharacterController cc = player.GetComponent<CharacterController>();
            if (cc != null) 
                cc.enabled = false;
            
            player.position = respawnPoint.position;
            
            // 没用CharacterController可以删掉这两行
            if (cc != null) 
                cc.enabled = true;
        }
    }
}

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.07 17:42:02