Unity中如何将包含Texture2D的UnityEngine.Object[]转换为Texture2D[]
转换失败原因
C# 数组协变仅支持派生类数组转基类数组的单向转换,不支持反向转换。request.allAssets返回值为UnityEngine.Object[]类型,即使数组内所有元素都是Texture2D实例,也无法直接通过as操作符将数组整体转换为Texture2D[],该操作会直接返回null,后续遍历逻辑会触发空引用异常。
解决方案
方案1:使用LINQ转换(最简便)
首先在脚本顶部引入LINQ命名空间:
using System.Linq;
将原转换代码:
Texture2D[] obj = request.allAssets as Texture2D[];
替换为对应逻辑即可:
- 确认AssetBundle内所有资源都是Texture2D类型时,使用
Cast直接转换所有元素:
Texture2D[] obj = request.allAssets.Cast<Texture2D>().ToArray();
- AssetBundle内可能存在其他类型资源时,使用
OfType自动过滤不符合类型的资源,避免转换报错:
Texture2D[] obj = request.allAssets.OfType<Texture2D>().ToArray();
方案2:手动遍历转换(无需引入LINQ)
如果项目不需要引入LINQ命名空间,可手动遍历数组逐个转换:
Object[] allAssets = request.allAssets; Texture2D[] obj = new Texture2D[allAssets.Length]; for (int i = 0; i < allAssets.Length; i++) { obj[i] = allAssets[i] as Texture2D; // 可选:添加非空判断跳过非Texture2D类型资源 // if (obj[i] == null) continue; }
内容的提问来源于stack exchange,提问作者Kadir Özyıldırım
相关产品推荐
相关产品推荐

