Structure du projet - questions

Questions à propos du scripting. Hors Shader, GUI, Audio et Mobile.
Naografix
Messages : 16
Inscription : 16 Sep 2014 19:29

Structure du projet - questions

Message par Naografix » 20 Déc 2016 17:01

Bonjour à tous,

J'ai besoin que vous m'aidiez à mieux comprendre comment mettre en place ma structure côté script pour mes différents jeux.

En effet, je suis à la base développeur .NET Spécialisé en Xamarin, donc une bonne structure avec un pattern MVVM est le bienvenu.

Mais pour ce qui est de Unity, je ne sais pas comment mettre en place ma structure étant donné qu'il y a plusieurs façons de faire fonctionner des scripts entre eux.

Par exemple :

Si j'ai une class Joueur avec différentes propriétés linkée sur mon prefab Player :
-Id
-Name
-Life
-Speed

Si je veux faire un script pour le déplacement, pour moi, c'est mieux de faire un autre script que j’appellerais Controller ou dedans, j'aurais toute ma logique de déplacement.
Mais du coup ma prop Speed dans Player ne sert à rien.

Pareil pour la Life, pour moi, un script à part est mieux, comme ca je pourrais gérer correctement la vie du joueur, mais du coup ma Prop ne sert a rien.

Je viens d'être confronté a ce problème lors de la création d'un script pour le tremblement de la caméra.

Mon script se situe donc sur ma Camera, et je dois appeler ma fonction Shake quand je tire, donc ma fonction Shoot dans mon script Weapon linké sur mon prefab Player.

J'ai donc fait un Champ Public ou j'ai déplacé ma caméra à l'intérieur pour avoir ma fonction Shake.

En résumé :

GameObject Player (prefab)
|->Player (script)
|->Life (script)
|->Weapon (script)
|->Controller (script)

GameObject Camera (camera)
|->CameraShake (script)

Weapon -> call Shake -> CameraShake

Bref, j'ai écris un pavé, alors que vous avez peut être une solution toute bête à me donner.

Merci de votre aide.

Avatar de l’utilisateur
F@B
Messages : 1844
Inscription : 01 Août 2013 10:41
Contact :

Re: Structure du projet - questions

Message par F@B » 21 Déc 2016 14:57

Salut ! c'est un sujet intéressant.

globalement je ne sais pas quoi te conseiller comme architecture, unity est sur un modèle, entity / component qui ne se prête pas forcement a du pattern MVC.

de mon coté j'essaye de faire du MVC, mais souvent le controller se résume a un passe plat avec les components, et la logique se trouve difficile a externaliser du component. Par contre le coté model lui fonctionne pas mal. l'UI quand a elle fonctionne déja de façon assez autonome avec son EventSystem.

je fais beaucoup de "petits" projets de faible complexité qui du coup ne méritent pas toujours une architecture alambiquée.

Je suis vraiment pas spécialiste en archi je serais curieux aussi d'avoir des avis d'expert sur le sujet ! :ange:

encore mieux si certains ont des exemples ???

je voullais aussi regarder un peu l'archi de ce genre de package https://www.assetstore.unity3d.com/en/#!/content/12715
ʕ·͡ᴥ·ʔ ==> Mon Portfolio <== ʕ·͡ᴥ·ʔ

Merci de lire et de prendre en considération la Nétiquette des Forums avant de poster un sujet !

Naografix
Messages : 16
Inscription : 16 Sep 2014 19:29

Re: Structure du projet - questions

Message par Naografix » 21 Déc 2016 15:22

Salut !

C'est vrai que je suis souvent confronté à un problème de logique.

J'ai ma structure toute prête dans ma tête, mais lorsque je dois la faire sur Unity, je me rends compte que je ne pourrais pas faire comme ça ^^' !

J'ai passé mon projet en modèle héritage, en deux trois mots, ça ressemble à ça :

Player (prefab (obj))
|->PlayerBase : Mono
|->PlayerLife : PlayerBase
|->PlayerController : PlayerBase

Et du coup, j'ai toutes les propriétés dans mon PlayerBase qui définissent mon joueur :
-Life
-Speed
-Name
-Color...

Le seul soucis que j'ai rencontré pour le moment, est que les Start() des childs sont exécutes avant le Start() du parent.

Donc lorsque je veux récupérer la prop Color de mon parent dans le Start() de mon child, je ne peux pas.
J'ai contourné le problème en faisant des fonctions d'initialisation, du style :

Code : Tout sélectionner

protected void InitColor()
{
    Color = Constants.RedColor;
}

----------- 
Child/

void Start()
{
   base.InitColor();
   var temp = base.Color;
}
 ! Message de : F@B
Balise code ! lire la netiquette
Cela fonctionne, mais si je veux utiliser ma couleur dans mon Controller (autre script) par exemple (de la même façon que mon script Life), je dois appeler de nouveau InitColor(). Ce qui n'est pas top top...

