[RÉSOLU] Jouer une animation quand il attaque

Questions à propos du scripting. Hors Shader, GUI, Audio et Mobile.
Scurreo
Messages : 21
Inscription : 01 Déc 2017 18:14

[RÉSOLU] Jouer une animation quand il attaque

Message par Scurreo » 11 Déc 2017 11:26

Bonjour,

Je viens de m'occuper de faire en sorte que lorsque que je trouve mes pages, mon animation se lance ainsi que la modification du texte. Cependant il faut bien perdre si on gagner et c'est là que je bloque. J'ai ici le script de mon Skeleton et je voudrais faire en sorte dans mon WinGameManager que lorsque qu'il utilise l'animation isAttacking mon IEnumetor GameOver() et c'est ici que ça bloque. Je ne sais pas comment faire pour lier les deux scripts lorsqu'il attaque.

Code : Tout sélectionner

using System.Collections;
using System.Collections.Generic;
using UnityEngine;

public class Chase : MonoBehaviour
{
    public Transform player;
    public Animator anim;

	// Use this for initialization
	void Start ()
    {
        anim = GetComponent<Animator>();
    }

    // Update is called once per frame
    void Update ()
    {
        AudioSource audio = GetComponent<AudioSource>();
        Vector3 direction = player.position - this.transform.position;
        float angle = Vector3.Angle(direction, this.transform.forward);
		if(Vector3.Distance(player.position, this.transform.position) < 15 && angle < 90)
        {
            direction.y = 0;

            this.transform.rotation = Quaternion.Slerp(this.transform.rotation, Quaternion.LookRotation(direction), 0.1f);

            anim.SetBool("isIdle", false);
            if(direction.magnitude > 5)
            {
                if (!audio.isPlaying) //Si le son n'est pas joué
                {
                    audio.Play();
                }

                this.transform.Translate(0, 0, 0.5f);
                anim.SetBool("isRun", true);
                anim.SetBool("isAttacking", false);
            }
            else
            {
                anim.SetBool("isAttacking", true);
                anim.SetBool("isRun", false);
            }
        }
        else
        {
            if (audio.isPlaying)
                audio.Stop();

            anim.SetBool("isIdle", true);
            anim.SetBool("isRun", false);
            anim.SetBool("isAttacking", false);
        }
	}
}
Mon manager:

Code : Tout sélectionner

using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using UnityEngine.SceneManagement;
using UnityEngine.UI;

public class WinGameManager : MonoBehaviour
{
    public PaperCounter player;
    public Text winText;
    public Chase skeleton;

    Animator anim1;

	// Use this for initialization
	void Start ()
    {
        anim1 = GetComponent<Animator>();
	}
	
	// Update is called once per frame
	void Update ()
    {
		if(player.paperCount >= 1)
        {
            StartCoroutine(Pause());
        }

        //Ici je cherche à dire que lorsque Skeleton isAttacking je lance GameOver()
        if(skeleton)
        {
            StartCoroutine(GameOver());
        }
	}

    IEnumerator Pause()
    {
        winText.GetComponent<Text>();
        winText.text = "You survived!";
        anim1.SetTrigger("Win");
        yield return new WaitForSeconds(10f);
        SceneManager.LoadScene("Menu");
    }

    IEnumerator GameOver()
    {
        winText.GetComponent<Text>();
        winText.text = "You failed!";
        anim1.SetTrigger("Win");
        yield return new WaitForSeconds(10f);
        SceneManager.LoadScene("Main");
    }
}
Merci
Dernière édition par Scurreo le 11 Déc 2017 15:33, édité 1 fois.

Avatar de l’utilisateur
boubouk50
ModoGenereux
ModoGenereux
Messages : 6186
Inscription : 28 Avr 2014 11:57
Localisation : Saint-Didier-en-Bresse (71)

Re: Jouer une animation quand il attaque

Message par boubouk50 » 11 Déc 2017 11:56

Salut,

