• » Jeux Vidéo
  • » Toi aussi deviens indéveloppeur [Unity/UE4 pour platformers 2D osef]
hichlibedis
hichanbis

Hola, j'ai un problème d'accès concurrent à une méthode qui me rend dingue.
En donjon quand un ennemi entre dans le périmètre du joueur il peut déclencher une attaque et demander l'avantage.
L'ennemi peut en faire de même.
Le problème c'est que de temps en temps les deux appels ont lieu pile en même temps (même frame je suppose) et je ne parviens pas à empecher que le deuxieme demandeur de l'avantage ne l'obtienne pas.

Mon code simplifié coté Ennemi

void OnTriggerEnter(Collider other)
    {
        if (other.tag == "Player")
        {
           TransitionManager.Instance.GetAdvantage(Advantage.Enemy);
        }
    }

Coté player:

void OnTriggerEnter(Collider other)
    {
        if (other.tag == "Enemy")
        {
           TransitionManager.Instance.GetAdvantage(Advantage.Player);
        }
    }

Et maintenant le code du Manager qui donne l'avantage (advantageGiven est initialisé à false évidemment):

public void GetAdvantage(Advantage advantage)
    {
        if (advantageGiven)
            return;
        
        advantageGiven = true;
        this.advantage = advantage;
        advantageGiven = false; //edit: j'avais oublié cette instruction de reset qui a l'air d'être le coeur du souci
    }

Normalement la partie   

if (advantageGiven)  return;

devrait assurer que le deuxième arrivé ne puisse pas récupérer l'avantage.
En pratique il y arrive quand même de temps en temps.
Help unityrama!

hichanbis (25 May 2017)