Unity motion match
Utilisée pour remplacer un mouvement de référence sur de l'uGUI existant : translation, échelle uniforme et opacité avec une caméra fixe. Travaillez dans une copie de projet isolée. Le chemin par défaut auto utilise un pont d'éditeur commun et des données de liaison générées, sans adaptateurs C# spécifiques au jeu ni méthodes privées du jeu.
Découvrir et préparer
Lisez la section liaison automatique pour la sélection, les sorties et les limites, et la section périmètre de validation pour le comportement testé et les erreurs d'ajustement visuel restantes. Pour le modèle de composition, les articles originaux et un benchmark de mouvement reproductible, lisez la section méthode et preuves. La source doit compiler avec l'éditeur Unity sélectionné et contenir de l'uGUI. Python nécessite numpy, scipy, opencv-python et Pillow ; ffmpeg n'est nécessaire que pour les entrées vidéo.
python scripts/unity.py prepare --source C:/project --workspace C:/motion-work --editor "C:/Program Files/Unity/Hub/Editor/6000.3.21f1/Editor/Unity.exe"
Ceci copie Assets/Packages/ProjectSettings sans Library, inventorie la structure Canvas/RectTransform/layout/composant de la scène, choisit une scène de démarrage, entre en mode Play normal, découvre l'interface utilisateur résultante, sélectionne les groupes visibles indépendants, et extrait les modèles de fond/repos/RGBA. Des lancements répétés établissent une base de référence stable après importation. Aucune scène n'est sauvegardée et la source n'est pas modifiée.
Inspectez selection.html, auto-report.json, auto-bindings.json et les images rest.png extraites. La sélection automatique est une suggestion structurelle, pas une connaissance de l'interface que l'utilisateur a l'intention d'animer. Utilisez --scene, --canvas, ou des sélecteurs de données --target répétés lorsque la tâche spécifie un écran/un groupe. Ceux-ci ne nécessitent aucun code d'adaptateur. Les noms en double nécessitent un ID de liaison d'inventaire ou un chemin unique.
Pour l'inventaire uniquement, utilisez scan avec les mêmes arguments source/espace de travail. Pour un aperçu de scène sérialisé sans démarrage du jeu, choisissez explicitement --execution edit ; étiquetez-le comme un aperçu, pas une vérification d'exécution. Ne substituez pas silencieusement un aperçu d'édition lorsque l'initialisation du mode Play échoue.
Unity natif peut nécessiter le chemin d'exécution approuvé de l'hôte pour les licences. Utilisez l'autorisation existante pour la copie isolée. En cas d'échec de lancement, inspectez le journal ; ne réessayez pas ou ne réparez pas silencieusement du code de jeu non lié. Un espace de travail préparé est un instantané : après avoir modifié l'interface source, créez un nouvel espace de travail.
Correspondre et capturer
Placez les enregistrements sous REFERENCE_ROOT/CASE-REVISION/, en utilisant les IDs de cas dans workspace.json, par exemple c_abcd1234-r1/reference.mp4. La capture utilise des clips de deux secondes à 30 ips, se terminant par la pose de repos originale.
python scripts/unity.py match --workspace C:/motion-work --reference C:/references --revision r1
La commande estime le mouvement à partir des pixels, écrit solutions/REVISION, échantillonne les AnimationClips natifs sur les objets existants liés, capture la sortie Unity et vérifie la préservation. Les nouveaux enregistrements nécessitent toujours une nouvelle extraction. Pour le même enregistrement, scripts/motion.py revise ajuste la vitesse, la distance spécifique à l'axe ou le décalage ; conservez une image clé de pose de repos à deux secondes lors de l'édition du timing, et réexécutez unity.py capture --workspace ... --revision ... après les modifications.
Le fitteur pixel utilise des signaux filtrés en pleine résolution et calibre les petites différences de modèle/raster à partir de l'image de repos finale de la référence. Inspectez *.fit.json pour referenceRestCalibration. Pour un graphique monochrome avec des pixels opaques, flatPaintOpacity enregistre le nombre d'images ayant eu suffisamment de patches visibles séparés pour mesurer l'opacité du groupe. Un enregistrement qui se termine intentionnellement à une autre pose/opacité n'est pas une entrée valide pour ce workflow.
Auto exporte un fichier .anim séparé relatif à la racine pour chaque cible, évitant les chemins d'animation Unity ambigus lorsque des frères ont des noms identiques. Les liaisons identifient l'objet réel de la scène/hiérarchie. Aucun objet wrapper, changement de parent, contrôle renommé ou recâblage de callback n'est introduit.
Inspectez la sortie par rapport à la référence avant de déclarer le mouvement comme correspondant. Le fait de passer les vérifications de mise en page/liaison n'est pas une preuve de similarité visuelle. Les pixels faibles, le clipping, les interfaces similaires et les opacités qui se chevauchent peuvent encore nécessiter une correction.
Pour les MP4, le fitteur vérifie l'arrière-plan stationnaire pour les différences introduites par le décodage. Pour les graphiques monochromes éligibles, il estime l'opacité à partir de la luminosité partagée par de nombreux traits. Dans *.fit.json, videoOpacity.measuredFrames compte les images avec des preuves vidéo utilisables avant restStartsAt ; les autres images conservent l'estimation antérieure. Inspectez les chevauchements et les transitions abruptes dans la relecture. Une limite numérique de pire image nécessite des valeurs d'opacité de référence connues.
Ce que les vérifications établissent
Auto compare les ancres/pivots/tailles/configuration de mise en page, les références d'objets sérialisées et les liaisons d'événements persistants, la pose finale, les destinations de raycast des boutons lorsqu'elles sont disponibles, et la restauration à deux tailles de fenêtre. Il n'invoque pas de boutons inconnus ni ne déduit si les achats, l'authentification, la navigation ou d'autres résultats spécifiques au jeu sont corrects. gameSpecificSemanticsVerified reste à faux.
Exécutez unity.py audit --workspace ... pour la base de référence des ressources/configuration. Gardez les coûts de découverte, de préparation et de remplacement séparés. Le benchmark de profil manuel précédent n'établit pas les performances pour la découverte automatique.
--profile trash-dash et --profile survivors-kit en option conservent les tests d'interaction de jeu connus antérieurs. Lisez les profils hérités uniquement lorsque ces tests sémantiques sont utiles ; ils ne sont pas nécessaires pour les autres projets uGUI.