snake555510
snake555510

Reputation: 81

UNITY c#: Spawning character prefabs based on user selection

I have game for multiple players where each user selects their hero before game starts and that loads the selected heroes into the battle arena.

I have small issue with getting the instantiation to spawn in correct numbers of players The method that I have for Spawning the characters:

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);
                }
                {
                }
            }
        }
    }

This script checks for amount of selected hero cards and puts it against my list that has all the available heroes to choose from(prefabs). The debug.log shows that only the correct heroes get called. Instantiate ends up spawning a loot of heroes instead of the selected amount.

For clarity I attach full class:

{

    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);
                }
                {
                }
            }
        }
    }
}

I hope someone can explain where I am going wrong with this. Thanks,

Upvotes: 0

Views: 922

Answers (2)

Health_Potion
Health_Potion

Reputation: 21

I did not even notice the update function part. Just a heads up, in your start function, PlayerPrefs.GetInt("PlayerSize"); is not doing anything since the value is not saved anywhere.

Upvotes: 0

snake555510
snake555510

Reputation: 81

I got the answer, I guess I was just being tired from working and could not see the obvious. For those who wonder what solution is The method gets called each frame thus it continues to endlessly spawn objects There are 2 ways to fix it 1 Make coroutine and then return after you make your initial batch 2 Use a boolean at update so not only it checks player size but also whenever it can spawn it or not, you set the boolean to false after method get called.

Upvotes: 1

Related Questions