Search code examples
c#unity-game-engineaugmented-realityarkit

How to check/find if a Gameobject present under a Transform is hidden or active?


I am clicking a button accordingly models display in the scene.When I click the same button again the same model appears twice.How to stop this. i.e. If model/Gameobject already loaded then no need to load again.

I am using Gameobject.find here.When I click one button models corresponding model comes and other model present in the scene disappears.At this time Gameobject.find will not work since other model is hidden.Any better solution.Please look at the code below too many if else. :)

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

            }

        }

    }

}

Solution

  • Instead of using Find at all rather work with variables, store the references you get when instantiating the objects and reuse them later e.g.

    // 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);
        }
    }