Page 1 sur 1

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

Publié : 08 Fév 2019 17:46
par WilfreGD
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!

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

Publié : 08 Fév 2019 18:36
par Max
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.

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

Publié : 08 Fév 2019 19:15
par WilfreGD
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".

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

Publié : 08 Fév 2019 19:49
par Max
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.
.