【问题标题】:How can I disable some objects in arrays?如何禁用数组中的某些对象?
【发布时间】:2020-06-16 13:27:21
【问题描述】:

我有一个枪切换脚本,它有一个数组来获取所有元素的 MeshRenderer 组件,然后,我可以启用我想要的元素,但我不能禁用其他元素。

public class TrocarArma : MonoBehaviour
{
    [Header("References")]
    public int choosenGun = 0;
    [Space(10)]
    [SerializeField] MeshRenderer[] meshes = new MeshRenderer[4];

    void Start()
    {
        SelectWeapon();
    }

    void Update()
    {
        ChangeGun();
    }

    void SelectWeapon()
    {
        int gunCount = 0;                                                             

        meshes[0] = GameObject.Find("GravityGun").GetComponent<MeshRenderer>();
        meshes[1] = GameObject.Find("IronBar").GetComponent<MeshRenderer>();
        meshes[2] = GameObject.Find("Tablet").GetComponent<MeshRenderer>();
        meshes[3] = null;                                                      //Will be filled later.

        foreach(Transform gun in transform)
        {
            if (gunCount == choosenGun)
            {
                meshes[choosenGun].enabled = true;
            }
            else
            {
                 ///Code to make the others array meshes elements MeshRenderers disable.
            }

            gunCount++;
        }
    }

    void ChangeGun()
    {
        int previousWeapon = choosenGun;

        if (Input.GetAxis("Mouse ScrollWheel") < 0)
        {
            if(choosenGun >= transform.childCount -1)
            {
                choosenGun = 0;
            }
            else
            {
                choosenGun++;
            }
        }
        if (Input.GetAxis("Mouse ScrollWheel") > 0)
        {
            if (choosenGun <= 0)
            {
                chooseGun = transform.childCount - 1;
            }
            else
            {
                chooseGun--;
            }
        }

        if (previousWeapon != chooseGun)
        {
            SelectWeapon();
        }
    }
}

我根本没有使用 SetActive(true)/(false),因为我需要激活平板电脑来升级我的防御。我制作这个脚本的视频:https://www.youtube.com/watch?v=Dn_BUIVdAPg,感谢阅读!

【问题讨论】:

  • 你试过meshes[choosenGun].enabled = false;吗?
  • 是的,但它不起作用,我会尝试切换以禁用元素。

标签: c# arrays unity3d


【解决方案1】:

void SelectWeapon() 方法内部有奇怪的逻辑。但是,我敢建议以下代码可以帮助您:

foreach(Transform gun in transform)
{
    if (gunCount == choosenGun)
    {
        meshes[choosenGun].enabled = true;
    }
    else
    {
        meshes[gunCount].enabled = false;
    }

    gunCount++;
}

foreach(Transform gun in transform)
{           
    switch(gunCount)
    {
        case 0:
            meshes[choosenGun].enabled = true;
            break;

        default:
            meshes[gunCount].enabled = false;
            break;
    }

    gunCount++;
}

顺便说一句: 当您尝试访问 .enabled 属性时,meshes[3] = null; 将引发异常。最好不要允许这样的 null 元素,或者总是检查 null。

【讨论】:

  • 我会试试这个,我做了一个大开关,它起作用了,现在没有选择的枪被正确禁用。 pastebin.com/Pmt8T6TR
  • 或者干脆meshes[choosenGun].enabled = gunCount == choosenGun; ;)
  • 请注意,无论哪种方式,meshes[3] = null; 在达到该索引时都会得到NulReferenceException ....
  • @derHugo 好的,我会的!
  • 我添加了一个带有网格渲染器组件的幽灵变换,现在我在该变换中实例化了我的防御,使用 GetComponentInChildren() 我禁用了防御,所以,控制台是完全干净的现在,感谢您的帮助,以及 null 关键字的提示! :D
猜你喜欢
  • 2017-12-19
  • 2018-09-25
  • 1970-01-01
  • 2022-11-22
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-11-18
  • 1970-01-01
相关资源
最近更新 更多