←

A Time Paradox

Considérations techniques

Introduction

Samuel BOUCHET

Développeur Web et Jeu vidéo
@Lythom

Prototypes et jeux

Mod minecraft - Capsule

430 000+ téléchargements !
https://minecraft.curseforge.com/projects/capsule

A Time Paradox

Un jeu d'inflitration contre soi-même, où le joueur doit éviter ses « lui » du passé.

On va parler de

  • Localisation
  • Authentification
  • Mise à jour dynamique de contenu
  • Unity et tests

Localisation

C# - solution sur mesure

  • Ce n'est pas si compliqué
  • Ambitions limitées
  • Complexité maitrisée (par rapport à une solution existante)
  • Utilise les outils de localisation intégrés .net (formattage du temps, des devises)
  • Intégration à Unity via editor tools

Ce qui pourrait manquer

  • Localisation des pluriels
  • Localisation des écritures de droite à gauche
  • Localisation des langues asiatiques
  • Contexte pour permettre une externalisation de la traducion

Authentification

TypeScript - solution sur mesure

  • Ce n'est pas si compliqué
  • Meilleure expérience utilisateur (pas de mot de passe)
  • Indépendance (ne pas avoir de dépendances tiers)
  • Maitrise de la localité des données (en France)
  • Maitrise des données (aucune donnée cachée par le service)

Légal

Techniquement

  • Utilisation d'un jeton
  • Le jeton initial est généré simultanément, une seed est générée par le client
  • Un lien est envoyé dans la boite mail pour valider l'accès au compte, celà active le jeton
  • Le premier accès se fait avec le jeton initial, des jetons de sessions sont ensuite échangés

Tests

  • Tests d'intégration, couverture de 94 % (manque quelques cas d'erreur)
  • Copie de la BDD et tests effectués sur une BDD de test.
  • Validation que des scénarios complets fonctionnent
  • Utilisation de Jest

Mise à jour dynamique de contenu

C# - solution sur mesure

Besoin: envoyer des correctifs de localisation, des nouveaux niveaux, des mises à jour de niveaux sans mise à jour du client

  • Lorsque le jeu est connecté à internet, vérification d'un hassh de contenu. Si le hash change on télécharge le nouveau contenu dans un dossier local
  • Le chargement du contenu se fait par surcharge: si un contenu additionnel est détecté il prend la priorité
  • Un index permet de lister tout le contenu disponible pour peupler les menus
  • Cet index est généré dynamiquement par le tooling unity développé par le jeu

Améliorations possibles

  • Notification automatique ou manuelle de l'utilisateur lors d'une mise à jour ?
  • Protection contre la corruption ou l'édition manuelle de ce contenu

Unity et tests

C# - solution sur mesure

Besoin : tester des scénarios précis sans avoir à rejouer l'intégralité d'une séquence ni à modifier les données de sauvegarde manuellement

foldedOut[2] = EditorGUILayout.Foldout(foldedOut[2], "Create Account", true, BOLD);
if (foldedOut[2]) {
    if (GUILayout.Button("Start Create Account Test")) {
        ResetPlayerData();
        PlayerPrefs.SetInt("purchased", 1);
        PlayerPrefs.Save();
        EditorSceneManager.OpenScene("Assets/Scenes/PreloadScene.unity");
        EditorApplication.isPlaying = true;
    }

    GUILayout.Label("* Goto synchronize menu and provide email");
    GUILayout.TextField("test@a-game-studio.com");
    GUILayout.Label("* [error check] Temporary shutdown the server and click 'synchronize'.");
    // ...
}
                

Autres enjeux techniques

  • Analytique jeu et site (Matomo, auto-hébergé)
  • Synchronisation des données de jeu (et si le joueur débloque des défis différents sur 2 devices offline avec 5 clés disponibles ?)
  • Déploiement du serveur d'API sans interruption avec Clever Cloud

Merci pour votre temps !

Essayer le jeu : a-time-paradox.com


@Lythom
https://samuel-bouchet.fr