Unity undo

Unity – Undo Redo dans l’éditeur

Sur Unity et dans presque tous les autres logiciels, vous utilisez « CTRL + Z » ou « Command + Z » pour annuler et « CTRL + Y » ou « Command + Y » pour rétablir une action.

Cependant, lors de l’utilisation d’un script personnalisé dans l’éditeur, l’action d’annulation doit être implémentée. Sinon, peu importe à quel point vous appuyez sur vos touches, rien ne se passera.

Il est très important de spécifier ces méthodes, car un mauvais clic se produit si rapidement et sans possibilité d’annulation, cela peut être dramatique.

Implémentation de l’annulation dans un script d’éditeur

Undo est une classe C# statique, et diverses méthodes doivent être utilisées en fonction des actions que vous effectuez. Toutes les méthodes d’annulation ont un paramètre de chaîne, qui est utilisé pour nommer l’action effectuée.

Vous pouvez ensuite le trouver dans l’éditeur en haut du menu ‘Edit‘.

Unity show menu edit with undo label

Modification d’un gameObject

Pour modifier un gameObject, utilisez Undo.RecordObject. Veillez à passer le composant que vous modifiez en tant que paramètre, par exemple :

  • Si vous modifiez le nom d’un gameObject, le gameObject doit être passé en paramètre.
  • Si vous modifiez la position du gameObject, le composant de transformation doit être le paramètre.
[MenuItem("Window/Reset Position")]
public static void Reset()
{
    var go = Selection.activeGameObject;
    Undo.RecordObject(go.transform, "reset position");

    go.transform.position = Vector3.zero;
}

Ajout d’un composant

Pour annuler l’ajout d’un composant, la méthode est différente : vous n’avez plus besoin d’utiliser AddComponent. Remplacez-le par Undo.AddComponent.

[MenuItem("Window/Add BoxCollider")]
public static void AddBoxCollider()
{
    var go = Selection.activeGameObject;
    Undo.AddComponent(go);
}

Destruction du GameObject

Dans l’éditeur, nous utilisons généralement Object.DestroyImmediate pour détruire un GameObject. Pour une action d’annulation, utilisez Undo.DestroyObjectImmediate à la place. Cette fonction doit également être utilisée pour détruire un composant.

var go = Selection.activeGameObject;
Undo.DestroyObjectImmediate(go);

Création du GameObject

Pour créer ou instancier un gameObject, Undo.RegisterCreatedObjectUndo doit être appelé pour enregistrer l’action Undo.

[MenuItem("Window/Add Cube")]
public static void AddCube()
{
    var cube = GameObject.CreatePrimitive(PrimitiveType.Cube);
    Undo.RegisterCreatedObjectUndo(cube, "Add Cube");
}

Modification de la hiérarchie

Lors de la modification de la hiérarchie pour enregistrer une action d’annulation, utilisez Undo.SetTransformParent pour changer le parent. Pour les modifications de position, utilisez Undo.SetSiblingIndex.

var go = Selection.activeGameObject;
Undo.SetTransformParent(go.transform, parentTransform, "Set parent");
Undo.SetSiblingIndex(go.transform, 0, "Set on top");

Voici donc les fonctions les plus couramment utilisées pour enregistrer l’annulation.

Annulation en masse

Vous pouvez également enregistrer des annulations par groupes, afin de pouvoir effectuer une multitude d’actions et les annuler toutes en une fois. Très utile si vous ne voulez pas appuyer sur « CTRL + Z » pendant 2 heures…

  1. Vous devrez utiliser la méthode Undo.SetCurrentGroupName pour nommer votre groupe.
  2. Ensuite, récupérez l’identifiant du groupe en cours à l’aide de Undo.GetCurrentGroup.
  3. Et ensuite, fusionnez tout cela en utilisant Undo.CollapseUndoOperations.
[MenuItem("Window/ResetDisable")]
public static void ResetDeactivate()
{
    // set group
    Undo.SetCurrentGroupName("Reset & Disable GameObject");

    // get current group
    int group = Undo.GetCurrentGroup();

    var go = Selection.activeGameObject;
    Undo.RecordObject(go.transform, "Reset position");

    go.transform.position = Vector3.zero;

    Undo.RecordObject(go, "Disable GameObject");

    go.SetActive(false);

    // merge all undo in the group
    Undo.CollapseUndoOperations(group);
}

En conclusion, n’oubliez pas d’implémenter votre annulation lorsque vous travaillez avec des scripts dans l’éditeur. Cela vous fera gagner beaucoup de temps et vous aidera à mener à bien votre projet.

Merci de votre lecture.

Laisser un commentaire

Votre adresse e-mail ne sera pas publiée. Les champs obligatoires sont indiqués avec *