Codes de base Unity Animation 3D

  ATTENTION, ces codes fonctionnent seulement avec l'ancien système de gestion des inputs, plus simple: Pour le choisir, depuis votre projet Unity, vous devez aller au menu Project Settings > Player > Other Settings et au tab Active Input Handling choisir  Both or Input Manager (Old)

-Déclencher une animation de l’objet que l’on clique :

MonGameObject.GetComponent<Animator>().Play("le state de l’Animator à aller");

Par exemple:
Hero.GetComponent
<Animator>().Play("sauter");

 

-Déclencher une animation dont l’animator est un parent de l’objet cliqué.  Ajouter autant de ‘.parent’ qu’il y a de niveaux de hiérarchie pour se rendre au parent supérieur ciblé (celui contenant l’animator, 3 dans l’exemple ici). Attention d’ajouter transform avant dans ce cas-ci.

 public class Clique : MonoBehaviour

{

    void OnMouseDown()

    { 

       transform.parent.parent.parent.GetComponent<Animator>().Play("power_on");

    }

}

 

  ....Alternativement, il est possible de 'trouver' l'animator avec le script suivant (au lieu des multiples .parent)

{

    void OnMouseDown()

    { 

       GetComponentInParent<Animator>().Play("power_on");

    }

}

 

  .....OU encore utiliser un SerializedField pour l'Animator ?

