Unity Addressable实例化预制体后Window类request变量为空问题
问题根因
你代码中获取Window组件的对象来源完全错误:
loadOp.Result是LoadAssetAsync加载到的原始预制体资源,预制体本身不会执行Awake生命周期函数,它的request字段自然保持初始空值- 你调试时看到的
Awake执行、request被赋值,是InstantiateAsync生成的实例化GameObject触发的,这个实例对象存储在op.Result中,和你加载的预制体资源是完全独立的两个对象
修复代码
将获取组件的来源替换为实例化操作返回的结果即可,同时你原有代码还存在实例化异步操作未等待的逻辑问题,完整修复后的代码如下:
AsyncOperationHandle<GameObject> loadOp = Addressables.LoadAssetAsync<GameObject>(address); yield return loadOp; if (loadOp.Status == AsyncOperationStatus.Succeeded){ var op = Addressables.InstantiateAsync(address); // 等待实例化操作完成,不要直接判断IsDone避免异步未完成问题 yield return op; if (op.Status == AsyncOperationStatus.Succeeded) { // 从实例化生成的GameObject上获取组件,而非从原始预制体上获取 Window window = op.Result.GetComponent<Window>(); var data = window.request; // 此时可正常读取到"load_data" } } }
额外注意事项
- 无特殊需求的情况下不需要提前调用
LoadAssetAsync,直接调用InstantiateAsync即可,Addressables内部会自动处理资源加载逻辑 - 所有Addressables异步操作都建议用
yield return等待完成,不要直接判断IsDone,避免异步操作未完成导致的空引用问题 - 使用完毕的资源记得调用
Addressables.Release释放,避免内存泄漏
内容的提问来源于stack exchange,提问作者vrivon
相关产品推荐
相关产品推荐

