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"); ничего не делает, так как значение нигде не сохраняется.

Другие вопросы по тегам