Unity进入Play模式后DontDestroyOnLoad报错且角色重力移动功能失效
问题1:DontDestroyOnLoad相关报错
该报错属于编辑器操作触发的非逻辑错误,和你的游戏代码无关:
[Debug Updater]是Unity渲染管线内置的调试对象,开启开发调试模式后会自动生成并挂载到内置的DontDestroyOnLoad场景中,不是你编写的代码生成的,不需要额外处理- 报错触发原因是你在进入Play模式后双击了Hierarchy面板中的
[Debug Updater]对象,编辑器尝试将内置的DontDestroyOnLoad场景设为活跃场景触发了引擎限制,只要不主动双击这个对象就不会触发该报错,完全不影响游戏运行逻辑。
问题2:玩家无法下落/移动的问题
你编写的HeroCharacterController存在两处核心逻辑遗漏和错误:
- 重力判断逻辑写反:当前代码的判断条件是「未落地且y轴速度向下时直接清空地心速度」,直接导致玩家永远不会下落,应该改为「落地时清空地心速度」
- 没有调用速度应用方法:你只计算了速度变量
velocity,但没有调用CharacterController的Move()方法把速度应用到玩家对象上,计算出来的速度完全没有生效。
修正后的代码如下:
using System.Collections; using System.Collections.Generic; using UnityEngine; public class HeroCharacterController : MonoBehaviour { [SerializeField] LayerMask groundLayers; [SerializeField] float moveSpeed = 8f; // 可根据需求自行调整移动速度 private float gravity = -50f; private CharacterController characterController; private Vector3 velocity; private bool isGrounded; void Start() { characterController = GetComponent<CharacterController>(); } void Update() { // 地面检测逻辑 isGrounded = Physics.CheckSphere(transform.position, 0.1f, groundLayers, QueryTriggerInteraction.Ignore); // 落地时重置y轴速度,避免重力持续累计 if(isGrounded && velocity.y < 0) { velocity.y = -2f; // 保留微小负速度避免地面检测出现误判 } // 水平移动逻辑(2D跑酷仅保留x轴输入即可) float horizontalInput = Input.GetAxis("Horizontal"); characterController.Move(new Vector3(horizontalInput * moveSpeed * Time.deltaTime, 0, 0)); // 应用重力效果 velocity.y += gravity * Time.deltaTime; characterController.Move(velocity * Time.deltaTime); } }
额外检查点:确认玩家对象上已经挂载
CharacterController组件,且Inspector面板中groundLayers参数已经选中地面对应的层级,否则地面检测逻辑会失效。
内容的提问来源于stack exchange,提问作者Burhan Ahmad
相关产品推荐
相关产品推荐

