Que recherchez-vous ?
Engine & platform

Accéder au mode lecture plus rapidement dans Unity 2019.3

ALEXEY ZAKHAROV / UNITY TECHNOLOGIESContributor
Nov 5, 2019|5 Min
Accéder au mode lecture plus rapidement dans Unity 2019.3
Cette page a été traduite automatiquement pour faciliter votre expérience. Nous ne pouvons pas garantir l'exactitude ou la fiabilité du contenu traduit. Si vous avez des doutes quant à la qualité de cette traduction, reportez-vous à la version anglaise de la page web.

Le mode "Play" est au cœur de ce qui rend Unity agréable à utiliser. Mais lorsque vos projets deviennent plus complexes, le démarrage peut prendre un certain temps. Plus vous pouvez entrer et sortir rapidement du mode lecture, plus vous pouvez rapidement effectuer et tester des modifications. C'est pourquoi nous introduisons le mode Enter Play configurable dans Unity 2019.3 beta en tant que fonctionnalité expérimentale.

Actuellement, lorsque vous entrez en mode lecture dans l'éditeur, Unity fait deux choses : il réinitialise les états du script (Domain Reload) et recharge la scène. Cela prend du temps, et plus votre projet est complexe, plus vous devez attendre pour tester les nouvelles modifications en mode lecture. Cependant, à partir de la version bêta de Unity 2019.3, vous aurez la possibilité de désactiver l'une ou l'autre des actions "Domain Reload" et "Scene Reload", ou les deux.

D'après les résultats de nos tests, cela peut vous faire gagner jusqu'à 50-90 % de temps d'attente, en fonction de votre projet.

Image

Lorsque vous activez les options d'entrée en mode lecture dans Fichier > Paramètres du projet > Éditeur, vous verrez que les options de rechargement du domaine et de rechargement de la scène sont disponibles. Pour plus de détails, consultez la section Comment configurer le mode lecture dans la documentation .

Image

Ces options vous permettent de désactiver le rechargement du domaine et/ou de la scène à partir du processus d'entrée en mode lecture lorsqu'il n'y a pas de changement de code. Vous pouvez également accéder à cette fonctionnalité par le biais d'une API et d'un rappel si vous souhaitez réinitialiser l'état du jeu avant d'entrer en mode lecture.

Le diagramme ci-dessous illustre le processus d'entrée en mode lecture avant et après la désactivation des fonctions Reload Domain et Reload Scene :

Image

Pour plus de détails sur les processus qu'Unity suit lorsqu'il entre en mode lecture, consultez la documentation.

Notez que cette fonctionnalité est actuellement expérimentale et que tous les paquets Unity ne sont pas validés pour fonctionner avec le domaine désactivé et le rechargement de scène. N'hésitez pas à nous informer sur le forum si vous rencontrez des problèmes !

Comment modifier correctement vos scripts lorsque vous avez désactivé le rechargement du domaine (Domain Reload)

Comme vous pouvez le constater, il est très simple d'éviter de recharger le domaine, mais cela a un coût. Vous devez adapter les champs statiques et les gestionnaires d'événements statiques de vos scripts pour vous assurer que les états de vos scripts se réinitialisent correctement lorsque vous passez en mode lecture.

L'exemple de code suivant contient un compteur qui augmente lorsque le joueur appuie sur le bouton Jump. Lorsque le rechargement du domaine est activé, le compteur est automatiquement remis à zéro lors de l'entrée en mode lecture. Après avoir désactivé le rechargement du domaine, le compteur n'est pas réinitialisé ; il conserve sa valeur en mode lecture et hors mode lecture. Cela signifie que lors de la deuxième exécution de votre projet dans l'éditeur, le compteur peut ne pas être à zéro s'il a changé lors de l'exécution précédente.

public class StaticCounterExample : MonoBehaviour
{
//Ce compteur ne sera pas remis à zéro lorsque le rechargement du domaine est désactivé.
statique int counter = 0 ;

// La mise à jour est appelée une fois par image
void Update()
{
if (Input.GetButtonDown("Jump"))
{
contre++ ;
Debug.Log("Compteur : " + compteur) ;
}
}
}

