[Résolu][DB-AL] Questions générales - Logique Unity

Pour les scripts écrits en C#
Règles du forum
Merci de respecter la NOMENCLATURE suivante pour vos TITRES de messages :

Commencez par le niveau de vos scripts
DB = Débutant
MY = Moyen
CF = Confirmé

Puis le domaine d'application
-RS = Réseau
-AL = Algorithmie

Exemple :

[DB-RS] Mouvement perso multijoueur
Nikow
Messages : 12
Inscription : 08 Sep 2016 12:29

[Résolu][DB-AL] Questions générales - Logique Unity

Message par Nikow » 10 Avr 2017 20:30

Bonjour tout le monde !

Je cherche la réponse à ces questions depuis plusieurs jours maintenant, mais rien de concluant pour moi, je pose donc les questions ici, en espérant des retours plus clairs que ce que j'ai pu avoir jusqu'à aujourd'hui.

J'ai des questions sur la logique de Unity, par exemple :

- Si je dois constituer un niveaux de 'blocs', est ce que je dois crée une class bloc qui instantie toute seule le modèle 2D ou 3D associé ou alors je dois instantier des prefab de blocs auquel un script est attaché ?

Je commence doucement avec cette question qui en amènera d'autres ensuite :) !

Et si ce n'est pas clair, n'hésitez pas, je peux reformuler si besoin,

Merci d'avance !
Dernière édition par Nikow le 18 Avr 2017 08:51, édité 1 fois.

Avatar de l’utilisateur
Drakulo
Messages : 113
Inscription : 10 Mars 2017 22:49
Contact :

Re: [DB-AL] Questions générales - Logique Unity

Message par Drakulo » 10 Avr 2017 23:42

Hello.
Nikow a écrit :Si je dois constituer un niveaux de 'blocs', est ce que je dois crée une class bloc qui instantie toute seule le modèle 2D ou 3D associé ou alors je dois instantier des prefab de blocs auquel un script est attaché ?!
A moins d'avoir une configuration dynamique de tes GameObjects (depuis un fichier de configuration par exemple), utiliser des Prefabs me semble tout à fait approprié. C'est plus clair et plus pratique à utiliser. Tu crées ton modèle de GameObject selon tes besoins, et ensuite tu les ajoutes dynamiquement sur ta scène via un manager quelconque (un script attaché à un GameObject vide).
Fun Games Maker @TriplArt
Coach à esprit UNITY : Finissez vos jeux, vivez de votre passion
Enseignant de programmation / Unity3D à Bellecour Ecole

Nikow
Messages : 12
Inscription : 08 Sep 2016 12:29

Re: [DB-AL] Questions générales - Logique Unity

Message par Nikow » 11 Avr 2017 11:53

Drakulo a écrit :Hello.
Nikow a écrit :Si je dois constituer un niveaux de 'blocs', est ce que je dois crée une class bloc qui instantie toute seule le modèle 2D ou 3D associé ou alors je dois instantier des prefab de blocs auquel un script est attaché ?!
A moins d'avoir une configuration dynamique de tes GameObjects (depuis un fichier de configuration par exemple), utiliser des Prefabs me semble tout à fait approprié. C'est plus clair et plus pratique à utiliser. Tu crées ton modèle de GameObject selon tes besoins, et ensuite tu les ajoutes dynamiquement sur ta scène via un manager quelconque (un script attaché à un GameObject vide).

Salut,

Merci de ta réponse, je vais donc utiliser une liste de prefab pour mes objets.

Un autre question : Si j'enregistre une liste comme ça :

Code : Tout sélectionner

listeBlcocs[i] = Instantiate(sols, new Vector3(0,0,0), Quaternion.identity);

Est ce que j'aurais bien le gameObject et ses propriétés dans mon tableau ?

Dernière question, j'ai l'impression de manquer d'outils de débug ?

Merci d'avance.

Avatar de l’utilisateur
Drakulo
Messages : 113
Inscription : 10 Mars 2017 22:49
Contact :

Re: [DB-AL] Questions générales - Logique Unity

Message par Drakulo » 11 Avr 2017 15:07

Oui, chaque case de ton tableau sera rempli avec un lien vers le GameObjects instancié correspondant. Par contre, à moins que tu aies besoin d'en faire quelque chose après les avoir créé dynamiquement, ce n'es pas la peine de les stocker dans un tableau. Le simple fait d'appeler Instantiate va créer le GameObject sur la scène.

Pour ce qui est du debug, tu peux écrire dans la console avec ça : https://docs.unity3d.com/ScriptReference/Debug.Log.html.

Sinon, tu peux aussi utiliser l'inspecteur pour afficher des infos.
Dernière édition par Drakulo le 12 Avr 2017 18:00, édité 1 fois.
Fun Games Maker @TriplArt
Coach à esprit UNITY : Finissez vos jeux, vivez de votre passion
Enseignant de programmation / Unity3D à Bellecour Ecole

Nikow
Messages : 12
Inscription : 08 Sep 2016 12:29

Re: [DB-AL] Questions générales - Logique Unity

Message par Nikow » 12 Avr 2017 12:17

Drakulo a écrit :Oui, chaque case de ton tableau sera remplie avec un lien vers le GameObjects instancié correspondant. Par contre, à moins que tu aies besoin d'en faire quelque chose après les avoir créé dynamiquement, ce n'es pas la peine de les stocker dans un tableau. Le simple fait d'appeler Instantiate va créer le GameObject sur la scène.

