7 votes

Comment puis-je simplifier cette longue série d'instructions if ?

J'utilise Unity pour créer un jeu. J'ai plusieurs ennemis animaux dans le jeu.

Je travaille sur des missions à l'intérieur du jeu où vous devez tuer un nombre aléatoire d'animaux aléatoires, ce que j'ai déjà fait.

Ce qui me pose problème, c'est d'augmenter le nombre de missions quand on tue un animal.

J'ai un script (mort) assis sur chaque animal, quand l'animal meurt il appelle une fonction publique à l'intérieur du script mort.

Du script mort, il devrait augmenter une valeur int dans le script "MissionHolder" où tous les animaux ont une valeur int à augmenter lorsque vous tuez un animal.

Le problème est que je ne sais pas quel animal est tué lorsque le joueur tue un animal, ce que j'ai fait est le suivant :

public string Name;
public MissionHolder missionHolder;
    public void Kill()
{
    if (name == "Tiger")
    {
        missionHolder.Tiger += 1;
    }

    if (name == "Hyena")
    {
        missionHolder.Hyena += 1;
    }

    if (name == "Gorilla")
    {
        missionHolder.Gorilla += 1;
    }

    if (name == "Giraffe")
    {
        missionHolder.Giraffe += 1;
    }

    if (name == "Gazelle")
    {
        missionHolder.Gazelle += 1;
    }

etc.

Maintenant, je nomme simplement chaque animal par son nom sur le script mort mais ce n'est pas vraiment efficace.

Quelqu'un connaît-il une meilleure façon de procéder ?

8voto

Programmer Points 69203

Vous pouvez utiliser Dictionary . Enregistrez tous les types d'animaux sous forme de chaîne de caractères puis utilisez Action comme la valeur dans le Start o Awake fonction. Ce site Action contiendra tous les noms que vous avez actuellement dans votre if déclarations. Lorsque vous voulez tuer un animal, vérifiez s'il se trouve dans ce Dictionary puis exécutez le Action .

public string Name;
public MissionHolder missionHolder;

Dictionary<string, Action> animalToAction = new Dictionary<string, Action>();

void Start()
{
    //Register and animal type and Action
    animalToAction.Add("Tiger", delegate { missionHolder.Tiger += 1; });
    animalToAction.Add("Hyena", delegate { missionHolder.Hyena += 1; });
    animalToAction.Add("Gorilla", delegate { missionHolder.Gorilla += 1; });
    animalToAction.Add("Giraffe", delegate { missionHolder.Giraffe += 1; });
    animalToAction.Add("Gazelle", delegate { missionHolder.Gazelle += 1; });
}

Votre nouvelle fonction Kill :

public void Kill()
{
    //If the name exists in the dictionary, execute the corresponding delegate
    Action action;

    if (animalToAction.TryGetValue(Name, out action))
    {
        //Execute the approprite code
        action();
    }
}

Vous pouvez utiliser EventManager pour le faire, mais ce n'est pas nécessaire.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X