[Résolu] Vérifier l'état d'un booléen d'un script A via un script B V5.0

#1

Bonsoir tout le monde,

Voilà mon souci, je souhaiterai pouvoir vérifier l’état d’une variable et plus précisément d’un booléen présent dans un script A via un script B.
De cette manière (en C# Unity):
ScriptA:

public bool coucou;
coucou = true;

ScriptB:

public ScriptA monScriptA;
void Start () {if (monScriptA.coucou) debug.Log("coucou = true");}

Mon but final est de pouvoir vérifier si le script A peut être appelé ou si il est déjà exécuté, donc qu’il ne doit pas se rejouer.
J’ai essayé de chercher des tutos ou autres, mais malheureusement je n’ai trouvé personne traitant ce sujet.
Pour ce qui est de mes tests … bah c’est pas très concluant. J’ai tenté ceci:
scriptA:

_coucou = true;
hint "Le script se lance via le script B";

ScriptB:

if ([true, "_coucou", 1] call ScriptA.sqf) {
    [] execVM "ScriptA.sqf";
} else {
    exitWith{hint "zut ça ne fonctionne pas"};
};

J’ai tenté de reprendre une condition du script core/items/fn_blastingCharge.sqf
Mais bon enfaite ça ne convient absolument pas. En revanche j’imagine que ça ne doit pas être trop éloigné de ce que je cherche.

Je ne cherche pas vraiment à créer un serveur, mais plutôt à apprendre à coder sur arma pour le fun. Du coup, je suis preneur de tous vos conseils.

Bien cordialement.
Erwann

0 Likes

#3

Il te faut creer des parametres, c est ce qui sera le plus simple (des arguments)

Regarde ceci :

1 Like

#4

Je suis pas du tout un expert unity mais voila mon avis:

Tu peut pas recupere l’instance de ton script comme cela
Tu dois recuper le script depuis l’instance d’un object sur le quel le script est lancer.

TonObject.GetComponent<TonScript>().coucou;

Ce sera peut etre plus compliquer en fonction de ta situation mais c’est l’idee

Ou tu peut utiliser un singleton

Example sous unity

  public static GameRule instance = null;

  private void Awake()
  {
    if (instance == null)
    {
      instance = this;
    }
    else
      Destroy(this);
  }

Apres dans tes scripts tu call au travers de ton instance

Debug.Log(GameRule.instance.coucou
0 Likes

#5

pk en Unity ?? le debut l est mais ses test sont en SQF

0 Likes

#6

Oui je sais bien c’était juste pour exprimer ce que je veux faire sur du arma3 par rapport à un autre langage pour que n’importe qui puisse comprendre sans rentrer en détail sur les fonctions unity

0 Likes

#7

@brutalzic c’est pour exprimer ce que je veux faire sur du sfq arma
En gros j’aimerai exécuter ma fonction sqf pour qu’elle ait la même action que ma fonction en C#

0 Likes

#8

@brutalzic @Erwannc yep j’avais compris l’inverse my bad

0 Likes

#9

@brutalzic merci pour ton lien je checke ça après

0 Likes

#10

Il faut bien differencier ton local / global et faire attention au scheduler.

0 Likes

#11

@brutalzic j’ai compris l’envoie d’une valeur d’une variable dans un autre script ça ça va (fais comme si tu n’avais pas vu mon appel de trois arguments non existant dans mon scriptB oups), mais justement c’est de vérifier si la valeur d’une variable du ScriptA convient pour que j’exécute ce même ScriptA :confused:

0 Likes

#12

Utilise une variable global !
https://community.bistudio.com/wiki/Variables

0 Likes

#13

Pour moi ya plus simple mais je suis pas non plus un expert et ça ne fonctionnera qu’avec une seule variable, sinon il faut utiliser les params

script1

_coucou = true;
hint “Le script se lance via le script B”;
_coucou //Retourne la variable en fin de script pour qu’elle puisse être retournée dans la console ou dans un call

second script

if ([] call fn_script1) then {
blablabla
};
0 Likes

#14

Merci pour ta réponse.
Avec l’aide et les conseils de Brutalzic, je me suis tournée vers un setVariable et getVariable.
Ce que tu proposes me semble être similaire à ce que j’avais fait mais je n’ai pas réussi à le faire fonctionner.
Dès que j’ai le temps je vais essayer le set et getVariable ensuite je me pencherai sur le call

0 Likes

#15

Le setvariable ça permet de définir une variable sur un objet, par exemple un joueur, un groupe, un batiment etc mais si cet objet n’est pas défini a la base ça ne peux pas fonctionner.

Je supposes que ton call n’avait pas fonctionné parceque tu n’a pas mis de return a la fin de ton script initial

J’ignore ce que tu veux faire exactement avec ton script mais le set/getVariable semble être une complication, même si c’est toujours bien de l’apprendre.

Si ton script initial retourne forcément un boléen, le mieux c’est d’utiliser le return avec un call tout simple du script initial.

0 Likes

#16

en gros mon idée et de rentre malade le joueur de manière aléatoire et là où je bloque c’est le fait de vérifier si il est malade avant de lancer le script de maladie comme ça si il l’est on sort du script sinon on déclenche la maladie
du coup la variable booléen que l’on nommera isSick devra pouvoir être vérifié par un autre script (celui qui appelle le script de la maladie) et pourvoir être modifié encore par un autre script (celui du médicament) de manière à ce que la maladie lui cause des dégâts tant qu’il est malade, mais s’arrête dès que isSick passe en false

0 Likes

#17

Dans ce cas tu peux effectivement utiliser le set/getVariable , c’est même la meilleure façon de faire.

exemple

if (life_hunger < 20) then { //Le joueur tombe malade quand sa faim est en dessous de 20
player setVariable ["isSick",true,true]; //["VarName",valeur,public];
};

script 2:

if (player getVariable "isSick") then {
hint "Vous êtes malade";
};
1 Like

#18

j’ai procédé de cette manière (grâce à Brutalzic <3), mais je n’ai pas encore testé
Au vu de ce que tu me dis et de ce que Brutalzic m’a dit je pense que mon script sera fonctionnel ahah
J’updaterai mon post après les tests
Merci beaucoup pour ton aide

0 Likes

#19

Tiens nous au courant ! :slight_smile:

0 Likes

#20

Je pousserais un peux plus le truc … pourquoi utiliser un boolean et non un scalar ??

un boulean te dis t es malade “true” ou “false” ! Ouai, bah ca reste basique …
Si tu utilise un scalar tu peux pousser en utilisant:
0 = pas malade
1 = malade niveau 1
2 = malade niveau 2
3 = malade niveau 3
ainsi tu peux gerer different niveau de maladie …
Apres cela, il te suffis de creer un fichier de config avec les maladies possible selon le niveau de maladie.

C est plus complex de pas grand chose mais le resultat sera plus pousse !

0 Likes

#21

j’y ai pensé via un switch pour déterminer le niveau de maladie dans mon fn_disease.sqf, mais avant tout je vais terminer à 100% et optimiser le plus possible ma base
pour la suite je compte créer un item “drug” et via le core\pmenu\fn_useItem.sqf met isSick sur false pour stopper l’effet de maladie
ensuite voir au niveau des effets ou bien activer la fatigue
et après voir pour différent niveau de maladie et surtout changer le système pour tomber malade pour ne pas selon le limiter au fait de tomber malade à cause de la nourriture mais plutôt du fait d’un niveau de vie faible sur la durée ou autre

0 Likes