[Résolu] [MY-AL] Récupérer les dimensions d'un objet hors 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
Autodidactelife
Messages : 47
Inscription : 21 Fév 2018 23:04
Localisation : France

[Résolu] [MY-AL] Récupérer les dimensions d'un objet hors Unity

Message par Autodidactelife » 15 Jan 2019 13:58

Bonjour à tous !

J'ai pas pu faire mieux niveau titre désolé !

En faite voilà, j'ai créer un serveur totalement en C# sans Unity et en parallèle j'ai le client sous Unity.
Mon serveur récupère les maps pour les envoyer au client sous forme de tableau du genre:

ID,position_x,positon_y,position_z,rotation_x,rotation_y,rotation_z,scale_x,scale_y,scale_z

Maintenant, hors Unity en sachant grâce à l'ID je sais quel type d'objet c'est (exemple un cube), comment savoir la taille exacte de l'objet?

Par exemple j'ai un cube, je crois bien que le cube fait 1x1x1 donc si il est en 0;0;0 il ira de 0 à 1 dans les x, dans les y et dans les z.

Je fais manuellement les maps publique pour qu'elles soient généré, mais les joueurs pourrons placé des objets dans une map qui leurs est dédié (chaque joueur à sa map). Et le but sera de pouvoir éventuellement repéré les noclip et autres triches du genre.

Donc un calcul qui de façon dynamique pourrait m'amené aux résultats de l'objet. Et si possible, quelque chose qui marche aussi avec des GameObject custom pas uniquement le carré, cylindre, plane etc :nono:

Si vous avez une idée je prend ! Sinon j'ai une idée pour faire autrement (c'est à dire que tout les objets plaçable par les joueurs ne sont pas modifiable en taille ni rien et sont pré calculer niveau taille, juste le positionnement sur la map, ainsi que pour les maps publique je peux via Unity une fois la map créer manuellement sortir en plus des positions,scale,rotation les positions exacte, mais c'est pas le mieux que je veux faire :triste1:)
Dernière édition par Autodidactelife le 17 Jan 2019 19:10, édité 1 fois.

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

Re: [MY-AL] Récupérer les dimensions d'un objet hors Unity

Message par Sebela » 16 Jan 2019 16:32

Salut autodidactelife,

Pas sûr de comprendre ta question... tu veux communiquer la taille exacte de ton gameobject depuis unity vers ton serveur ? Ou l'inverse ? :0
Si tu veux récupérer la taille exacte d'un gameobject qui possède un renderer, tu peux utiliser renderer.bounds.size pour récupérer la taille selon l'axe x, y et z.
Si tu dois envoyer tes données à unity, tu peux utiliser des fichiers json que tu pourras ensuite parser dans ton application.
Redis-moi si je n'ai pas bien compris ta question ^^'

Autodidactelife
Messages : 47
Inscription : 21 Fév 2018 23:04
Localisation : France

Re: [MY-AL] Récupérer les dimensions d'un objet hors Unity

Message par Autodidactelife » 16 Jan 2019 21:53

Salut Sebela !

Alors c'était un poils plus complexe. Mais comme j'ai dis je pense utilisé ta méthode, prendre d'avance les tailles des objets et me démerdé :-/

(Je n'avais pas encore réfléchis exactement où prendre la taille je te remercie donc au passage pour la précision ^^)

Mon serveur n'étant pas sur Unity et ne pouvant pas faire confiance aux clients je voulais avoir les tailles sur le serveur directement.

Je vais essayer d'expliquer plus le serveur:

J'ai donc un serveur en C# hors Unity
Un client en C# sur Unity

Le serveur n'a aucune "visuel" de ce qui ce passe et donc ne peut savoir si un joueur est en collision avec un objet et j'aimerais donc qu'il puisse "voir" pour évité les tricheries style noclip.

Sur ma base de donnée je possède les salles:

Image

Ici on peut voir que j'ai des objets ID 0 (qui sont des planes) par exemple le premier place de la salle "lobby" est en position 0,0,0 de rotation 0,0,0 et de scale 1,1,1

Le soucis c'est que je n'ai pas exactement les positions exacte et je voulais savoir si par exemple le serveur pouvait savoir qu'un plane c'est X,X,X en taille de base à partir du scale, de sa rotation et de sa position pourrait-il pas trouver la taille de l'objet exacte ?

En faite je pense que ma méthode de génération des maps est déjà pas super.

Le serveur récupère la Map sur la base de donnée, la split ("|" et ",") puis l'envoie au client qui lui va instantié les objets dans un tableau de GameObject.


Je pense que je vais aller récupérer manuellement les tailles et je m'en sors pas avec le scale les joueurs auront quelques possibilité en moins tant pis :X


Edit: J'ai oublier que j'ai en direct les positions X/Y/Z des joueurs, qui sont échanger avec le serveur renvoyer aux les autres joueurs connecté étant sur la même room.

C'est à ce moment que la collision doit être vérifier. Chaque changement de position à droit à son petit envoie (avec une attente de je sais plus entre 300ms et 1000ms) pour évité le spam et ça ne créer aucun lag visuel.

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

Re: [MY-AL] Récupérer les dimensions d'un objet hors Unity

Message par Sebela » 17 Jan 2019 10:59

Hello !

Ok donc tu désires faire un check de collision depuis le serveur sans l'aide d'unity pour éviter la triche. Dans ce cas il va te falloir faire du calcul de collision à la main, et donc un peu de maths :)

