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

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


// 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”应用于所有内容。所以 weaponPositions 是一个 Transform 类型的列表,例如我想将 weapon[0] 的位置设置为 weaponPosition[0] 的位置。


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


武器是一个 SerailizedField:


[SerializeField] GameObject[] equippedWeapons;

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


Transform positionOfWeaponOnShip;


public void setPosition(Transform pos)

{

    positionOfWeaponOnShip = pos;

}

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


绝地无双
浏览 116回答 3
3回答

牛魔王的故事

您正在尝试为对象分配一个新的转换,这是不可能的。默认情况下,Unity 中的每个对象都有一个您无法删除的 Transform。它是每个游戏对象必须拥有的唯一组件。您不能为游戏对象分配新的变换,但可以为游戏对象分配新的位置。&nbsp;// works but the method naming is inappropriate&nbsp;// Either the list should be Vector3 or the method should be named GetWeaponTransform&nbsp;List<Transform> weaponPositions = ship.GetWeaponLocations();&nbsp;// if we stick with a collection of Transformfor(int i = 0 ; i < equippedWeapons.Length && i < weaponPositions.Count ; i++)&nbsp; &nbsp; &nbsp; &nbsp;{&nbsp; &nbsp; equippedWeapons[i].GetComponent<Weapon>().setPosition(weaponPositions[i].position); // added .position}最后:Transform transformOfWeaponOnShip;public void setPosition(Vector3 pos){&nbsp; &nbsp; transformOfWeaponOnShip.position = pos;}

慕尼黑的夜晚无繁华

如果你想改变变换位置,你必须改变而positionOfWeaponOnShip.position不是positionOfWeaponOnShip. 我希望这可以帮助你!Transform positionOfWeaponOnShip;public void setPosition(Transform pos){&nbsp; &nbsp; positionOfWeaponOnShip.position = new Vector3(pos.x, pos.y, pos.z);}

MMMHUHU

问题似乎是每个引用都是针对相同的预制件,而不是该预制件的实例。为了解决这个问题,在启动武器脚本时,我实例化了该武器的一个新版本,而不是引用预制件。这现在有效:)
打开App,查看更多内容
随时随地看视频慕课网APP