为了账号安全,请及时绑定邮箱和手机立即绑定

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

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

C#
绝地无双 2022-12-24 11:00:30
我正在尝试递归列表中的一堆游戏对象:// get the relative position of the weapons to the shipList<Transform> weaponPositions = ship.GetWeaponLocations(); // works// set the positions of the weaponsfor(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 个值。我也不确定我还能在这里放什么有用的......
查看完整描述

3 回答

?
牛魔王的故事

TA贡献1830条经验 获得超3个赞

您正在尝试为对象分配一个新的转换,这是不可能的。默认情况下,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;

}


查看完整回答
反对 回复 2022-12-24
?
慕尼黑的夜晚无繁华

TA贡献1864条经验 获得超6个赞

如果你想改变变换位置,你必须改变而positionOfWeaponOnShip.position不是positionOfWeaponOnShip. 我希望这可以帮助你!


Transform positionOfWeaponOnShip;

public void setPosition(Transform pos)

{

    positionOfWeaponOnShip.position = new Vector3(pos.x, pos.y, pos.z);

}


查看完整回答
反对 回复 2022-12-24
?
MMMHUHU

TA贡献1834条经验 获得超8个赞

问题似乎是每个引用都是针对相同的预制件,而不是该预制件的实例。

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


查看完整回答
反对 回复 2022-12-24
  • 3 回答
  • 0 关注
  • 115 浏览

添加回答

举报

0/150
提交
取消
微信客服

购课补贴
联系客服咨询优惠详情

帮助反馈 APP下载

慕课网APP
您的移动学习伙伴

公众号

扫描二维码
关注慕课网微信公众号