Utilisez l'attribut [RuntimeInitializeOnLoadMethod(RuntimeInitializeLoadType.SubsystemRegistration)] et réinitialisez la valeur explicitement pour vous assurer que le compteur se réinitialise correctement lorsque le rechargement de domaine est désactivé. Exemple :

en utilisant UnityEngine ;

public class StaticCounterExampleFixed : MonoBehaviour
{
statique int counter = 0 ;

[RuntimeInitializeOnLoadMethod(RuntimeInitializeLoadType.SubsystemRegistration)]
static void Init()
{
Debug.Log("Remise à zéro du compteur.") ;
compteur = 0 ;
}

// La mise à jour est appelée une fois par image
void Update()
{
if (Input.GetButtonDown("Jump"))
{
contre++ ;
Debug.Log("Compteur : " + compteur) ;
}
}
}

Après avoir désactivé le rechargement de domaine, Unity ne désenregistrera pas les méthodes des gestionnaires d'événements statiques lorsque vous quitterez le mode lecture. Cela peut entraîner des complications si votre code enregistre des méthodes avec des gestionnaires d'événements statiques. Par exemple, lors de la première lecture de votre projet dans l'éditeur, les méthodes seront enregistrées normalement. Cependant, lors de la deuxième lecture de votre projet, ces méthodes seront enregistrées une deuxième fois en plus de la première, et seront donc appelées deux fois lorsque l'événement se produira.

Le code suivant enregistre une méthode avec le gestionnaire d'événement statique Application.quitting :

en utilisant UnityEngine ;
public class StaticEventExample : MonoBehaviour
{
void Start()
{
Debug.Log("Registering quit function") ;
Application.quitting += Quit ;
}

static void Quit()
{
Debug.Log("Quitting !") ;
}
}

Lorsque le rechargement de domaine est désactivé, l'exemple ci-dessus ajoute la méthode `Quit` à chaque fois que vous entrez en mode lecture. Il en résulte un message supplémentaire "Quitting" à chaque fois que vous quittez le mode lecture.

Utilisez l'attribut [RuntimeInitializeOnLoadMethod] et désenregistrez explicitement la méthode afin qu'elle ne soit pas ajoutée deux fois :

en utilisant UnityEngine ;
public class StaticEventExampleFixed : MonoBehaviour
{
[RuntimeInitializeOnLoadMethod]
static void RunOnStart()
{
Debug.Log("Unregistering quit function") ;
Application.quitting -= Quit ;
}

void Start()
{
Debug.Log("Registering quit function") ;
Application.quitting += Quit ;
}

static void Quit()
{
Debug.Log("Quitter le lecteur") ;
}
}

Pour plus de détails sur la modification de vos scripts afin qu'ils fonctionnent correctement lorsque le rechargement du domaine est désactivé, consultez notre documentation.

Asset Store

Nous aimerions nous assurer que les paquets les plus populaires de l'Asset Store fonctionnent avec les domaines désactivés et le rechargement de scènes. Vous pouvez nous aider en signalant les problèmes que vous rencontrez dans vos projets aux éditeurs de vos paquets d'actifs.

Rejoignez la version bêta d'Unity 2019.3 !

Nous pensons que si votre projet est actuellement lent à passer en mode lecture, cette fonctionnalité permettra d'accélérer les choses de manière significative. Rejoignez Unity 2019.3 beta et essayez-le, nous sommes impatients de connaître votre avis sur le forum! Cette fonctionnalité étant expérimentale, vous pouvez encore nous aider à la façonner pour qu'elle réponde à vos besoins. Nous sommes particulièrement impatients de connaître les problèmes que vous rencontrez.

Un grand merci aux utilisateurs du forum @Sini, @chrisk, @Peter77 et @Baste qui ont déjà aidé l'ensemble de la communauté en testant cette fonctionnalité et en fournissant un retour d'information inestimable.