[CF-AL] Outil terrain in-game et OOB
Publié : 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.
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)
Je récupère la position exacte X et Y dans les données terrain en prenant compte de la résolution
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.
Après ça, rien de bien problématique, calcule les modifications dans un cercle et les ajoute au nouveau tableau
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 :
Merci pour votre aide!
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.
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)
Code : Tout sélectionner
int terrainPosX = (int)((position.x / terrain.terrainData.size.x) * resolutionX);
int terrainPosY = (int)((position.z / terrain.terrainData.size.z) * resolutionY);
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];
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];
}
}
Je n'ai trouvé aucun sujet qui donnait une solution a l'erreur.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)
Merci pour votre aide!