我单击一个按钮将相应地在场景中显示模型。当我再次单击同一按钮时,同一模型将出现两次。如何停止此操作。即,如果模型/游戏对象已经加载,则无需再次加载。
我在这里使用Gameobject.find。当我单击一个按钮模型时,对应的模型出现了,场景中存在的其他模型也消失了。由于其他模型被隐藏,此时Gameobject.find无法正常工作。任何更好的解决方案。请看在下面的代码太多,否则。 :)
private string _assetname;
public void LoadAsstBundles(int choice)
{
if (choice == 1)
{
_assetname = “Chair1”;
}
else if (choice == 2)
{
_assetname = “Chair2”;
}
else if (choice == 3)
{
_assetname = “Chair3”;
}
if (_assetsBundle == null)
{
Debug.Log("Could Not load AssetBundles");
}
else
{
if (GameObject.Find(_assetname + "(Clone)"))
{
Debug.Log("Already Loaded");
}
else
{
var asset = _assetsBundle.LoadAsset(_assetname);
int childcounts = ParentTransform.childCount;
Debug.Log("Asset name nw ==" + asset.name);
Debug.Log("Asset Bundles Loaded");
var go = (GameObject)Instantiate(asset, ParentTransform);
int option = go.transform.GetSiblingIndex();
int childcount = ParentTransform.childCount;
for (int i = 0; i < childcount; i++)
{
if (option == i)
{
ParentTransform.GetChild(i).gameObject.SetActive(true);
continue;
}
ParentTransform.GetChild(i).gameObject.SetActive(false);
}
}
}
}
答案 0 :(得分:2)
与其完全不使用Find
而是使用变量,而是存储实例化对象时获得的引用,并在以后重用它们,例如
// Here you store the reference from
// Assetbundle.LoadAsset
private object loadedAsset;
// Here you store the reference to the assets instance itself
private GameObject assetInstance;
public void LoadAsstBundles(int choice)
{
// Is _assetBundle available?
if (!_assetsBundle)
{
Debug.Log("Could Not load AssetBundles", this);
return;
}
// Was the bundle loaded before?
if (!loadedAsset)
{
loadedAsset = _assetsBundle.LoadAsset(_assetname);
if(!loadedAsset)
{
Debug.LogError("unable to load asset", this);
return;
}
Debug.Log("Asset Bundles Loaded", this);
}
// Is the object Instantiated in the scene?
if(!assetInstance)
{
assetInstance = (GameObject)Instantiate(loadedAsset, ParentTransform);
Debug.LogFormat(this, "Instantiated {0}", assetInstance.name);
}
// no need to go by names
// simply get the correct child by index
var selected = assetInstance.transform.GetChild(choice);
// Enable or disable the childs
// simply run through all childs no need to get their names etc
foreach(Transform chair in assetInstance.transform)
{
chair.gameObject.SetActive(chair == selected);
}
}
答案 1 :(得分:0)
我用Parenttransform.find来获取子隐藏对象。位长。欢迎任何更新的代码。
public void LoadAsstBundles(int choice)
{
if(choice==1)
{
_assetname = "Chair1";
}
else if(choice == 2)
{
_assetname = "Chair2";
}
else if(choice == 3)
{
_assetname = "Chair3";
}
if (_assetsBundle==null)
{
Debug.Log("Could Not load AssetBundles");
}
else
{
var asset= _assetsBundle.LoadAsset(_assetname);
//if (GameObject.Find(_assetname + "(Clone)"))
//{
// Debug.Log("Already Loaded");
//}
if(ParentTransform.Find(_assetname+ "(Clone)")== true)
{
Debug.Log("Already Loaded");
int childcount = ParentTransform.childCount;
for (int i = 0; i < childcount; i++)
{
if (choice == i)
{
ParentTransform.GetChild(i).gameObject.SetActive(true);
continue;
}
ParentTransform.GetChild(i).gameObject.SetActive(false);
}
}
else
{
Debug.Log("Asset Bundles Loaded");
var go = (GameObject)Instantiate(asset, ParentTransform);
int option = go.transform.GetSiblingIndex();
_loadednames.Add(go.name);
Debug.Log("Sibling index == " + go.transform.GetSiblingIndex());
int childcount = ParentTransform.childCount;
for (int i = 0; i < childcount; i++)
{
if (option == i)
{
ParentTransform.GetChild(i).gameObject.SetActive(true);
continue;
}
ParentTransform.GetChild(i).gameObject.SetActive(false);
}
}
}
}