=> Pour les tailles, la combinatoire position/rotation/scale peut marcher mais uniquement si tu as au départ des modèles 3D de même taille. Garde bien ça en tête.
Ensuite pour les calculs de collision, c'est assez simple à calculer si tu travailles avec des formes simples (cubes, spheres), mais ça peut être plus complexe avec des mesh non-convexes par exemple.
Il existe un très bon cours sur openclassrooms qui traite de la théorie des collisions :
Formes simples
Formes complexes

Bon courage :)

Autodidactelife
Messages : 47
Inscription : 21 Fév 2018 23:04
Localisation : France

Re: [MY-AL] Récupérer les dimensions d'un objet hors Unity

Message par Autodidactelife » 17 Jan 2019 19:00

Sebela a écrit :
17 Jan 2019 10:59
Hello !

Ok donc tu désires faire un check de collision depuis le serveur sans l'aide d'unity pour éviter la triche. Dans ce cas il va te falloir faire du calcul de collision à la main, et donc un peu de maths :)

=> Pour les tailles, la combinatoire position/rotation/scale peut marcher mais uniquement si tu as au départ des modèles 3D de même taille. Garde bien ça en tête.
Ensuite pour les calculs de collision, c'est assez simple à calculer si tu travailles avec des formes simples (cubes, spheres), mais ça peut être plus complexe avec des mesh non-convexes par exemple.
Il existe un très bon cours sur openclassrooms qui traite de la théorie des collisions :
Formes simples
Formes complexes

Bon courage :)
Exactement ça ! ;-)

Même si mon jeu ne fonctionne pas du tout avec un système de cubes mon objet de départ aura une collision cube pour que sa collision soit de taille précise tel que l'objet fait 1 x 1 ou encore 1 x 2 etc ...

Donc en soit oui je fonctionne sur ce modèle, donc pas de mesh non convexes ;)

Merci à toi je vais me servir de ça c'est exactement ce que je chercher, je vais utilisé plusieurs mesh pré défini, si j'ai toutes leurs tailles de base avec les calculs je peux facilement retrouver les positions exacte.

Je vais me lancer sur ça ! Traverser les décors était le dernier truc que j'avais du mal à faire. Je pense que le plus difficile serait tout ce qui touche aux escaliers, mais je pense qu'avec des calculs spécifique juste pour eux c'est faisable aussi :)

Autodidactelife
Messages : 47
Inscription : 21 Fév 2018 23:04
Localisation : France

Re: [Résolu] [MY-AL] Récupérer les dimensions d'un objet hors Unity

Message par Autodidactelife » 18 Jan 2019 14:20

PAVÉ CÉSAR !

Finalement je n'ai pas utilisé la méthode AABB car en 3D je ne trouves pas ça du tout optimisé et demande bien trop de calculs.

Exemple: J'ai un plane, celui-ci fait de base 10 X, 0 Y, 10 Z, je lui fait une rotation de 90 en X.
La taille de mon plane n'a pas changer en revanche si il était à la position 0,0,0 il ne fait plus de -10,0,-10 à 10,0,10 mais de 10,10,0 à -10,-10,0. (Rotation sur X = inversion des Y et Z).

Cependant, si mon joueur ce trouve en 7,0,7 je ne pourrais pas savoir qu'il ce trouve sur mon plane qui lui est en 0,0,0 je rappel à moins de vérifier chacun des objets et de leurs positions en rapport à leurs tailles de base, leurs scale et leurs rotations. Ceci fait beaucoup beaucoup de calculs. Une vérification maximum de 100 positions rien que pour 1 plane, si j'ai 50 objets d'un total de 500 000 positions je dois maximum vérifier 500 000 positions, bien que ce soit fait en quelques secondes par l'ordinateur si j'ai 1000 joueurs faisant un déplacement chacun et bien ... On fait 500 000 000 calculs.

