Partage
  • Partager sur Facebook
  • Partager sur Twitter

POO sous Unity

Sujet résolu
    9 août 2019 à 11:16:54

    Bonjour,

    Je découvre Unity en ce moment et je voudrais utiliser des accesseurs entre mes objets mais le problème c'est que je ne sais pas si il y a un moyen d'accéder à l'endroit où sont instanciés les objets pour pouvoir échanger entre eux. Je m'explique :

    En principe on a une classe "main" où l'ont démarre son code et à l'intérieur de cette classe on fait nos instances, puis on fait d'autres instances dans les objets que l'ont à créés et tout ce beau monde discute grâce à nos "getters" et "setters" ou nos paramètres de constructeurs.

    Mais dans Unity on attache un script à un modèle 3D mais je ne trouve pas où il est instancié pour pouvoir faire ce genre de choses. Dans les forums je ne trouve pas de sujets qui parlent de ça.

    Etant à l'aise avec la POO, là je bloque.

    Merci pour vos réponses.

    • Partager sur Facebook
    • Partager sur Twitter
      9 août 2019 à 15:35:24

      Bonjour,

      Pour moi le principe du POO sous les moteur de jeux est de faire en sorte que chaque script fait ce qu'il a à faire. Par exemple le script "Player" vas vérifier si il se fait attaquer ou vas gerer les déplacement du joueur et le script "CycleJourNuit" vas faire en sorte de changer le luminositée de la piece. Mais il n'y a pas de classe "Main" qui vas appeler les deux scripts.

      Pour ce qui est de la méthode de programmation de Unity, il faut voir les scripts exactement comme des classes mais qui héritent de MonoBehaviour (ex : public class Truc : MonoBehaviour) :

      Ces scripts pourront être assigné à des GameObject (objets visibles sur la gauche de l'ecran) et ajoutés via "AddComponent" en bas de l'inspecteur.

      Elles posséderont des fonctions propores à Unity (héritée du MonoBehaviour) tels que

      -Start() : Fonction qui se lance des le lancement du jeu (ou des son ajout)

      -Update() : Fonction qui se lance à chaque frame ([!] l'interval d'appel d'Update est toujours différente, elle peut par exemple être 0.001s, 0.001s, 0.0015s. Pour pouvoir par exemple rendre plus fluide un déplacement crée dans le Update il faut le multiplier par Time.deltaTime)

      -OnEnable() Fonction qui se lance lorsque le script s'active.

      Et bien d'autres (trouvables sur la doc d'Unity)

      Pour accéder à un autre script, il existe plusieurs façons de le faire (écris de mémoire).

      • Si tu as tag le GameObject : GameObject.FindGameObjectWithTag("nom du tag").GetComponent<NomDuScript>();
      • Si tu connais le nom du GameObject : GameObject.Find("nom du game Object").GetComponent<NomDuScript>();
      • Si tu n'a qu'un seul script dans ta scene : GameObject.FindAllComponent<NomDuScript>();
      • Si il est un de tes enfant : transform.getChild(num).GetComponent<NomDuScript>();
      Remarque que dans ces méthodes, on cherche d'abord de trouver le GameObject et ensuite de récuperer son script (avec GetComponent<>()).
      L'autre méthode qui est la plus claire et la moins brouillon :
      • On accede a un script via une référence du script via une variable : public NomDuScript nomVariable. Et d'ensuite d'assigner la référence en glissant le GameObject possédant ton script dans l'inspecteur.

      Il y a ensuite les classes qui n'héritent pas de MonoBehaviour qui fonctionnent comme des classes normales dans n'importe quel programme :

      Elles contiennent un ensemble de variables et de fonction mais interagissement pas avec le Jeu en lui meme :

      public class Inventory : MonoBehaviour{
      
      	private List<InventorySlot> slot;
      
      	private GameObject myGameObject;
      	
      	void Start(){
      	
      	slot = new List<Inventory>();
      	
      	//On recupere le GameObject
      	myGameObject = this.gameObject;//marche car hérite de MonoBehaviour
      	//On le desactive
      	myGameObject.SetActive(false); //marche car hérite de MonoBehaviour
      	
      	}
      	
      
      
      }
      
      public class InventorySlot{
      
      	
      	public static int idCount = 0;
      	public int id;
      	public Image image;
      	public string nom;
      	public int nombre;
      	
      	
      	//Constructeur
      	public InventorySlot(){
      		id = idCount;
      		idCount++;
      		image = null;
      		nom = "truc";
      		nombre = 4;
      	
      	}
      	
      	//exemple de ce qui ne marche pas
      	public void exemple(){
      		
      		gameObject.SetActive(false);//ne marche pas car n'hérite pas de MonoBehaviour
      	
      	}
      	
      	public void RemoveNbItem(int nb){
      		if (nombre >= nb)
      			nombre-=nb;
      	
      	}
      
      
      }
      
      //Attention de ne pas confondre avec un struct qui est juste un ensemble de données exemple :
       struct ItemData {
           int id;
           string nom;
           string desc;
       }
       //donc a toi de voir quoi utiliser.



      -
      Edité par coukil 9 août 2019 à 15:47:37

      • Partager sur Facebook
      • Partager sur Twitter
        9 août 2019 à 20:03:12

        Merci pour tes précisions j'y vois plus clair maintenant en gros on peut pas vraiment faire de de la POO avec unity ou tout du moins du bricolage.

        Je devrais pouvoir me débrouiller avec ce que tu m'as dit. Merci beaucoup.

        • Partager sur Facebook
        • Partager sur Twitter

        POO sous Unity

        × Après avoir cliqué sur "Répondre" vous serez invité à vous connecter pour que votre message soit publié.
        × Attention, ce sujet est très ancien. Le déterrer n'est pas forcément approprié. Nous te conseillons de créer un nouveau sujet pour poser ta question.
        • Editeur
        • Markdown