c# - 我不明白 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++;
}
}
解决方案
至于如何/为什么可以这样做。
如果您查看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);
}
推荐阅读
- c# - 如何连续调用 Web API 服务
- java - Android 垃圾收集器
- perl - 如何使用perl在文件夹中的文件之间建立符号链接?
- angular - 在 Angular:http post 方法中,如何传递具有“基本身份验证”和“用户名”和“密码”的正文和标头
- python-3.x - 字典没有在 for 循环中分配正确的值
- jboss - 如何改善由于 ManagedBean 中的许多 @Inject 而导致的缓慢
- java - 如何在java中检查重复/相同值的条件
- c++ - 在图像顶部模拟天体(恒星)
- django - django>=1.7 django.setup() 正在提高 AppRegistryNotReady
- visual-studio - 运行时的 Visual Studio 热键检测