通过列表递归不会按预期更新对象

时间:2019-04-21 16:00:36

标签: c# unity3d

我试图通过列表中的一堆GameObjects递归:

// 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”应用于所有内容。因此,武器位置是“变换”类型的列表,例如,我想将武器[0]的位置设置为武器位置[0]的位置。

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

武器是一个SerailizedField:

[SerializeField] GameObject[] equippedWeapons;

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

Transform positionOfWeaponOnShip;

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

我要问的问题是,我在这里是否以正确的方式使用列表?我为为什么不将其仅应用于第i个值而感到困惑。我也不确定我还能在这里再放些什么...

谢谢, Bogo

3 个答案:

答案 0 :(得分:1)

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

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

答案 1 :(得分:1)

您试图为该对象分配一个新的变换。默认情况下,Unity中的每个对象都会获得一个不能删除的Transform。这是每个游戏对象都必须拥有的唯一组件。

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

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

答案 2 :(得分:0)

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

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

感谢您的帮助! Bogo