Pour autant que je sache, aller plus loin que 1 million d'unités d'origine mondiale dans Unity n'est guère possible en raison de problèmes de précision en virgule flottante.
Pour créer un monde de plus d'un million d'unités dans un rayon, il faudrait soit utiliser des double
variables pour les coordonnées, soit utiliser une technique de division spatiale pour diviser une scène massive en morceaux hiérarchiques, le plus petit d'entre eux étant d'environ 10 000 unités, c'est-à-dire que chaque position de l'espace mondial serait exprimée par la hiérarchie des morceaux, l'objet est float
dedans et un tas de variables représentant sa position locale (et éventuellement la rotation et la mise à l'échelle) à l'intérieur du dernier morceau.
Quoi qu'il en soit, cela nécessiterait la mise en œuvre d'un tout nouveau système de coordonnées, donc j'aimerais savoir si cela est possible dans Unity, et si oui, comment puis-je le faire fonctionner avec les systèmes Unity existants comme la physique, etc.
PS Je ne peux pas simplement déplacer le monde vers son origine pendant que le joueur bouge car je veux que les choses se passent simultanément autour de la planète.
Merci!
la source
C'est une question qui revient fréquemment. Je prendrai la liberté de vous transmettre une autre réponse assez détaillée que j'ai déjà donnée au même problème, au lieu de simplement la répéter ici: Un système de coordonnées personnalisé est-il possible dans Unity
À partir de là, ce que je suggérerais le plus, c'est que vous lisiez cet article étonnant sur: http://citeseerx.ist.psu.edu/viewdoc/download?doi=10.1.1.471.7201&rep=rep1&type=pdf . Il compare certaines des façons de résoudre le problème que vous décrivez (y compris les coordonnées locales, comme décrit par Arcane Engineer dans sa réponse) et donne des détails sur la célèbre solution d'origine flottante de nos jours. C'est, en fait, ce que j'irais dans la plupart des cas (en fait, c'est ce que j'utilise dans mon application).
Bien sûr, vous avez mentionné que la solution d'origine flottante ne répond pas à vos besoins. Mais cela peut ne pas être le cas même si vous voulez que les choses continuent de se produire dans des régions très éloignées du monde. Vous pouvez avoir à peu près n'importe quelle IA se produisant où vous le souhaitez - vous ne devriez pas faire de vérifications de collision ou de positionnement précis trop loin du joueur (c'est-à-dire au-delà du seuil d'imprécision du flotteur). Mais de toute façon, franchement, dans les applications réelles, vous ne pourriez probablement jamais avoir autant de collisions et de positionnement dans un jeu en raison des limitations de traitement. Et encore, il pourrait y avoir des solutions à cette limitation que vous voyez sur la solution d'origine flottante, selon les caractéristiques de votre jeu. Encore une fois, je vous suggère de ne pas jeter cette solution avant une lecture plus approfondie à ce sujet.
Pourtant, si vous décidez d'essayer des systèmes de coordonnées locaux (ce qui peut devenir une solution assez complexe selon où vous allez avec), alors le deuxième élément de ma réponse liée est pour vous. L'élément le plus important est le document écrit par le gars qui a mis en œuvre cette solution pour la première fois dans le jeu pionnier Dungeon Siege: http://scottbilas.com/files/2003/gdc_san_jose/continuous_world_paper.pdf
Il y a aussi une vidéo d'il y a quelques années, où des gens de Unity commentent cette solution et expliquent même une implémentation moderne du concept dans Unity:
https://www.youtube.com/watch?v=VKWvAuTGVrQ
J'espère que cela aide.
la source
Je ne sais pas si vous avez déjà opté pour une solution, mais je voudrais mentionner deux autres ressources qui pourraient être utiles à vous et à d'autres lecteurs à l'avenir.
Cette récente conférence CppCon: "Demystifying Floating Point" , qui est très pertinente quel que soit le langage de programmation. Un point très intéressant présenté à propos de la précision est que le point idéal de la précision du flotteur se situe entre [-1, + 1]. Les flotteurs normalisés sont donc la meilleure façon de procéder si vous pouvez les utiliser.
Un autre endroit dans lequel vous voudrez peut-être chercher des idées est le jeu classique Dungeon Siege . Le jeu a utilisé un système mondial continu basé sur un nœud / tuile et chaque position était relative au nœud actuel. Il y a une description très détaillée du système utilisé par le jeu dans ce livre blanc . J'ai également écrit quelques paragraphes à ce sujet dans mon blog . Cette configuration était nouvelle à l'époque, mais elle n'est probablement pas aussi utile aujourd'hui, le document lié ci-dessus mentionne quelques-uns des problèmes rencontrés. Néanmoins, il est intéressant d'un point de vue historique et pourrait encore vous servir de source d'idées et d'inspiration.
la source