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

Unity 2D无尽跑酷关卡块未自动生成问题排查

Unity 2D无尽跑酷关卡自动生成失效问题修复

问题原因定位

  • 空引用异常:Awake生命周期逻辑未依赖player字段,因此初始生成逻辑正常运行;如果未在Inspector面板给序列化的player字段拖拽赋值玩家对象,Update逻辑运行时会直接抛出空引用错误,导致后续生成代码无法执行,这是初学者最容易忽略的高频问题。
  • 语法错误:代码中player.transform.position()为错误写法,Unity中Transform.position是可访问属性,不是需要加括号调用的方法。如果自定义PlayerScript中存在同名position()方法且返回固定初始坐标,会直接导致距离计算完全失效。
  • 距离计算逻辑不符合2D横版场景:使用Vector3.Distance()计算三维直线距离时,会将Y轴(玩家跳跃、掉落的高度差)、Z轴(2D图层偏移)的差值计入总距离。当玩家跑到平台边缘踩空掉落时,Y轴差值快速增大会导致总距离超过生成阈值,无法触发新段生成。
  • 触发逻辑鲁棒性不足:如果设置的生成阈值小于单个关卡段长度,玩家跑到已生成段末端时才会触发判断,此时已经踩空掉落。

跑酷关卡生成问题场景截图

修复方案

  1. 检查编辑器赋值
    选中挂载TESTGAMEMANAGER脚本的游戏对象,在Inspector面板确认三个序列化字段均正确赋值:

    • levelPart_Start拖拽场景中的初始起始平台对象
    • levelPartList添加所有需要随机生成的关卡段预制体
    • player拖拽场景中的玩家对象
      同时确认所有关卡段预制体(包含初始起始平台)下都存在名为EndPoint的子物体,且该子物体的位置放在关卡段的最末端(下一段平台的拼接位置)。
  2. 修正脚本逻辑
    替换原有Update方法的距离判断逻辑,改为仅计算X轴水平距离,同时增加非空校验避免报错,修改后的完整脚本如下:

    using System.Collections;
    using System.Collections.Generic;
    using UnityEngine;
    
    public class TESTGAMEMANAGER : MonoBehaviour
    {
        // 阈值建议设为单个关卡段长度的1.5倍,提前生成避免踩空
        private const float PLAYER_DISTANCE_SPAWN_LEVEL_PART = 30f;
    
        [SerializeField] private Transform levelPart_Start;
        [SerializeField] private List<Transform> levelPartList;
        [SerializeField] private PlayerScript player;
    
        private Vector3 lastEndPosition;
    
        private void Awake()
        {
            lastEndPosition = levelPart_Start.Find("EndPoint").position;
    
            int startingSpawnLevelParts = 5;
            for (int i = 0; i < startingSpawnLevelParts; i++)
            {
                SpawnLevelPart();
            }
        }
    
        private void Update()
        {
            // 非空校验,避免空引用导致逻辑中断
            if (player == null) return;
            
            // 仅计算X轴水平距离,忽略Y/Z轴干扰,性能更优
            float horizontalDistance = lastEndPosition.x - player.transform.position.x;
            
            if (horizontalDistance < PLAYER_DISTANCE_SPAWN_LEVEL_PART)
            {
                SpawnLevelPart();
            }
        }
    
        private void SpawnLevelPart()
        {
            Transform chosenLevelPart = levelPartList[Random.Range(0, levelPartList.Count)];
            Transform lastLevelPartTransform = SpawnLevelPart(chosenLevelPart, lastEndPosition);
            lastEndPosition = lastLevelPartTransform.Find("EndPoint").position;
        }
    
        private Transform SpawnLevelPart(Transform levelPart, Vector3 spawnPosition)
        {
            Transform levelPartTransform = Instantiate(levelPart, spawnPosition, Quaternion.identity);
            return levelPartTransform;
        }
    }
    
  3. 可选优化
    可以额外添加关卡段销毁逻辑:当玩家距离已生成的旧关卡段超过100f时直接销毁该段,避免场景中堆积大量生成对象导致性能下降,建议保持场景内同时存在的关卡段数量在5-8个即可。


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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.27 21:57:23