{

    public class Hero : MonoBehaviour {

 

[SerializeField] Animator Bob;

 

void OnMouseDown()

    { 

       Bob().Play("power_on");

    }

 

 -Déclencher une animation dont l’animator est sur un autre objet de la scène :

  public class Clique : MonoBehaviour

{

    void OnMouseDown()

    { 

       GameObject.Find(“machine”).GetComponent<Animator>().Play("power_on");

    }

}

 

 

-Déclencher une fonction (ex : Demarre() ) d’un script d’un objet (voiture) depuis un autre objet/script :

    GameObject la_voiture = GameObject.Find(“voiture”);

 

    la_voiture.GetComponent<Son_script>().Demarre();

 

Faire bouger un objet ‘rigidBody à la vitesse speed sur l’axe des Z    (x,y,z):

 void Update()

    {

        GetComponent<Rigidbody>().velocity = new Vector3(00speed);

  

    }

 

-En 3d, une position est exprimée par 3 axes, x,y,z.  On doit spécifier les 3 axes à chaque fois, même si c’est seulement un axe qu’on veut changer. On peut ‘interroger’ (lire) la position d’un seul axe (monGameObject.transform.position.z), mais pour le changer, on doit toujours définir les 3 axes en même temps, via un Vector3 :

MonGameObject.transform.position= new Vector3(-12 5);

Ainsi, pour placer un objet à la position verticale (y)  5, sans affecter ses autres axes, on fait :

MonGameObject.transform.position= new Vector3(transform.positions.x, 5 ,transform.positions.z);


Faire apparaitre ou disparaitre un objet, sans le désactiver :

GetComponent<MeshRenderer>().enabled = false;

 

Désactiver un objet complètement (invisible et script Update désactivé), sans l’éliminer.

MonGameObject.SetActive(false);

 

Éliminer complètement un objet (runtime) :

Destroy(MonGameObject)(false);

https://docs.unity3d.com/ScriptReference/Object.Destroy.html

Donner une position à un GameObject (x,y,z) :

  Nouvelle_position = new Vector3(x,y,z);

     MonGameObjet.transform.position= Nouvelle_position;

 

 

Faire bouger un objet d’un point (vector3) vers un autre point, à la vitesse 5 :

  void Update()

    {

      MonGameObject.transform.position = Vector3.MoveTowards(position_depart, positionArrivee5);

  }

 

https://docs.unity3d.com/ScriptReference/Vector3.MoveTowards.html

 

Déclencher une fonction (Go) de l’objet B lorsque l’objet B touche l’objet. L’objet B lui a un script (Bouge_cubes) qui contient une fonction Go(). Le script suivant est sur l’objet A :

void OnTriggerEnter(Collider other)  ///script sur l’objet A

    {

        other.gameObject.GetComponent<Bouge_cubes>().Go();

    }

 

Démarrer une animation à un 'temps' différent que le début de celle-ci (ici le temps est dans la variable myTime et varie entre 0=debut et 1=fin)

Ici 'porte_ouvre' est le nom du clip (state); 0 est le numéro du premier layer ; et myTime est la position de départ du Play (0.5=milieu)

Float myTime=0.5f; /// 0.5= le milieu de l'animation
GetComponent <Animator>().Play("porte_ouvre", 0, myTime);

 

Obtenir le temps écoulé d'une animation qui joue, de 0 (debut) à 1 (lorsqu'elle est terminée) . En paramètre le numéro du layer si plus qu'un (premier layer=0)

 GetComponent <Animator>().GetCurrentAnimatorStateInfo(0)/// obtenir le temps d'une animation

 

Jouer un son losqu'on clique un objet:

 

// Champs requis - placer au dessus de la méthode Start()

 

private AudioSource _monAudioSource;

[SerializeField] private AudioClip _monAudioClip;

 

// Associer votre AudioClip à ce champ exposé dans l'inspecteur // Dans Start()

 

_monAudioSource = GetComponent ();

 

// Ensuite pour faire jouer le son au moment voulu...

 _monAudioSource.PlayOneShot(_monAudioClip);

 

 
Démarrer une animation de 'retour (rewind)' ( ex:fermer) au même temps relatif que celle en cours (ouverture)

 

    public class Clique_porte : MonoBehaviour {
    private Animator Anim;    

    private int swt = 0;
    private AnimatorStateInfo animationState;
    private AnimatorClipInfo[] myAnimatorClip;

    void Start()     {      
     Anim = transform.parent.parent.GetComponent<Animator>();        
    }

    void OnMouseDown()
    {
       
        animationState = Anim.GetCurrentAnimatorStateInfo(0
);///doit être redéfinit à chaque fois car clip change...  
        float myTime = Mathf.Abs(1 - animationState.normalizedTime);        
        if (animationState.normalizedTime > 1) myTime = 0
;////si animation termine et donc plus loin que 1, animation doit rewind
        if (swt == 0)         {
            Anim.Play("porte_ouvre", 0, myTime);

            swt = 1;         }
        else
        {
            swt = 0;
            Anim.Play("porte_ferme", 0, myTime);
        }
    }

  }

 

 

Changer de caméra: (il faut désactiver les autres !)

void Update();
{
   if (Input.GetKey(KeyCode.Alpha1))        ////////////1 et 2 pour chagner les cameras
   {
          back_cam.enabled = false;
          front_cam.enabled = true;
   }

   if (Input.GetKey(KeyCode.Alpha2)) {
            back_cam.enabled = true;
           front_cam.enabled = false;
   }
}

 

Déclencher une animation avec les touches du clavier (w)en passant par les variables bool de l'animator de Unity

void Update();
{

       if (Input.GetKey(KeyCode.W)) {
               Anim_controler.SetBool("is_walking", true); /// is_walking est la variable boolean qui gère cette animation dans l'animator
       }
        if (!Input.GetKey(KeyCode.W))  { /// Notez le ! pour négatif
        Anim_controler.SetBool("is_walking", false);
        }
  }

 

 

Déclencher une animation de changements de plans de caméras:

1-Créer un asset de type Timeline/Timeline et y ajouter tes caméras dans l'ordre voulu
2-Ajouter un Component de type PlayableDirector à un objet de la scène. Draguer le Timeline dans le paramètre 'Playable' de ce component. Décocher PLay on awake.
3-Il sera alors possible de déclencher ce timeline par le code suivant:

GameObject.Find("LeGameObjet").<PlayableDirector>().Play();