Tu ne peux pas écrire une telle condition. Skeleton est de type Chase, cela ne veut rien dire.
Il te faut soit utiliser une variable de ta classe Chase et la tester à ce moment là, soit depuis la classe Chase tu envoies l'appel au gameOver.
La 2e solution est évidemment plus intelligente dans le sens où tester une variable à chaque Update est contraignant et bourrin, alors que tu as déjà la condition de remplie ailleurs.
Il vaut mieux que ta condition qui lance isAttacking lance aussi le GameOver puisque cela se passe en même temps.
"Ce n'est pas en améliorant la bougie, que l'on a inventé l'ampoule, c'est en marchant longtemps."
Nétiquette du forum
Savoir faire une recherche
Apprendre la programmation

Scurreo
Messages : 21
Inscription : 01 Déc 2017 18:14

Re: Jouer une animation quand il attaque

Message par Scurreo » 11 Déc 2017 12:12

C'est à dire je ne vois pas comment écrire ça. Quand tu me dit ça je pense comme ça:

Code : Tout sélectionner

using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using UnityEngine.UI;
using UnityEngine.SceneManagement;

public class Chase : MonoBehaviour
{
    public Transform player;
    public Animator anim;
    public WinGameManager gameOver;
    public Text winText;



	// Use this for initialization
	void Start ()
    {
        anim = GetComponent<Animator>();
    }

    // Update is called once per frame
    void Update ()
    {
        AudioSource audio = GetComponent<AudioSource>();
        Vector3 direction = player.position - this.transform.position;
        float angle = Vector3.Angle(direction, this.transform.forward);
		if(Vector3.Distance(player.position, this.transform.position) < 15 && angle < 90)
        {
            direction.y = 0;

            this.transform.rotation = Quaternion.Slerp(this.transform.rotation, Quaternion.LookRotation(direction), 0.1f);

            anim.SetBool("isIdle", false);
            if(direction.magnitude > 5)
            {
                if (!audio.isPlaying) //Si le son n'est pas joué
                {
                    audio.Play();
                }

                this.transform.Translate(0, 0, 0.5f);
                anim.SetBool("isRun", true);
                anim.SetBool("isAttacking", false);
            }
            else
            {
                StartCoroutine(GameOver());
                anim.SetBool("isAttacking", true);
                anim.SetBool("isRun", false);
            }
        }
        else
        {
            if (audio.isPlaying)
                audio.Stop();

            anim.SetBool("isIdle", true);
            anim.SetBool("isRun", false);
            anim.SetBool("isAttacking", false);
        }
	}

    IEnumerator GameOver()
    {
        winText.GetComponent<Text>();
        winText.text = "You failed!";
        anim.SetTrigger("Win");
        yield return new WaitForSeconds(10f);
        SceneManager.LoadScene("Main");
    }
}

Code : Tout sélectionner

using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using UnityEngine.SceneManagement;
using UnityEngine.UI;

public class WinGameManager : MonoBehaviour
{
    public PaperCounter player;
    public Text winText;

    Animator anim1;

	// Use this for initialization
	void Start ()
    {
        anim1 = GetComponent<Animator>();
	}
	
	// Update is called once per frame
	void Update ()
    {
		if(player.paperCount >= 1)
        {
            StartCoroutine(Win());
        }
	}

    IEnumerator Win()
    {
        winText.GetComponent<Text>();
        winText.text = "You survived!";
        anim1.SetTrigger("Win");
        yield return new WaitForSeconds(10f);
        SceneManager.LoadScene("Menu");
    }
}
Sauf que si c'est ça, ce que je doute je ne peux pas le faire car mon script Chase qui est attaché à mon Skeleton qui lui à une animation, je ne peux pas lui ajouter une autre animation pour le Game OVer

Avatar de l’utilisateur
boubouk50
ModoGenereux
ModoGenereux
Messages : 6186
Inscription : 28 Avr 2014 11:57
Localisation : Saint-Didier-en-Bresse (71)

Re: Jouer une animation quand il attaque

