[DB-AL] Stoker/Récupérer des données dans des cubes

Questions à propos du scripting. Hors Shader, GUI, Audio et Mobile.
Avatar de l’utilisateur
Yugo
Messages : 24
Inscription : 12 Nov 2018 15:22

[DB-AL] Stoker/Récupérer des données dans des cubes

Message par Yugo » 03 Déc 2018 02:26

Salut
Comment m'y prendre ?
je veux que le joueur puisse assembler des cubes entre eux. (il peut y en avoir des centaines)
Les cubes ont des propriétés de collage différentes.
Certains se collent que par la face droite, d'autres par le haut et le bas....
Le joueur sélectionne a la souris un cube A, le déplace et vient toucher la face d'un autre cube B.
Il faudrait que je récupère des infos sur ces 2 cubes (est ce que le collage à gauche est possible pour A et à droite pour B...)
J'ai pensé à attacher un script sur chaque cube contenant une méthode CollagePossible que j'appel depuis mon script principal mais dans ce cas il faudrait que tous les cubes différents aient un script au nom différent avec des méthodes différentes....Et comment je vais savoir quelle classe appeler???
Le top serait d'avoir un component du cube qui retiendrait 6 bool (haut bas droite gauche devant derrière)
Là je dirait

Code : Tout sélectionner

if (cubeA.GetComponent<info>(gauche) && cubeB.GetComponent<info>(droite)) { Attache (A,B); }
Quels sont vos avis éclairés ?

djulio74
Messages : 682
Inscription : 19 Déc 2009 22:55

Re: [DB-AL] Stoker/Récupérer des données dans des cubes

Message par djulio74 » 03 Déc 2018 09:16

tu peux très bien avoir un script par cube, contenant 6 variables de type bool.
quand tu dépose un cube, ton script principal doit savoir quel cube tu a posé, et à coté de quel(s) cube(s). Ensuite il suffit d'aller dans le script de chaque cube pour retrouver le bool des faces voulues pour les comparer.

avec ton exemple de code c'est presque ça mais, si "info" est le nom du script sur chaque cube, contenant le bool, tu va donc chercher une variable et non une fonction :

Code : Tout sélectionner

Script Info{
// pour chaque face un bool juste signifiant collage possible ou non
	public bool gauche;
	public bool droite;
	public bool haut;
	public bool bas;
	public bool avant;
	public bool arriere;
}
ensuite :

Code : Tout sélectionner

if (cubeA.GetComponent<info>().gauche && cubeB.GetComponent<info>().droite) { Attache (A,B); }

______________________________________________________________
\_______________________ Impossible is nothing _______________________/

Avatar de l’utilisateur
Liven
Messages : 268
Inscription : 30 Nov 2017 01:48

Re: [DB-AL] Stoker/Récupérer des données dans des cubes

Message par Liven » 03 Déc 2018 09:26

Une autre solution (inspiré d'une animation sur un tweet trop vieux pour le retrouver) pourrait être de mettre un collider sur chaque face qui peut être collée (ça peut se faire par code si t'as vraiment beaucoup de cubes) et de passer ces collider en trigger.

Du coup tu n'aurais plus à te prendre la tête car si deux trigger se rencontrent, forcément les faces sur lesquelles ils sont peuvent se coller.

Reste juste à déterminer lequel coller auquel (au gros quel est celui que tu as "en main") et à désactiver la détection de collision entre ces trigger et les cubes eux mêmes (puisque l'on veut juste que les triggers se détectent entre eux) pour ça il suffit que les cubes et les triggers ne soient pas sur le même layer et bien remplir la matrix de physics.

Après la seule limite à ce système peuvent être les performances, ça dépend de la plateforme que tu vise (mobile?) et pour ça il n'y a pas de secret, il faut tester rapidement en poussant le nombre de cube au maxi de ce que tu auras besoin (et au besoin faire une petite recherche sur l'opti de la physics)

djulio74
Messages : 682
Inscription : 19 Déc 2009 22:55

Re: [DB-AL] Stoker/Récupérer des données dans des cubes

Message par djulio74 » 03 Déc 2018 09:49

Pas mal aussi ta méthode Liven, mais comme tu dis a tester direct avec un grand nombre de cube. s'il a un espace de travail de 100x100x100 cube ça peut vite de venir gourmand non? ( aucune idée de l'impacte du nombre de trigger sur les perf).
Faudrait aussi tester la différence de perf entre ces (eventuellement tres) nombreux collider en continue et l’accès à des components sur certains cube épisodiquement.

______________________________________________________________
\_______________________ Impossible is nothing _______________________/

Avatar de l’utilisateur
Yugo
Messages : 24
Inscription : 12 Nov 2018 15:22

Re: [DB-AL] Stoker/Récupérer des données dans des cubes

Message par Yugo » 03 Déc 2018 10:19

Merci pour vos réponses.

