Unity中Player.transform.position不生效但If语句已触发问题
问题:Checkpoint重生系统中玩家位置重置不生效
使用Unity第一人称模板制作Checkpoint系统,玩家掉落触碰到触发器时,控制台能输出Debug.Log("Hello"),说明OnTriggerEnter里的If分支已执行,但player.transform.position赋值完全没效果,玩家不会被传送回 checkpoint,无报错信息。需求是玩家掉落后触发触发器,传送回最近激活的Checkpoint位置。
死亡触发器脚本(Respawn)
挂载在关闭Mesh Renderer、勾选Is Trigger的立方体上:
using System.Collections; using System.Collections.Generic; using UnityEngine; public class Respawn : MonoBehaviour { public GameObject player; public GameObject respawnPoints; private void OnTriggerEnter(Collider other) { if (other.gameObject.CompareTag("Player")) { Debug.Log("Hello"); player.transform.position = respawnPoints.transform.position; } } }
Checkpoint激活脚本(Checkpoint_1)
using System.Collections; using System.Collections.Generic; using UnityEngine; public class Checkpoint_1 : MonoBehaviour { private Respawn respawn; [SerializeField] private Animator playAnimation; private void Awake() { respawn = GameObject.FindGameObjectWithTag("Respawn").GetComponent<Respawn>(); } private void OnTriggerEnter(Collider other) { if (other.gameObject.CompareTag("Player")) { playAnimation.SetBool("CheckpointTrigger", true); respawn.respawnPoint = this.gameObject; } } }
问题排查与解决
1. 核心错误:变量名不匹配
一眼就能看到问题——Checkpoint_1里给respawn.respawnPoint赋值,但Respawn脚本里的变量叫respawnPoints(多了个s)!等于你激活Checkpoint时根本没把当前Checkpoint的位置传给Respawn的目标变量,重生时用的还是Inspector里初始赋值的respawnPoints,甚至如果这个变量没赋值,Unity会用默认位置(0,0,0),如果玩家本来就在附近自然看不出变化。
修正方法:
- 把Respawn脚本里的
public GameObject respawnPoints;改成public GameObject respawnPoint;,和Checkpoint_1里的赋值变量名保持一致; - 或者把Checkpoint_1里的
respawn.respawnPoint = this.gameObject;改成respawn.respawnPoints = this.gameObject;,二选一即可。
2. 第一人称控制器的干扰
Unity第一人称模板的CharacterController组件会在每一帧更新玩家位置,可能刚赋值完就被控制器覆盖,导致位置没变化。解决方法是赋值时先禁用控制器,赋值后再启用:
// 在Respawn的OnTriggerEnter里替换原位置赋值代码 var charController = player.GetComponent<CharacterController>(); if (charController != null) { charController.enabled = false; player.transform.position = respawnPoint.transform.position; // 这里用修正后的变量名 charController.enabled = true; } else { player.transform.position = respawnPoint.transform.position; }
3. 验证变量赋值状态
在Respawn的OnTriggerEnter里加调试日志,确认重生目标位置和玩家当前位置:
Debug.Log($"重生目标位置:{respawnPoint.transform.position},玩家当前位置:{player.transform.position}");
如果输出的重生位置不对,说明Checkpoint激活逻辑没生效,再检查:
- Respawn对象的标签是不是"Respawn"(Checkpoint_1里用
FindGameObjectWithTag("Respawn")查找); - Checkpoint_1的
OnTriggerEnter有没有触发(可以加Debug.Log("Checkpoint已激活")验证)。
4. 检查Inspector赋值
- 确认Respawn脚本里的
player已经拖入第一人称玩家对象; - 修正变量名后,确保初始的
respawnPoint可以在Inspector里拖入默认重生点,避免玩家没激活任何Checkpoint时重生到无效位置。
内容的提问来源于stack exchange,提问作者Pyromancer
相关产品推荐
相关产品推荐