Message par boubouk50 » 11 Déc 2017 12:23

Le problème ici, c'est que tu ne comprends pas la POO, (Programmation Orientée Objet).
Tu peux très bien mettre le GameOver où tu veux en soi, et lancer autant d'animation que tu veux à partir d'une classe, il suffit simplement de définir qui fait quoi et quand.
Maintenant, encore une fois, essaie de séparer ce qui doit l'être, donc tout mettre au même endroit, n'est pas une bonne idée. Tel que tu as fait au départ, une classe pour ton monstre et une pour ton menu, c'est très bien, par contre la communication entre les deux est à revoir. Ce n'est pas à ton menu de demander perpétuellement si l'attaque est lancée, mais à ton monstre de le dire à ton menu.
Donc tu laisses le GameOver dans ton menu, mais celui-ci sera déclenché par le monstre. Il te faut donc une référence de ton menu dans ta classe monstre.
"Ce n'est pas en améliorant la bougie, que l'on a inventé l'ampoule, c'est en marchant longtemps."
Nétiquette du forum
Savoir faire une recherche
Apprendre la programmation

Scurreo
Messages : 21
Inscription : 01 Déc 2017 18:14

Re: Jouer une animation quand il attaque

Message par Scurreo » 11 Déc 2017 12:47

Je viens donc de regarder un peut de doc sur les liaison comme tu viens de me dire. J'ai donc relier comme ça mais j'ai une erreur: NullReferenceException: Object reference not set to an instance of an object.

Code : Tout sélectionner

using System.Collections;
using System.Collections.Generic;
using UnityEngine;

public class Chase : MonoBehaviour
{
    public Transform player;
    public Animator anim;

    // Use this for initialization
    void Start()
    {
        anim = GetComponent<Animator>();
    }

    // Update is called once per frame
    void Update()
    {
        AudioSource audio = GetComponent<AudioSource>();
        Vector3 direction = player.position - this.transform.position;
        float angle = Vector3.Angle(direction, this.transform.forward);
        if (Vector3.Distance(player.position, this.transform.position) < 15 && angle < 90)
        {
            direction.y = 0;

            this.transform.rotation = Quaternion.Slerp(this.transform.rotation, Quaternion.LookRotation(direction), 0.1f);

            anim.SetBool("isIdle", false);
            if (direction.magnitude > 5)
            {
                if (!audio.isPlaying) //Si le son n'est pas joué
                {
                    audio.Play();
                }

                this.transform.Translate(0, 0, 0.5f);
                anim.SetBool("isRun", true);
                anim.SetBool("isAttacking", false);
            }
            else
            {
                anim.SetBool("isAttacking", true);
                anim.SetBool("isRun", false);
                StartCoroutine(GetComponent<WinGameManager>().GameOver());
            }
        }
        else
        {
            if (audio.isPlaying)
                audio.Stop();

            anim.SetBool("isIdle", true);
            anim.SetBool("isRun", false);
            anim.SetBool("isAttacking", false);
        }
    }
}

Code : Tout sélectionner

using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using UnityEngine.SceneManagement;
using UnityEngine.UI;

public class WinGameManager : MonoBehaviour
{
    public PaperCounter player;
    public Text winText;

    Animator anim;

    // Use this for initialization
    void Start()
    {
        anim = GetComponent<Animator>();
    }

    // Update is called once per frame
    void Update()
    {
        if (player.paperCount >= 1)
        {
            StartCoroutine(Pause());
        }
    }

    IEnumerator Pause()
    {
        winText.GetComponent<Text>();
        winText.text = "You survived!";
        anim.SetTrigger("Win");
        yield return new WaitForSeconds(10f);
        SceneManager.LoadScene("Menu");
    }

    public IEnumerator GameOver()
    {
        winText.GetComponent<Text>();
        winText.text = "You failed!";
        anim.SetTrigger("Win");
        yield return new WaitForSeconds(10f);
        SceneManager.LoadScene("Main");
    }
}

