Unity中public Scene类型变量在Inspector面板无拖拽赋值字段
问题原因
Unity默认序列化系统不支持原生序列化Scene结构体,因此直接声明public Scene _newGameLevel字段时,Inspector无法渲染支持场景拖拽、选择的交互控件,只会显示不可操作的静态文本。
解决方法
按以下步骤调整即可实现场景拖拽赋值:
- 替换字段类型,增加编辑器校验
将原代码中Scene类型的公开字段替换为Object类型,配合编辑器宏做类型校验,避免打包报错、错误资产拖拽问题,修改后的代码参考如下(注意将类名替换为你自己的实际类名):
using UnityEngine; #if UNITY_EDITOR using UnityEditor; #endif public class SceneLoadController : MonoBehaviour { [Header("Levels To Load")] public Object _newGameLevel; private string levelToLoad; // 编辑器下实时校验赋值资产是否为合法场景 private void OnValidate() { #if UNITY_EDITOR if (_newGameLevel != null) { string assetPath = AssetDatabase.GetAssetPath(_newGameLevel); if (!assetPath.EndsWith(".unity")) { Debug.LogError("赋值的资产不是有效场景文件,请重新拖拽场景到该字段"); _newGameLevel = null; } } #endif } // 你的其他原有逻辑,比如场景加载调用 public void StartNewGame() { StartCoroutine(sceneFader.FadeAndLoadScene(SceneFader.FadeDirection.In, _newGameLevel.name)); } }
- 原有加载逻辑无需改动
之前写的场景加载调用代码可以直接使用,不需要额外调整。 - 完成必要配置
所有需要通过代码加载的场景,必须先添加到
File > Build Settings > Scenes In Build列表中,否则运行时会触发场景不存在的报错。需要用到的Starter场景直接从Project窗口拖入该列表、保持勾选状态即可。
调整完成后回到Inspector面板,即可直接将Project窗口里的Starter场景文件拖拽到New Game Level字段完成赋值,不需要手动输入场景名,也能避免拼写错误导致的加载失败。
如果项目使用Unity 2020.1及以上版本,也可以直接使用SceneAsset类型做字段绑定,实现逻辑和上述写法一致,注意同样需要加编辑器宏隔离SceneAsset的引用,避免打包时出现类型找不到的报错。
内容的提问来源于stack exchange,提问作者Daniel Lip
相关产品推荐
相关产品推荐