Pour ce qui est du debug, tu peux écrire dans la console avec ça : https://docs.unity3d.com/ScriptReference/Debug.Log.html.

Sinon, tu peux aussi utiliser l'inspecteur pour afficher des infos.
Ok merci c'était bien le but !

Maintenant un autre exemple :

Si j'ai besoin d'un objet avec des propriétés spécifiques, je crée une class avec toutes les propriétés dont j'ai besoin, et ensuite je dois accroché cette classe sur un prefab ? ou alors je crée des instances de cette classe dans mon code ? ( et du coup comment j instantie le prefab correspondant ) ?

Merci !

Avatar de l’utilisateur
Drakulo
Messages : 113
Inscription : 10 Mars 2017 22:49
Contact :

Re: [DB-AL] Questions générales - Logique Unity

Message par Drakulo » 12 Avr 2017 18:02

Utilise au maximum les Prefabs, ils sont faits pour ça. Donc oui, crée une classe qui va avoir le comportement particulier que tu veux, tu crées un GameObject avec ce script attaché puis tu en fais un Prefab. Tu pourras ensuite l'utiliser comme bon te semble. :super:
Fun Games Maker @TriplArt
Coach à esprit UNITY : Finissez vos jeux, vivez de votre passion
Enseignant de programmation / Unity3D à Bellecour Ecole

Nikow
Messages : 12
Inscription : 08 Sep 2016 12:29

Re: [DB-AL] Questions générales - Logique Unity

Message par Nikow » 13 Avr 2017 01:32

Hello et merci pour tes réponses c'est top ;) !

J'ai un problème plus complexe :

J instantie dynamiquement des prefab dans une scène, ces prefab ont un script associé qui à l'aide d'un OnMouseDown doit afficher un menu, mais impossible de faire un lien entre ces prefabs instantiés dynamiquement et le canvas de ce menu ??

Merci ;)

Avatar de l’utilisateur
evereal
Messages : 109
Inscription : 06 Nov 2015 18:46

Re: [DB-AL] Questions générales - Logique Unity

Message par evereal » 13 Avr 2017 08:28

Hello,
Si tu instancie dynamiquement, je suppose que tu as qq part dans un script

Code : Tout sélectionner

Instantiate(myPrefab);
Il te suffit a cet endroit de récupérer le script de ton prefab et de lui affecter le menu. Ce qui devrai donner qqchose du genre :

Code : Tout sélectionner

GameObject myMenu;
...
myPrefabScript mps= Instantiate<myPrefabScript>(myPrefab);
mps.setMenu(myMenu);
“La théorie, c'est quand on sait tout et que rien ne fonctionne. La pratique, c'est quand tout fonctionne et que personne ne sait pourquoi. Ici, nous avons réuni théorie et pratique : Rien ne fonctionne... et personne ne sait pourquoi !”

Nikow
Messages : 12
Inscription : 08 Sep 2016 12:29

Re: [DB-AL] Questions générales - Logique Unity

Message par Nikow » 13 Avr 2017 11:49

Salut,

J'ai pas bien compris ta solution...

En gros j'ai ça :

Fichier 1 :

Code : Tout sélectionner

Instantiate (ground, new Vector3 (i, 0, j), Quaternion.identity);
Fichier attaché à mon prefab ground :

Code : Tout sélectionner

menuConstruction = GameObject.Find ("MainLoop").GetComponent<References> ().menuConstruction;

void OnMouseDown(){
	menuConstructionVisibily = !menuConstructionVisibily;
	menuConstruction.SetActive(menuConstructionVisibily);
}
En fait je n'arrive pas a linker mon menuConstruction dans ce script du coup j'ai cette erreur :

Object reference not set to an instance of an object ground.OnMouseDown ()

Merci de votre aide :)

Avatar de l’utilisateur
evereal
Messages : 109
Inscription : 06 Nov 2015 18:46

Re: [DB-AL] Questions générales - Logique Unity

Message par evereal » 13 Avr 2017 13:48

Il faut donne la référence de ton menuConstruction à ton fichier1 et l'affecter a tes instances de ton prefab dès leur création.
Ton Fichier1 doit donc devenir :

Code : Tout sélectionner

public class Fichier1: MonoBehaviour {
    [Serializefield] private GameObject menuConstruction;
    [Serializefield] private GameObject ground;
    
    void Start() {
        instantiateMyPrefab();
    }
    
    void instantiateMyPrefab() {
      GroundScript myGround = Instantiate<GroundScript>(ground, new Vector3 (0, 0, 0), Quaternion.identity);
      myGround.setMenu(menuConstruction);
    }
}
et dans ton script rattaché a ton prefab ground

Code : Tout sélectionner

...
private GameObject menuConstruction;
...
public void setMenu(GameObject aMenu) {
   menuConstruction = aMenu;
}

void OnMouseDown(){
   menuConstruction.SetActive(!menuConstruction.activeSelf);   
}
}
...
“La théorie, c'est quand on sait tout et que rien ne fonctionne. La pratique, c'est quand tout fonctionne et que personne ne sait pourquoi. Ici, nous avons réuni théorie et pratique : Rien ne fonctionne... et personne ne sait pourquoi !”

Répondre

Revenir vers « (C#) CSharp »