首页 > 解决方案 > 我不明白 Unity C# 代码中“在变换中变换武器”的机制

问题描述

代码“在变换中变换武器”如何允许变体武器枚举武器父实例的所有子实例(如卡宾枪、霰弹枪)?

等级制度

代码:

private void SetWeaponActive()
    {
        int weaponIndex = 0;

        foreach (Transform weapon in transform) 
        {
            if (weaponIndex == currentWeapon)
            {
                weapon.gameObject.SetActive(true);
            }
            else
            {
                weapon.gameObject.SetActive(false);
            }
            weaponIndex++;
        }
    }

标签: c#unity3dtransform

解决方案


至于如何/为什么可以这样做。

如果您查看Transform源代码,您会看到它实现了IEnumerable接口

    public IEnumerator GetEnumerator()
    {
        return new Transform.Enumerator(this);
    }

    private class Enumerator : IEnumerator
    {
        Transform outer;
        int currentIndex = -1;

        internal Enumerator(Transform outer)
        {
            this.outer = outer;
        }

        //*undocumented*
        public object Current
        {
            get { return outer.GetChild(currentIndex); }
        }

        //*undocumented*
        public bool MoveNext()
        {
            int childCount = outer.childCount;
            return ++currentIndex < childCount;
        }

        //*undocumented*
        public void Reset() { currentIndex = -1; }
    }

所以基本上它只是一个方便的捷径

for(var i = 0; i < transform.childCount; i++)
{
    var weapon = transform.GetChild(i);

    ...
}

然后要么你必须存储实际的参考并做

private Transform currentWeapon;

...

foreach(Transform weapon in transform)
{
    weapon.gameObject.SetActive(weapon == currentWeapon);
}

或者

private Transform currentWeapon;

...

for(var i = 0; i < transform.childCount; i++)
{
    var weapon = transform.GetChild(i);

    weapon.gameObject.SetActive(weapon == currentWeapon);
}

或者,如果您存储索引而不是

private int currentIndex;

...

for(var i = 0; i < transform.childCount; i++)
{
    var weapon = transform.GetChild(i);

    weapon.gameObject.SetActive(i == currentIndex);
}

推荐阅读