Pourquoi Unity en mode 2D utilise-t-il la mise à l'échelle et la taille othographique par défaut comme il le fait?

8

J'ai déjà utilisé SFML, XNA, Monogame, etc. pour créer des jeux 2D, où si j'affiche un sprite de 100 pixels à l'écran, il prendra 100 pixels . Si j'utilise des tuiles 128px pour créer un arrière-plan, la première tuile sera à (0, 0) tandis que la seconde sera à (128, 0).

L'unité, d'autre part, a son propre système d'unités impaires, en mettant à l'échelle toutes les transformations, pixel en unités, taille othographique, etc., etc. Ma question est donc double, à savoir:

  1. Pourquoi Unity a ce système par défaut pour 2D? Est-ce pour le développement mobile? Y a-t-il un gros avantage que je ne vois pas?
  2. Comment puis-je configurer mon environnement, de sorte que si j'ai un sprite 128x128 dans Photoshop, il s'affiche comme un sprite 128x128 dans Unity lorsque je lance mon jeu?

Notez que je cible exclusivement les ordinateurs de bureau.

Néophyte
la source
1
La raison pour laquelle cela se produit est que Unity était un moteur 3D qui a récemment eu des graphiques 2D greffés.
jhocking
Les fonctions GUI et le composant GUITexture d'Unity vous permettent de dessiner directement des textures à l'écran à leur taille native. docs.unity3d.com/Documentation/ScriptReference/GUI.html docs.unity3d.com/Documentation/Components/class-GuiTexture.html Si vous avez besoin de plus de flexibilité, votre meilleur pari est de définir une échelle cohérente - comme 1U = 128px - et appliquez-le uniformément à tous vos quads / sprites / caméras.
DMGregory
J'éviterais la classe GUI d'Unity; parce que l'interface graphique en mode immédiat dans Unity est assez inefficace, ils construisent un nouveau système GUI (sur le point de le publier en fait, dans la version 4.6).
jhocking

Réponses:

4

La gestion des coordonnées 2D et de la mise à l'échelle dans Unity est assez simple, mais pas évidente et, comme vous l'avez remarqué, elle ne ressemble pas au fonctionnement des autres outils de développement. La raison pour laquelle cela se produit est que Unity était un moteur 3D avec récemment greffé des graphiques 2D.

En particulier, 1 unité dans Unity n'est pas nécessairement 1 pixel dans l'image. Lorsque vous importez des images en tant que sprites 2D, il existe en fait un paramètre Pixels en unités qui pourrait être défini sur 1: 1, mais je recommande de le laisser sur la valeur par défaut 100: 1 pour quelques raisons (le moteur physique ne fonctionne pas correctement à 1: 1, et la valeur par défaut est meilleure pour la compatibilité avec le code des autres).

Ce paramètre de mise à l'échelle signifie que toutes les positions sont divisées par 100. C'est assez facile tant que vous vous souvenez toujours de la mise à l'échelle; lorsque vous souhaitez déplacer un sprite de 256 pixels (par exemple), vous le déplacez 2,56 Vous pouvez également écrire une fonction utilitaire pour arrondir les nombres à 2 décimales / le pixel le plus proche: Mathf.Round (float * 100) / 100f


Quant à la mise en place d'une caméra parfaite au pixel près, définissez-la d'abord comme une caméra orthographique. Lorsque vous sélectionnez la caméra, dans ses paramètres se trouve une liste déroulante pour la projection en perspective ou orthographique; la perspective signifie que les choses auront l'air en 3D, tandis que l'orthographe affiche la scène à plat. Sous cette liste déroulante se trouve Taille; réglez la taille orthographique de la caméra sur la moitié des dimensions en pixels de l'écran souhaité.

Par exemple, supposons que vous vouliez un écran 1024x768 au pixel près. Eh bien, cela signifie que la hauteur de la caméra devrait être de 384 pixels. Divisez cela par 100 (en raison de l'échelle des pixels en unités) et vous obtenez 3,84 pour la taille de la caméra. Encore une fois, ce calcul est simplement SCREEN_SIZE / 2 / 100f


(J'attendais de voir quelles autres réponses arriveraient en premier, mais cela fait quelques jours. Je fais de la 2D dans Unity depuis un certain temps en utilisant 2D Toolkit , mais je suis relativement nouveau dans les fonctionnalités 2D intégrées)

jhocking
la source
2

Comme le dit jhocking, c'est le résultat de la transformation de chaussures 2D en un IDE 3D. Mais, il y a une solution, c'est juste un peu mystérieux.

La première étape consiste à ouvrir les paramètres d'importation de votre sprite à partir du volet Projet. Une fois que le type de texture est défini sur Sprite ou Avancé (Avancé vous offre d'autres options pratiques, mais Sprite est par défaut si vous avez créé un projet 2D au début), il y a un champ Pixels en unités avec une valeur par défaut de 100.

Je fouine avec un système de tuiles, donc j'utilise des tuiles 16x16 pixels et je définis Pixels To Units à 16. Le calcul fonctionne comme suit: Taille en pixels (X ou Y) / Pixels To Units = Unity Units in Transform . Le cube de 16 pixels avec PTU 16 occupe 1 unité dans l'espace Unity.

Je n'ai pas encore essayé, mais je m'attends à ce qu'un PTU de 1 rende les choses parfaites en pixels.

Le réglage de la caméra orthographique est cependant un peu un casse-tête. Encore une fois, il est basé sur ce paramètre Pixels en unités, mais aussi sur quelques autres choses. Fondamentalement, c'est la moitié de la hauteur de l'écran des paramètres du lecteur (c'est-à-dire 1080, 768, quel que soit l'iPhone 5, ne peut pas être dérangé pour le rechercher) divisé par Pixels en unités.

PatrionDigital
la source
1

Les unités de pixels ne sont pas un bon moyen de représenter de grands mondes en raison du fonctionnement des nombres à virgule flottante. Avec des nombres à virgule flottante, vous perdez de la précision avec de très grands nombres. Les nombres proches de 0 ont la meilleure précision. Ainsi, certains moteurs de jeu ont tendance à préférer le système de métriques MKS (mètres / kilogrammes / secondes). Unity par défaut est le mètre, donc les personnages du jeu peuvent facilement être représentés avec une hauteur de 1,0 à 2,0 mètres avec une très bonne précision.

Le poids et la taille moyens d'un homme sont d'environ 50 kg et 1,8 mètre. Si vous tentiez de créer un personnage de 1 200 pixels de haut, son poids serait d'environ 33 000 pixels. Si vous vouliez ensuite ajouter un objet très lourd comme un bus à un jeu, vous auriez un grand nombre d'unités de pixels. Vous pouvez facilement voir comment cela pourrait conduire à des calculs très imprécis pour les collisions.

Si vous êtes très déterminé à utiliser des unités de pixels, vous pouvez facilement calculer le rapport pixels / mètres.

LVBen
la source
Mais tout cela ne s'applique pas à la plupart des jeux 2D qui n'ont pratiquement même pas besoin d'utiliser la physique. Le problème est que Unity suggère la prise en charge de la 2D, mais c'est très rudimentaire et nécessite beaucoup d'études pour simplifier ce dont vous avez vraiment besoin pour un moteur 2D.
Kokodoko