meetup unity#5 dungeonoftheendless (1)
DESCRIPTION
Meetup Unity 3D du 18/02/2014TRANSCRIPT
Meetup Unity 3D #5 Dungeon of the Endless
Hello world!
Sébastien Dubois Lead programmer Unity3D [email protected] @GFX47
Présentation Rendu Génération Conclusion
Meetup Unity 3D #5 Dungeon of the Endless
Présentation - Perso
Formation Parcours pro
Présentation – Amplitude Studios
Présentation – Amplitude Studios
Présentation – Amplitude Studios
Présentation – Amplitude Studios
Présentation – Dungeon of the Endless
Réf. : « Dungeon of the Endless – Early Access Trailer » http://goo.gl/y0WsVI
Présentation – Dungeon of the Endless
Présentation – Dungeon of the Endless
Michaël BREYTON Associate producer
Arthur Prudent Game Designer
Simon Perin Pixel Artist
Sébastien Dubois Lead programmer
Présentation – Dungeon of the Endless
Game Design
Playtests Implémentation
QA / VIP
Public
Présentation – Dungeon of the Endless
Début (avril 2013) … Early access Steam (décembre 2013) + 1 update / 2 semaines … Bêta (??/??/2014) … Gold (??/??/2014) \o/
Réf. : « Dungeon of the Endless - Steam » store.steampowered.com/app/249050
Présentation Rendu Génération Conclusion
Meetup Unity 3D #5 Dungeon of the Endless
Rendu – Pixel Perfect - Caméra :
- Type orthographique - « orthographic size » = hauteur d’écran (pixels) / 2
- Textures : - Filtre « point » - Désactiver les mip maps - Compression RGBA 32 bit (« True color with alpha ») - Dimensions = puissance de 2
- Scaling : - 1 pixel = 1 unité de distance
Rendu – Dynamic Lighting/Shadows
Eclairage dynamique => scène 3D Scène 3D + Pixel perfect => angle de la caméra spécifique cos(60°) = ½ => scale.y = 2 (1 / ½) sin(60°) = 0,866 scale.z = 1,155 (1 / 0,866)
y x 2
Rendu – Dynamic Lighting/Shadows
60°
z
y
Rendu – Dynamic Lighting/Shadows
y x 2
x z x 1,155
Rendu – Dynamic Lighting/Shadows
Caméra orthographique => Forward rendering
« Yes, it's an unfortunate performance choice we had to do - deferred does not work with orthographic cameras. » - Aras (Unity3D Lead Graphics Programmer)
Forward rendering => pas d’ombres dynamiques
« Forward Rendering supports one directional light with shadows » - Unity3D Documentation
Rendu – Dynamic Lighting/Shadows
Solution #1 : tricher - Caméra perspective - Field of view proche de 0° (min = 1) - Caméra placée très loin de la scène (vraiment très loin) - « Far clipping » très élevé
Résultat : - 80% pixel perfect (lignes verticales… ou pas) - Nombreux bugs graphiques (« erreurs de flottant »)
Rendu – Dynamic Lighting/Shadows
Solution #2 : forcer la main au shader « fullforwardshadows - Support all shadow types in Forward rendering path » - Unity3D Documentation
#pragma surface surf Lambert fullforwardshadows
Résultat : - 99% pixel perfect (angle de caméra => « erreurs de flottant »)
Rendu – Transparence et z-index
Shader transparent => z-index aléatoire « Using transparent objects in your game can be tricky, as there are traditional graphical programming problems that can present sorting issues in your game » - Unity3D Documentation
Rendu – Transparence et z-index
Solution #1 : render queue index private void Awake()
{
// Transparent + 1
this.renderer.sharedMaterial.renderQueue = 3001;
}
Résultat : - Difficile à maintenir - Un material par index (plus de draw calls) - Insuffisant dans certains cas particuliers de level design
Rendu – Transparence et z-index
Solution #2 : utiliser les shaders cutout « The graphical sorting problems normally associated with Transparent shaders do not occur when using this shader » - Unity3D Documentation
Résultat : - L’altitude (y) des objets est bien prise en compte - Impossible d’utiliser la semi-transparence dans les textures (dégradés 0 -> 1)
Rendu – Bump Mapping
+ =
Réf. : « Legend of Dungeon - Dynamic Lighting on Sprites » http://goo.gl/hpYQFd
Rendu – Bump Mapping
Présentation Rendu Génération Conclusion
Meetup Unity 3D #5 Dungeon of the Endless
Génération – Concept
Objectifs - Infinité de combinaisons possibles - « Maitriser l’aléatoire »
Génération semi-procédurale - Design manuel « haut niveau » - Concept générique = s’applique à tous les niveaux de détail (donjons, salles, props, etc) - Extensible à volonté
Génération – Les données
Type = catégorie de contenu Ex : donjon, petite/grand salle, props pour mur/sol
Template = contenu Ex : contenu d’un donjon, contenu d’un petite salle Peut contenir des slots!
Slot = emplacement clé Ex : emplacement réservé à une petite salle dans un donjon
Tag = contrainte de génération Ex : un slot taggé « niveau 1 » ne pourra être remplacé que par un template taggé « niveau 1 »
Template
> Type > Tags[] > Design graphique > Design gameplay > Slots[]
Slot
> Type > Tags[]
Génération – Exemple de templates
Salle
Donjon v2
Salle
Salle
Salle Salle
Salle
Salle
Donjon v1
Salle
Salle
Salle Salle
Salle
Salle Salle
Salle
Donjon v3
Salle
Salle
Salle Salle
Salle
Salle Salle
Salle
Donjon v4
Salle
Salle
Salle
Salle Salle
Salle
Salle Salle Salle
Salle
Salle
Salle
Génération – Exemple de templates
Salle v1
Props Props
Props
Salle v2
Gros Props
Props
Salle v3
Props Props
Gros Props
Props
Props
Salle v4
Props
Gros Props
Props
Props
Gros Props
Génération – L’algorithme
// Tant qu’il y a des slots à remplacer while (slots.Count > 0)
{
// Sortir un slot de la liste slot = slots.GetRandom();
slots.Remove(slot);
// Piocher au hazard un template du même type respectant les contraintes (tags) template = templates.GetRandomTemplateMatching(slot.type, slot.tags);
// Remplacer le slot par ce template templateInstance = Instantiate(template, slot.position, slot.rotation);
Destroy(slot);
// Ajouter les (éventuels) slots contenus dans le template à la liste slots.AddRange(templateInstance.Slots);
}
Génération – Exemple de génération
Donjon
Génération – Exemple de génération
Salle
Donjon v3
Salle
Salle
Salle Salle
Salle
Salle Salle
Génération – Exemple de génération
Salle v2
Salle v1
Salle v3
Salle v2 Salle v2
Salle v3
Salle v4 Salle v1
Génération – Exemple de génération
etc...
Présentation Rendu Génération Conclusion
Meetup Unity 3D #5 Dungeon of the Endless
Conclusion – Unity3D
Unity3D Excellent outil de prototypage Idéal pour le développement itératif
Unity2D (4.3) Sprite Editor -> utilisé pour le découpage de nos sprite sheets de décors Animation de sprites -> solution in-house tant que les shaders « sprite » ne supporteront pas le shadow casting
Contact
Sébastien Dubois Lead programmer Unity3D [email protected] @GFX47
Dungeon of the Endless store.steampowered.com/app/249050
Meetup Unity 3D #5 Dungeon of the Endless
Annexes – Pixel Perfect
Le problème « Half-Pixel VS Half-Texel » (DirectX9)
Réf. : « Understanding Half-Pixel and Half-Texel Offsets » http://goo.gl/xkwPlz