亚洲在线久爱草,狠狠天天香蕉网,天天搞日日干久草,伊人亚洲日本欧美

為了賬號安全,請及時綁定郵箱和手機立即綁定
已解決430363個問題,去搜搜看,總會有你想問的

從 assetBundle 加載的 Prefab 是否可以傳遞給 Vuforia Anchor

從 assetBundle 加載的 Prefab 是否可以傳遞給 Vuforia Anchor

C#
翻閱古今 2023-08-13 13:57:11
目標是一個兩步過程,其中從 AssetBundle 加載 Vuforia GroundPlane 對象的預制件,并將其傳遞到 AnchorBehavior 變量聲明以放置游戲對象。如果作為 Unity C# 的新手,我沒有達到我想要的準確程度,我深表歉意嘗試了各種方法將加載的預制件等同于 AnchorBehavior。但因為這是兩種類型的對象,所以會發生錯誤,表明它們不能隱式相等聲明如下:public PlaneFinderBehaviour plane;public ContentPositioningBehaviour planeFinder;public AnchorBehaviour model;public string nameOfAssetBundle;public string nameOfObjectToLoad;想法是傳遞代表預制件的“nameOfObjectToLoad”并將其傳遞給“AnchorBehavior”值,然后當腳本附加到按鈕時可以使用以下方法“onClick”。public void create(){    planeFinder.AnchorStage = model.GetComponent<AnchorBehaviour>();}期望預制件將傳遞給 AnchorBehavior 并實例化預制件“onClick”這是從中提取這些片段的完整腳本。進一步的研究暴露了我的新手技能?!癿odel = loadAsset;”的最終意圖 是我試圖直接從一種數據類型轉換為另一種數據類型,這是無法明確完成的。但到目前為止,我的研究還沒有找到從 AssetBundle 中獲取加載的 Prefab 并將其提供給 AnchorBehaviour 變量的方法。如果有人對這種數據類型之間的轉換方法有任何經驗,我們非常感謝您的指導。更新 通過正確轉換聲明,消除了轉換錯誤。model = (asset.asset as AnchorBehaviour);但現在我有一個 NullReference 錯誤,表明我未能在這一行中正確聲明該值    {        planeFinder.AnchorStage = model.GetComponent<AnchorBehaviour>();    }現在這是我的新困境,因為我不確定我在哪里未能正確聲明變量。更新 當 AnchorBehaviour 變量設置為私有時,此錯誤得到解決。因此,現在腳本可以編譯,但無法產生預期的結果。這可能表明需要更改加載 AssetBundle 組件的方式,如 IEnumerator 部分中所述。Unity 控制臺打印出以下日志注釋There is no content to place at the anchor. Set the "Anchor Stage" field to the content you wish to place.UnityEngine.Debug:LogError(Object)在所有建議之后,這是最新的腳本,不幸的是它沒有放置 AssetBundle 中的內容。我可以看到更多的研究和測試。
查看完整描述

1 回答

?
守候你守候我

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>();

}

查看完整回答
反對 回復 2023-08-13
  • 1 回答
  • 0 關注
  • 128 瀏覽

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯系客服咨詢優惠詳情

幫助反饋 APP下載

慕課網APP
您的移動學習伙伴

公眾號

掃描二維碼
關注慕課網微信公眾號