Avatar de l’utilisateur
boubouk50
ModoGenereux
ModoGenereux
Messages : 6186
Inscription : 28 Avr 2014 11:57
Localisation : Saint-Didier-en-Bresse (71)

Re: Jouer une animation quand il attaque

Message par boubouk50 » 11 Déc 2017 13:23

Je suppose que l'erreur vient d'ici... mais ce serait quand même généreux de ta part de me le dire plutôt que je la trouve tout seul... (la ligne est écrite dans la console en rouge)
StartCoroutine(GetComponent<WinGameManager>().GameOver());

Allons-y.
D'abord les messages d'erreur. Lorsqu'un message d'erreur apparaît, Unity te donne l'information de ce qui ne va pas et où cela ne va pas. Certaines erreurs, dont celle-ci sont très courantes. Comme écrit, NullReferenceException, signifie que tu essaies d'atteindre quelque chose dans une variable non référencée, donc nulle. Cela signifie que cette donnée n'existe pas au moment de l'accès. Il faut donc la renseigner.
Ensuite, les Components ne sont pas accessibles n'importe où n'importe comment. Faire un GameObject.GetComponent () signifie que tu vas chercher un Component attaché au GameObject. Si le GameObject n'est pas spécifié alors il va chercher sur le GameObject en cours. Ici ton monstre.
Or, je suppose que WinGameManager n'est pas attaché au monstre. Donc tu ne peux pas l'appeler. Il te faut spécifier le GameObject pour lui donner celui qui possède le Component WinGameManager.
Il te faut donc référencer ce GameObject depuis le script et faire l'appel depuis celui-ci.

Code : Tout sélectionner

public GameObject wgManager; //à référencer depuis l'inspector
...
wgManager.GetComponent <...>;
Dans ma signature, tu trouveras un lien vers des cours sur la POO, je te conseille vivement d'aller y jeter un œil, tu m'as l'air de partir totalement à tâtons, il te faut les bases de programmation si tu veux comprendre ce que tu fais. Et par comprendre, je veux dire être sûr, pas en faire ton interprétation de ce qui se passe.
"Ce n'est pas en améliorant la bougie, que l'on a inventé l'ampoule, c'est en marchant longtemps."
Nétiquette du forum
Savoir faire une recherche
Apprendre la programmation

Scurreo
Messages : 21
Inscription : 01 Déc 2017 18:14

Re: Jouer une animation quand il attaque

Message par Scurreo » 11 Déc 2017 15:07

Oui en effet excuse moi je n'avais pas du tout remarqué que la console nous montrer cela.

D'accord je vois, en tout cas c'était bien ça. Pour ce qui est de la programmation je maîtrise les base en C# mais le fait d'en faire avec Unity comme ici je ne sais pas ce qui me fait ça mais je bloque énormément ça me parait différent et pourtant quand on réfléchi c'est pareil. Après en effet j'ai énormément à apprendre encore et faut pas le cacher

Avatar de l’utilisateur
boubouk50
ModoGenereux
ModoGenereux
Messages : 6186
Inscription : 28 Avr 2014 11:57
Localisation : Saint-Didier-en-Bresse (71)

Re: Jouer une animation quand il attaque

Message par boubouk50 » 11 Déc 2017 15:18

Les bases du C#, c'est une chose, les bases de la POO cela n'a rien à voir. la Programmation Orientée Objet n'est pas lié au C#, et pour Unity c'est primordial.
"Ce n'est pas en améliorant la bougie, que l'on a inventé l'ampoule, c'est en marchant longtemps."
Nétiquette du forum
Savoir faire une recherche
Apprendre la programmation

Scurreo
Messages : 21
Inscription : 01 Déc 2017 18:14

Re: Jouer une animation quand il attaque

Message par Scurreo » 11 Déc 2017 15:32

Oui tout à fait je comprends c'est bien pour ça que je dis être perdu, en tout cas merci je vais regarder tes liens

Répondre

Revenir vers « Scripting »