【问题标题】:Recursing through a List is not updating objects as expected通过列表递归不会按预期更新对象
【发布时间】:2019-04-26 13:44:53
【问题描述】:

我正在尝试通过列表中的一堆游戏对象进行递归:

// get the relative position of the weapons to the ship
List<Transform> weaponPositions = ship.GetWeaponLocations(); // works

// set the positions of the weapons
for(int i = 0 ; i < equippedWeapons.Length && i < weaponPositions.Count ; i++)       
{
    equippedWeapons[i].GetComponent<Weapon>().setPosition(weaponPositions[i]);
}

但是,它似乎将最后一个“武器位置”应用于所有内容。所以 WeaponPositions 是一个 Transform 类型的列表,比如我想将 Weapon[0] 的位置设置为 WeaponPosition[0] 的位置。

问题在于,当它到达第三把武器(本例中为最后一把)时,它会将武器位置[2] 应用到之前的每把武器,而不仅仅是第 i 个索引。

武器是SerailizedField:

[SerializeField] GameObject[] equippedWeapons;

在武器中,setWeapon 方法很简单:

Transform positionOfWeaponOnShip;

public void setPosition(Transform pos)
{
    positionOfWeaponOnShip = pos;
}

我要问的问题是,我在这里以正确的方式使用列表吗?我很难理解为什么它不仅仅将其应用于第 i 个值。我也不确定我还能在这里放什么有用的...

谢谢, 波哥

【问题讨论】:

  • 尝试添加一个Debug.Log("currentPosition is: " + weaponPositions[i]);在 for 循环内和赋值之前。检查日志看位置是否正确
  • (1) 检查GetComponent&lt;Weapon&gt;()equippedWeapons中的所有对象上调用时是否返回相同的引用; (2) 检查weaponPositions中的所有对象是否实际上都相同。
  • 嗯,实例 ID 都是一样的......这是否意味着当我将预制件拖放到 [SerializeField] 中时,它会为每个预制件使用相同的预制件,而不是创建一个新实例对于列表中的每个元素?作为测试,我将武器预制件复制了三遍,然后将它们分别放入,然后是的,它工作得很好。但我不希望这样,我希望我的一个预制武器有多个 if 放入装备武器字段的实例......

标签: c# unity3d


【解决方案1】:

如果你想改变变换位置,你必须改变positionOfWeaponOnShip.position而不是positionOfWeaponOnShip。希望对你有帮助!

Transform positionOfWeaponOnShip;
public void setPosition(Transform pos)
{
    positionOfWeaponOnShip.position = new Vector3(pos.x, pos.y, pos.z);
}

【讨论】:

  • 谢谢你,但是 Weapon 中的变量是一个变换,而不是一个位置。
  • 你走对了,但参数的类型应该是 Vector3 或分配 pos.position
【解决方案2】:

您正在尝试为对象分配一个新的变换,这是不可能的。默认情况下,Unity 中的每个对象都有一个您无法删除的变换。它是每个游戏对象都必须拥有的唯一组件。

您不能为游戏对象分配新的变换,但可以为游戏对象分配新的位置。

 // works but the method naming is inappropriate
 // Either the list should be Vector3 or the method should be named GetWeaponTransform
 List<Transform> weaponPositions = ship.GetWeaponLocations(); 

// if we stick with a collection of Transform
for(int i = 0 ; i < equippedWeapons.Length && i < weaponPositions.Count ; i++)       
{
    equippedWeapons[i].GetComponent<Weapon>().setPosition(weaponPositions[i].position); // added .position
}

最后:

Transform transformOfWeaponOnShip;

public void setPosition(Vector3 pos)
{
    transformOfWeaponOnShip.position = pos;
}

【讨论】:

    【解决方案3】:

    问题似乎是每个引用都指向同一个预制件,而不是该预制件的一个实例。

    为了解决这个问题,在启动武器脚本时,我实例化了该武器的新版本,而不是引用预制件。这现在有效:)

    感谢您的帮助! 波哥

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-01-19
      • 1970-01-01
      • 1970-01-01
      • 2013-04-29
      • 2013-05-16
      相关资源
      最近更新 更多