我试图通过列表中的一堆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
答案 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