UNITY C#: порождает префабы символов на основе выбора пользователя
У меня есть игра для нескольких игроков, где каждый пользователь выбирает своего героя до начала игры и загружает выбранных героев на арену сражений.
У меня есть небольшая проблема с получением экземпляра для появления в правильном количестве игроков. Метод, который я использую для появления персонажей:
private void Placement()
{
for (int i = 0; i < SelectedCards.Count; i++)
{
for (int t = 0; t < AvailableHeroes.Count; t++)
{
if (AvailableHeroes[t].name == SelectedCards[i].name)
{
Debug.Log(AvailableHeroes[t]);
// Instantiate(AvailableHeroes[t], PlayerSpawnLocation[t].transform.position, transform.rotation);
}
{
}
}
}
}
Этот скрипт проверяет количество выбранных карт героев и помещает его в мой список, в котором есть все доступные герои на выбор (префабы). Debug.log показывает, что только правильные герои получают вызов. Instantiate в конечном итоге порождает множество героев вместо выбранной суммы.
Для наглядности прилагаю полный класс:
{
private int playerSize; //amount of choices for card selection
private GameManager GM;
[Header("Lists for Spawning in Heroes")]
public List<GameObject> SelectedCards;
public List<GameObject> AvailableHeroes;
public List<Transform> PlayerSpawnLocation;
[Header("Canvas used for the game")]
public Transform GameCanvas;
public Transform CharacterCanvas;
//When scene starts it takes how many players will be picking a card.
void Start()
{
//connects this script with gamenmanager to be able to manipulate the cameras
GM = GameObject.Find("GameManager").GetComponent<GameManager>();
//gets playersize information from main menu selection
PlayerPrefs.GetInt("PlayerSize");
playerSize = PlayerPrefs.GetInt("PlayerSize");
SelectedCards = new List<GameObject>();
//enables/disables correct canvas not to cause any problems when we initiate this scene
GameCanvas.gameObject.SetActive(false);
CharacterCanvas.gameObject.SetActive(true);
}
// Update is called once per frame
void Update()
{
if (playerSize <= 0)
{
Placement();
GM.CharacterSelectionCamera.enabled = false;
GameCanvas.gameObject.SetActive(true);
CharacterCanvas.gameObject.SetActive(false);
GM.BattleCamera.enabled = true;
}
}
public void PlayerSelected(int cardPicked)
{
playerSize -= cardPicked;
}
private void Placement()
{
for (int i = 0; i < SelectedCards.Count; i++)
{
for (int t = 0; t < AvailableHeroes.Count; t++)
{
if (AvailableHeroes[t].name == SelectedCards[i].name)
{
Debug.Log(AvailableHeroes[t]);
// Instantiate(AvailableHeroes[t], PlayerSpawnLocation[t].transform.position, transform.rotation);
}
{
}
}
}
}
}
Я надеюсь, что кто-то может объяснить, где я иду не так с этим. Спасибо,
2 ответа
Я получил ответ, наверное, я просто устал от работы и не видел очевидного. Для тех, кто интересуется, каково решение, метод вызывается в каждом кадре, таким образом, он продолжает бесконечно порождать объекты. Есть 2 способа исправить это:1 Создать сопрограмму, а затем вернуться после создания исходного пакета.2 Использовать логическое значение при обновлении, чтобы проверять не только размер игрока, а также всякий раз, когда он может породить его или нет, вы устанавливаете логическое значение в false после вызова метода.
Я даже не заметил часть функции обновления. Просто на голову, в вашей функции запуска PlayerPrefs.GetInt("PlayerSize"); ничего не делает, так как значение нигде не сохраняется.