В вашей функции DestroyGold()
вы создаете экземпляр золота следующим образом:
foreach (GameObject Gold in goldBarArray)
{
Destroy(Gold);
Instantiate(goldBarArray[5], goldRespawnPoint, goldStartPosition);
goldRespawnPoint = transform.position;
goldStartPosition = transform.rotation;
//healthManager.RespawnCo();
}
Но transform.position
и transform.rotation
получают только положение и поворот текущего объекта (т.е. независимо от того, какой сценарий используется)прикреплен к).Таким образом, вы не только порождаете все золото в одном месте, но и порождаете золото в месте объекта, содержащего ваш сценарий, а не там, где вы на самом деле хотите, чтобы он пошел!
Не зная об объектах многов вашей сцене вот что я могу вам сказать: попробуйте создать Transform[]
для хранения мест, где вы хотите возродить золото.Кроме того, убедитесь, что вы назначили goldRespawnPoint
и goldStartPosition
ДО того, как вы вызовете Instantiate()
в цикле foreach.Наконец, просто общий совет: вы никогда не должны использовать variable == true
или variable == false
в выражении if
.Вы можете просто использовать if(variable)
или if(!variable)
, соответственно.Он будет работать точно так же, будучи более читабельным и уменьшая объем кода, который вам нужно написать.
РЕДАКТИРОВАТЬ 1: В ответ на комментарии я добавил конкретные примеры кода для реализацииэти предложения.
Для начала, вы, вероятно, получаете ошибку вне диапазона из-за goldBarArray[5]
.Поскольку массивы начинаются с индекса 0, вы можете получить доступ только к элементу n-1
в массиве n
.Подробнее о том, как это исправить, на следующем шаге.
Теперь для массива Transform
.В области, где вы объявляете свои публичные переменные (вверху скрипта), добавьте строку
public Transform[] spawnPoints;
Затем, снова в Unity вы сможете назначить эти точки появления в Инспекторе.
EDIT 2: Кроме того, в цикле foreach
вы пытаетесь создать один из золотых слитков со сцены, но они удаляются с помощью оператора Destroy(Gold);
.Вместо этого вы должны создать экземпляр из сборного, который не будет уничтожен.Для этого добавьте
public GameObject goldPrefab;
вместе с остальными открытыми переменными.Затем в редакторе создайте сборный блок, перетащив один из золотых слитков из иерархии в папку «Активы».Наконец, задайте для этого префаба значение goldPrefab
в Инспекторе.
Теперь вы можете немного очистить цикл foreach
.Вы можете избавиться от строк goldRespawnPoint
и goldStartPosition
, потому что места респауна будут содержаться в массиве Transform
, который мы только что создали.Опять же, не зная, как устроена ваша сцена, мне нужно было просто сделать обоснованное предположение о том, что будет работать.Попробуйте этот цикл:
int spawnPointCounter = 0;
foreach(GameObject Gold in goldBarArray){
Destroy(Gold);
Transform currentSP = spawnPoints[spawnPointCounter];
Instantiate(goldPrefab, currentSP.position, currentSP.rotation);
spawnPointCounter++;
}