Повторение через список не обновляет объекты должным образом - PullRequest
0 голосов
/ 21 апреля 2019

Я пытаюсь пройтись через кучу 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]);
}

Однако кажется, что последние «оружейные позиции» применяются ко всему.Итак, WeaponePositions - это список типа Transform, и я хочу установить позицию оружия [0], например, в положение Weapon Position [0].

Проблема заключается в том, что когда он достигает третьего оружия (последний в данном случае), он применяет позицию оружияPosition [2] к каждому из ранее выпущенных видов оружия, а не только к его индексу.

Это оружие SerailizedField:

[SerializeField] GameObject[] equippedWeapons;

В оружии метод setWeapon просто:

Transform positionOfWeaponOnShip;

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

Вопрос, который я задаю, заключается в том, правильно ли я здесь использую Список?Я озадачен тем, почему он не применяет это только к i-му значению.Я также не уверен, что еще я могу поставить здесь, что было бы полезно ...

Спасибо, Бого

Ответы [ 3 ]

1 голос
/ 22 апреля 2019

Вы пытаетесь присвоить объекту новое преобразование, которое невозможно.Каждый объект в 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;
}
1 голос
/ 21 апреля 2019

Если вы хотите изменить позицию преобразования, вы должны изменить positionOfWeaponOnShip.position, а не positionOfWeaponOnShip. Я надеюсь, что это поможет вам!

Transform positionOfWeaponOnShip;
public void setPosition(Transform pos)
{
    positionOfWeaponOnShip.position = new Vector3(pos.x, pos.y, pos.z);
}
0 голосов
/ 26 апреля 2019

Кажется, проблема заключалась в том, что каждая ссылка была на один и тот же сборный, а не на экземпляр этого сборного.

Чтобы решить эту проблему, при запуске сценария с оружием я создаю новую версию этого оружия, а не ссылаюсь на префаб. Теперь это работает:)

Спасибо за помощь! Бого

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...