Je suis légèrement en désaccord avec la réponse de Philipp ; ou du moins avec la façon dont il l'a présenté. Cela donne l'impression que déplacer le monde autour du joueur pourrait être une meilleure idée; quand c'est exactement le contraire. Alors voici ma propre réponse ...
Les deux options peuvent fonctionner, mais c’est généralement une mauvaise idée d’inverser la physique en déplaçant le monde autour du joueur plutôt que le monde entier.
Perte de performance / gaspillage:
Le monde aura généralement beaucoup d'objets; beaucoup sinon la plupart, statique ou en sommeil. Le joueur aura un ou relativement peu d'objets. Déplacer le monde entier autour du lecteur signifie déplacer tout ce qui se trouve dans la scène sauf le joueur. Objets statiques, objets dynamiques en sommeil, objets dynamiques actifs, sources de lumière, sources de son, etc. tous doivent être déplacés.
C'est (évidemment) considérablement plus coûteux que de ne déplacer que ce qui bouge réellement (le joueur et peut-être un peu plus de choses).
Maintenabilité et extensibilité:
En déplaçant le monde autour du joueur, le monde (et tout ce qu'il contient) devient le point où les choses se passent le plus activement. Tout bogue ou changement dans le système signifie que, potentiellement, tout change. Ce n'est pas une bonne façon de faire les choses. vous voulez que les bogues / modifications soient aussi isolés que possible, afin que vous n'ayez pas de comportement inattendu dans un endroit où vous n'avez pas apporté de modifications.
Il y a aussi beaucoup d'autres problèmes avec cette approche. Par exemple, il rompt de nombreuses hypothèses sur la manière dont les choses sont censées fonctionner dans le moteur. Vous ne pouvez pas utiliser dynamique RigidBody
pour autre chose que le lecteur, par exemple; sous forme d'objet avec une RigidBody
cinématique non attachée se comportera de manière inattendue lors du réglage de la position / rotation / échelle (comme vous le feriez pour chaque image, pour chaque objet de la scène, à l'exception du lecteur)
Donc, la réponse est de ne déplacer que le joueur!
Eh bien ... oui et non . Comme mentionné dans la réponse de Philipp, dans un type de jeu à coureurs infinis (ou tout jeu comportant une grande zone explorable sans soudure), aller trop loin de l'origine introduirait à terme des FPPE ( erreurs de précision en virgule flottante) remarquables , et même plus tard, éventuellement, Débordez le type numérique, soit en provoquant le plantage de votre jeu, soit, en gros, faites en sorte que la fumée du jeu disparaisse ... Sur des stéroïdes! 😵 (car à ce stade, les FPPE rendraient le jeu déjà sur du crack "normal")
La solution actuelle :
Ne faites ni l'un ni l'autre et faites les deux! Vous devriez garder le monde statique et déplacer le joueur autour de lui. Mais « re-root » à la fois , le joueur et le monde, lorsque le joueur commence à devenir trop loin de la racine (position [0, 0, 0]
) de la scène.
Si vous conservez la position relative des éléments (lecteur par rapport au monde qui l'entoure) et effectuez ce processus en une seule mise à jour du cadre, le lecteur (réel) ne le remarquera même pas!
Pour ce faire, vous avez deux options principales:
- Déplacez le lecteur à la racine de la scène et déplacez le morceau de monde vers sa nouvelle position par rapport au joueur.
- Pensez au monde comme une grille. déplacez la partie de la grille où se trouve le joueur vers la racine et déplacez le joueur à sa nouvelle position par rapport à cette partie de la grille.
Voici un exemple de ce processus en action
Mais jusqu'où c'est trop loin?
Si vous regardez le code source de Unity, ils utilisent 1e-5
( 0.00001
) comme base pour considérer deux valeurs à virgule flottante "égales", à l'intérieur de Vector2
et Vector3
(les types de données responsables des positions des objets, des rotations et des échelles [euler-]). Étant donné que la perte de précision en virgule flottante se produit dans les deux sens loin de zéro, il est prudent de supposer que tout élément situé sous 1e+5
( 100000
) unités éloignées de la racine / origine de la scène peut être utilisé en toute sécurité.
Mais! Puisque...
- Il est plus approprié de créer un système pour gérer automatiquement ces processus de ré-enracinement.
- Quel que soit votre jeu, il n'est pas nécessaire qu'une "section" contiguë du monde soit large de 100 000 unités (mètres [?]).
... alors c'est probablement une bonne idée de réintroduire les racines beaucoup plus tôt / plus souvent que la marque des 100 000 unités. L'exemple de vidéo que j'ai fourni semble le faire toutes les 1000 unités environ, par exemple.