Pour le script attaché, l'idée me plait mais comme je le disais plus haut, chaque cubes aux propriétés différentes ne peuvent pas avoir le même script "info" puisque celui-ci est différent. il faudrait plusieurs scripts (info1 info2 info3....) pour chaque combinaison. Et dans le script principal, je ne vois pas comment je pourrais deviner si je doit appeler info1 ou info2...

Pour les colliders sur chaque face, c'est pas top non plus car mes cubes ont déjà un collider pour la détection au rayCast. si je le retire pour mettre un nouveau juste sur 1 ou 2 faces, je vais avoir des problèmes de détection. En plus j'ai fais un système de détection de la face touchée grâce à la normal du collider (hit.normal). Mais c'est une solution qui peut marcher.

J'avais penser aussi faire un Tag pour chaque combinaison possible mais ça devient trop complexe pour la simple détection. Il aurait fallu que unity propose des Tag multiple pour le même objet.

Je trouve ça dingue que ce soit si difficile de faire ce que je demande. La POO devrait faciliter la communication entre objet et pourtant j'ai l'impression de butter a chaque fois que je veux récupérer des infos.
Il n'est pas possible de créer son propre component ?
Ou créer un component Texte dans lequel je stock/recup ces infos?

Avatar de l’utilisateur
Sebela
Messages : 141
Inscription : 25 Juin 2014 21:39

Re: [DB-AL] Stoker/Récupérer des données dans des cubes

Message par Sebela » 03 Déc 2018 11:14

il faudrait plusieurs scripts (info1 info2 info3....) pour chaque combinaison
Non justement, tu n'as pas besoin de plusieurs scripts. Comme suggéré au-dessus, tu peux faire intervenir des variables qui permettront de différencier tes cubes.
Ce que je te conseille plutôt que de créer plein de booléens, utilise un enum :

Code : Tout sélectionner

public enum stickyFace{
	Gauche,
	Droite,
	Haut,
	Bas
}
[SerializedField]
private stickyFace _stick;
Tu ajoutes un accesseur pour qu'il puisse être lu par les autres cubes
Ensuite tu créées des prefabs en renseignant la valeur du _stick (haut, bas, gauche, droite)

tu peux gérer les cas avec des méthodes :

Code : Tout sélectionner

private void OnTriggerEnter(Collider other){

	if (other.gameObject.tag == "cube"){
		if (_sticky == stickyFace.Haut && other.gameObject.GetComponent<Collage>().Sticky == stickyFace.Bas){
			Collage();
		}
	}
	etc....
}
(Pas testé le code, à adapter à ton besoin ;) )

djulio74
Messages : 682
Inscription : 19 Déc 2009 22:55

Re: [DB-AL] Stoker/Récupérer des données dans des cubes

Message par djulio74 » 03 Déc 2018 11:19

Je ne pense pas que tua ai bien saisie la fonctionnalité des variables.
Comme je te l'ai presenté dans mon exemple , en déclarant 6 variable de type bool ( une pour chaque face), et en ajoutant ce même et unique script à tout tes cube, chacun peut avoir des valeurs différentes pour chaque variable.
Ce n'est pas parce que plusieurs gameObject ont le même script que toute les variable a l'interieur de celui ci sont identique pour chacun des gameObject.

______________________________________________________________
\_______________________ Impossible is nothing _______________________/

Avatar de l’utilisateur
Yugo
Messages : 24
Inscription : 12 Nov 2018 15:22

Re: [DB-AL] Stoker/Récupérer des données dans des cubes

Message par Yugo » 03 Déc 2018 13:02

J'ai compris enfin !
Je pensais que mon script "info" ne pouvait pas avoir des variables bool gauche haut bas... avec des valeurs différentes pour chaque objet qui contient ce script.
En effet, en déclarant mes bool public je peut simplement cocher les faces pouvant ce coller, puis en faire des prefabs.
Je ne connaissait pas [SerializedField] encore mais je vais me renseigner.
Quand aux Enum, ça à l'air mieux mais je ne les ai jamais utilisé...je vais tester aussi
Merci pour ton aide précieuse.

djulio74
Messages : 682
Inscription : 19 Déc 2009 22:55

Re: [DB-AL] Stoker/Récupérer des données dans des cubes

Message par djulio74 » 03 Déc 2018 13:10

les [SerializedField] dans ton cas ne te servirons pas, ils sont surtout là pour permettre l’accès dans l'inspector à des variable privé. hors ici tu as besoin de variable public, vu qu'il va falloir que tu accède à ces variable depuis un autre script.

______________________________________________________________
\_______________________ Impossible is nothing _______________________/

Avatar de l’utilisateur
Yugo
Messages : 24
Inscription : 12 Nov 2018 15:22

Re: [DB-AL] Stoker/Récupérer des données dans des cubes

Message par Yugo » 03 Déc 2018 15:31

Ca y est! ça marche!
Encore merci
:super:

Répondre

Revenir vers « Scripting »