[CF-AL] Outil terrain in-game et OOB

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
Avatar de l’utilisateur
WilfreGD
Messages : 10
Inscription : 15 Jan 2019 17:13

[CF-AL] Outil terrain in-game et OOB

Message par WilfreGD » 08 Fév 2019 17:46

Bonjour,
Récemment j'ai commencé le développement d'un outil terrain intégré au jeu avec un Projecteur pour afficher la taille du pinceau. Mais j'ai une erreur qui est introuvable sur les forums Unity ou sans réponse.

Image

Pour expliquer la situation :
Lorsque le terrain doit être modifié (Avec une certaine taille "diamètre" et une certaine force, le tout a la position donnée du raycast)

Code : Tout sélectionner

 void ModifyTerrain(Vector3 position, float force, int diamètre)
 
Je récupère la position exacte X et Y dans les données terrain en prenant compte de la résolution

Code : Tout sélectionner

 int terrainPosX = (int)((position.x / terrain.terrainData.size.x) * resolutionX);
 int terrainPosY = (int)((position.z / terrain.terrainData.size.z) * resolutionY);
 
Puis le problème arrive avec ce que j'effectue ensuite :
Je stocke les changements du terrain dans un nouveau tableau qui prend la taille X et Y du diamètre demandé. Cela permet de donner au terrain uniquement les changements sans avoir a mettre a jour le terrain entier a chaque fois.

Code : Tout sélectionner

float[,] heightChange = new float[diamètre, diamètre];
Après ça, rien de bien problématique, calcule les modifications dans un cercle et les ajoute au nouveau tableau

Code : Tout sélectionner

for (int x = 0; x < diamètre; x++)
            for (int y = 0; y < diamètre; y++)
            {
                int x2 = x - radius;
                int y2 = y - radius;

                if (terrainPosY + y2 < 0 || terrainPosY + y2 >= resolutionY ||
                    terrainPosX + x2 < 0 || terrainPosX + x2 >= resolutionX)
                    continue;

                float distanceSquared = Mathf.Sqrt((x2 * x2) + (y2 * y2));

                if (distanceSquared > radius)
                {
                    heightChange[y, x] = heights[terrainPosY + y2, terrainPosX + x2];
                }
                else
                {
                    heightChange[y, x] = heights[terrainPosY + y2, terrainPosX + x2] + (force - (force * (distanceSquared / radius)));
                    heights[terrainPosY + y2, terrainPosX + x2] = heightChange[y, x];
                }
            }
Pour finir, je donne les nouvelles valeurs au terrain à la position du changement. Mais si le diamètre sort du terrain, j'ai ce message :
ArgumentException: X or Y base out of bounds. Setting up to 289x28 while map size is 513x513
UnityEngine.TerrainData.SetHeights (Int32 xBase, Int32 yBase, System.Single[,] heights)
Je n'ai trouvé aucun sujet qui donnait une solution a l'erreur.
Merci pour votre aide!

Avatar de l’utilisateur
Max
Messages : 8763
Inscription : 30 Juil 2011 13:57
Contact :

Re: [CF-AL] Outil terrain in-game et OOB

Message par Max » 08 Fév 2019 18:36

Bonjour,

C'est vrai que ton message d'erreur est quelque peu déconcertant.
En général, on l'a plutôt avec un truc du genre Setting up to 520x528 while map size is 513x513....
Maintenant, cela aiderais éventuellement d'avoir ton code complet, avec le SetHeights. Dans ces cas spécifiques, la meilleurs solution pour aider est déjà d'arriver à reproduire le soucis.
Image
Pas d'aide par MP, le forum est là pour ça.
En cas de doute sur les bonnes pratiques à adopter sur le forum, consulter la Charte et sa FAQ

Avatar de l’utilisateur
WilfreGD
Messages : 10
Inscription : 15 Jan 2019 17:13

Re: [CF-AL] Outil terrain in-game et OOB

Message par WilfreGD » 08 Fév 2019 19:15

Le projet est trouvable ici avec les scripts et un build :
https://drive.google.com/open?id=199QBw ... MffR4OfkPC

L'erreur apparaît uniquement quand le cercle, le projecteur, est en dehors du terrain et peu importe le côté. Mais effectivement, je suis assez perdu en voyant "Setting up to 50x20 while map size is 513x513".

Avatar de l’utilisateur
Max
Messages : 8763
Inscription : 30 Juil 2011 13:57
Contact :

Re: [CF-AL] Outil terrain in-game et OOB

Message par Max » 08 Fév 2019 19:49

Re,

Bon je viens de tester, et le soucis est qu’effectivement lorsque le cercle sort un peu des limites, ben tu as ton SetHeights avec des coordonnées négatives ( soit (terrainPosX - radius) ou (terrainPosY - radius), voir les deux).
Donc normal que ça coince. J'ai pas l’impression que cela soit gérer dans ton code.

Bon après là j’admets que je ne m'explique pas le message d'erreur qui affiche des valeurs de bornes qui ne correspondent pas à l'erreur.
.
Image
Pas d'aide par MP, le forum est là pour ça.
En cas de doute sur les bonnes pratiques à adopter sur le forum, consulter la Charte et sa FAQ

Répondre

Revenir vers « (C#) CSharp »