1 回答
![?](http://img1.sycdn.imooc.com/54584d560001571a02200220-100-100.jpg)
TA贡献1802条经验 获得超10个赞
查看AssetBundle.LoadAssetAsync
在 5.0 版本之前,用户可以使用 LoadAsync 直接获取各个组件。不再支持此功能。相反,请使用 LoadAssetAsync 首先加载游戏对象,然后查找该对象上的组件。
您不能简单地将检索到的引用类型GameObject
转换为AnchorBehaviour
引用。相反,你必须使用GetComponent
.
所以你应该做的是
AssetBundleRequest assetRequest = assetBundle.LoadAssetAsync<GameObject>(objectNameToLoad);
yield return assetRequest;
GameObject loadedAsset = (GameObject)assetRequest.asset;
// since model is already of type AnchorBehaviour
// you should do the GetComponent already here
model = loadedAsset.GetComponent<AnchorBehavior>();
现在您已经有了类型的引用,AnchorBehaviour第二次GetComponent调用将是多余的,因为它返回相同的引用。所以现在只能用
public void create()
{
planeFinder.AnchorStage = model;
}
如果您有此脚本的多个实例,则仅加载 assetBundle 一次可能是有意义的,例如
private static bool alreadyLoading;
private static AssetBundle assetBundle;
void Start()
{
// only load the bundle once
if(!alreadyLoading)
{
// set the flag to make sure this is never done again
alreadyLoading = true;
StartCoroutine(LoadAsset(nameOfAssetBundle, nameOfObjectToLoad));
}
else
{
LoadObjectFromBundle(nameOfOjectToLoad);
}
}
private IEnumerator LoadAsset(string assetBundleName, string objectNameToLoad)
{
string filePath = System.IO.Path.Combine(Application.streamingAssetsPath, "AssetBundles");
filePath = System.IO.Path.Combine(filePath, assetBundleName);
var assetBundleCreateRequest = AssetBundle.LoadFromFileAsync(filePath);
yield return assetBundleCreateRequest;
assetBundle = assetBundleCreateRequest.assetBundle;
LoadObjectFromBundle(objectNameToLoad);
}
private IEnumerator LoadObjectFromBundle(string objectNameToLoad)
{
AssetBundleRequest assetRequest = assetBundle.LoadAssetAsync<GameObject>(objectNameToLoad);
yield return assetRequest;
GameObject loadedAsset = (GameObject)assetRequest.asset;
model = loadedAsset.GetComponent<AnchorBehavior>();
}
- 1 回答
- 0 关注
- 103 浏览
添加回答
举报