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:
- 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?
- 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.
Réponses:
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)
la source
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.
la source
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.
la source