Ce qui fait beaucoup (oui je vois grand alors que c'est même pas sûr qu'un jour le projet sort :mdr1:)

J'ai donc réfléchis et je me suis dis on va faire les calcul à l'avance ... J'ai même une idée pour les maisons des joueurs qui pourront y placer des objets !

Donc je vais créer une fonction qui va récupéré toutes les positions précise des objets. Donc pour mon plane il récupérera 100 positions et rentrera dans la base de donnée donc par exemple il rentrera: |-10,-10,0|-10,-9,0|...|9,10,0|10,10,0|

Je ne suis pas très copain avec le JSON j'admet. Ceci sera charger au lancement du serveur.

Les | avant et après servent de précision, car plus besoin de split, simplement un indexOf afin de vérifier si la position actuel du joueur est présente afin de ne pas avoir un faux positif si par exemple je suis en 0,0,7 et que ma base de donnée dit qu'il y à un objet en 0,0,70, ce qui n'est pas du tout les mêmes positions mais sonnera valide si je fais un indexOf de 0,0,7. (Et qui ne le sera pas si cherche |0,0,7| ).

Ensuite pour les salles customisé par les joueurs, déjà ils ne pourront les customisés à condition qu'il n'y à aucun joueur à l'intérieur à part eux même.

Lors du placement des objets le serveur aura dans la base de donnée sous le nom du joueur les positions des objets placé et customisé qui eux seront calculer d'avance, si j'y met une table je sais d'avance qu'elle fera 2 de haut, 2 de large et 3 de longueur. Petit calcul si rotation mais une fois l'objet placé et validé il l'envoie obligatoirement au serveur qui là va récupérer au passage la position faire le calcul de lui même par rapport à l'ID de l'objet (donc ici une table de 2x2x3) et va l'ajouté dans une base de donnée du joueur spécialement fait pour sa maison.

Ceci permettra que dès qu'un joueur entre dans une pièce d'un joueur si il y à des objets customisé posé alors côté serveur la liste sera charger jusqu'à qu'il entre dans une autre pièce. Ceci permettra un seul chargement unique par salles et un simple indexOf pour voir si l'objet est à tel position.

Plus chiant à faire mais niveau serveur ce sera surement moins gourmand.

Après je sais pas ... Requête MySql ou Calcul de chaque positions d'objets ? :X
Sachant que la salle de base tout ce qui n'est pas modifiable sera pré charger au lancement du serveur (même pour les salles des joueurs).

Je vais me lancer sur ça on verra ce que ça donne. J'essaye d'optimisé un maximum comme par exemple la rotation ou la position des joueurs ne sont pas envoyer si ils sont identiques au précédent ou qui nécessite pas un refresh (comme une rotation de 0,002 :taistoi: )

Voilà voilà ! En tout cas je te remercie pour le AABB c'est vrais que je connaissais mais pas sous ce nom la, honte à moi :X

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

Re: [Résolu] [MY-AL] Récupérer les dimensions d'un objet hors Unity

Message par Sebela » 18 Jan 2019 17:05

Tant mieux si ce que je t'ai envoyé a pu t'être en partie utile :)
Une vérification maximum de 100 positions rien que pour 1 plane, si j'ai 50 objets d'un total de 500 000 positions je dois maximum vérifier 500 000 positions, bien que ce soit fait en quelques secondes par l'ordinateur si j'ai 1000 joueurs faisant un déplacement chacun et bien ... On fait 500 000 000 calculs.
Effectivement ça fait beaucoup de calculs ;-) Ce qui est je crois un problème récurrent quand on se lance dans le multiplayer. Et là l'optimisation du nombre de calculs prend tout son sens !
Je vais me lancer sur ça on verra ce que ça donne. J'essaye d'optimisé un maximum comme par exemple la rotation ou la position des joueurs ne sont pas envoyer si ils sont identiques au précédent ou qui nécessite pas un refresh (comme une rotation de 0,002 :taistoi: )
Oui, je pense en effet que les clients devront avoir une sorte de threshold qui indiquera à quel moment envoyer les données au serveur pour pas saturer la ligne ^^
Bon courage !

Répondre

Revenir vers « (C#) CSharp »