Edit : Bizarrement, à chaque appel, Color est réinitialisé.

En bref, nous avons besoin d'un expert ! :P

Avatar de l’utilisateur
simonj
Messages : 293
Inscription : 29 Nov 2015 20:47
Localisation : Lyon

Re: Structure du projet - questions

Message par simonj » 21 Déc 2016 16:45

Juste de passage :

Code : Tout sélectionner

public class ParentFoo  : MonoBehaviour
{
	protected int value = 0;
	
	protected virtual void Start()
	{
		value++;
		Debug.Log("Parent : " + value); // Vaut "Parent : 1"
	}
}

public class ChildFoo : ParentFoo
{
	protected override void Start()
	{
		base.Start();
		
		value++;
		Debug.Log("Child : " + value); // Vaut "Child : 2"
	}
}
(Code fait directement sur le forum donc possibilité qu'il ne marche pas tout à fait)

Sur la console, tu auras dans cet ordre :
"Parent : 1"
"Child : 2"

C'est le principe de l'héritage. Donc normalement il n'y as pas de problème avec le Start ou quoi que ce soit.

Pour le problème de la structure, c'est une question hyper intéressante mais je n'ai pas beaucoup de temps pour l'instant pour y répondre. Je suivrais volontiers cette conversation ! De plus, sur Youtube tu peux trouver une video sur la chaine de Unity sur une conférence d'un dev bossant chez Niantic (Pokemon Go) expliquant la structure qu'ils ont mise en place. C'est très technique mais assez intéressant.

Naografix
Messages : 16
Inscription : 16 Sep 2014 19:29

Re: Structure du projet - questions

Message par Naografix » 21 Déc 2016 16:53

Salut !

Merci de ta réponse, mais en lisant bien ton code tu fais un base.Start(), ce qui signifie que tu appels le start() de ton parent.

Donc si j'ai 10 scripts qui hérite de mon parent, je suis obliger de faire 10 base.Start(), donc d'appeler 10 fois l'initialisation.

Voici le problème suivant (de ce que je comprends) :

Mon joueur spawn avec 100 de vie.
Il joue, il joue, et perd de la vie et descend à 40 par exemple.
Il fait une action et appel un script (en faisant apparaître un objet par exemple) héritant du parent.
Ne penses tu pas que, avec le base.Start(), ma life repassera à 100 ?


Edit : Je viens de le faire, et bien entendu, chaque script créait leur propre instance de PlayerBase avec le Start().

J'aimerais simplement que ma propriété Life qui est dans mon PlayerBase soit commune à tout les scripts qui l'utiliseront.

Plus simple à comprendre : J'init ma Life dans mon PlayerBase à 100. Je fais ce que tu m'as dis de faire, j'update ma Life dans mon PlayerBase et la passe à 50, dans mon PlayerLife, ca ne change pas.

Merci de ton aide
Dernière édition par Naografix le 21 Déc 2016 17:11, édité 1 fois.

Avatar de l’utilisateur
simonj
Messages : 293
Inscription : 29 Nov 2015 20:47
Localisation : Lyon

Re: Structure du projet - questions

Message par simonj » 21 Déc 2016 17:09

Qu'est-ce que tu entends par
J'aimerais simplement avoir ma prop Life qui soit dans mon PlayerBase et commune à tout les scripts qui l'utiliseront.

Naografix
Messages : 16
Inscription : 16 Sep 2014 19:29

Re: Structure du projet - questions

Message par Naografix » 21 Déc 2016 17:11

Nao et Français = 2 !

Je voulais dire : J'aimerais simplement que ma propriété Life qui est dans mon PlayerBase soit commune à tout les scripts qui l'utiliseront.

(Je suis en train de faire un projet de test pour que tu vois plus facilement ce que je veux faire)

Voila ma solution de test :

https://www.sendspace.com/file/lyhh73

Moi 1971
Messages : 727
Inscription : 29 Sep 2015 13:38

Re: Structure du projet - questions

Message par Moi 1971 » 21 Déc 2016 18:05

Bonjour,
La propriété "commune" se traduit-elle pour toi par "unique"?
Si oui c'est une variable statique qu'il faut utilisée... non?

Naografix
Messages : 16
Inscription : 16 Sep 2014 19:29

Re: Structure du projet - questions

Message par Naografix » 21 Déc 2016 18:09

Dans mon cas, oui.

Commune serait égale à unique, car seule une variable serait ici fonctionnelle.

C'est vrai que j'ai pas testé vos deux solutions ENSEMBLES.

Le static tout seul ne fonctionnait pas, mais couplé à un base.Start(), cela fonctionnera surement !

Edit : Ca fonctionne en effet, mais en terme de structure, mettre mes prop en protected et en static, ca ne perd pas un peu de sens pour de l'héritage ?

Répondre

Revenir vers « Scripting »