Se connecter

Informatique

Création de Jeux

Sujet : J'aide les gens dans Unity
LarryLuckMan
Niveau 5
02 juin 2018 à 11:00:46

Effectivement, merci de ta réponse qu'est ce que je suis con... :hap:
Dernier truc, comment faire pour que mon objet clignote lorsque je passe la souris dessus (apparaissent disparaissent truc tout con sans faire d'animation quoi)

TheRealMarco
Niveau 10
02 juin 2018 à 11:13:03

Le 02 juin 2018 à 11:00:46 LarryLuckMan a écrit :
Effectivement, merci de ta réponse qu'est ce que je suis con... :hap:
Dernier truc, comment faire pour que mon objet clignote lorsque je passe la souris dessus (apparaissent disparaissent truc tout con sans faire d'animation quoi)

L'objet a un shader avec une variable "Tint" ? (ou n'importe quelle couleur qu'on peut changer)

LarryLuckMan
Niveau 5
02 juin 2018 à 20:52:29

Non je n'ai pas mis de shaders encore il faut que je fasse ça ?

TheRealMarco
Niveau 10
02 juin 2018 à 21:01:45

Le 02 juin 2018 à 20:52:29 LarryLuckMan a écrit :
Non je n'ai pas mis de shaders encore il faut que je fasse ça ?

Je pense que le mieux pour faire l'effet qui clignote, c'est avec un shader, donc oui. :noel:

LarryLuckMan
Niveau 5
02 juin 2018 à 21:11:45

Après c'est juste une icone y a pas un script tout bete qui la fait apparatire/disparaitre toutes les 1 secondes lorsque je passe ma souris dessus ?

TheRealMarco
Niveau 10
02 juin 2018 à 22:26:38

Le 02 juin 2018 à 21:11:45 LarryLuckMan a écrit :
Après c'est juste une icone y a pas un script tout bete qui la fait apparatire/disparaitre toutes les 1 secondes lorsque je passe ma souris dessus ?

Ah, je pensais que c'était le modèle 3d que tu voulais faire clignoter. :noel:

Si tu veux juste le faire disparaitre, tu peux activer/désactiver le composant qui permet de l'afficher (Sprite Renderer ou Image j'imagine).

GetComponent<SpriteRenderer>().enabled = false;

Si tu veux le faire disparaitre progressivement, tu dois utiliser la variable Color du composant.

Pseudo supprimé
Niveau 10
03 juin 2018 à 15:34:19

yo tout le monde,
j'ai un nouveau problème depuis hier: les raycasts que je fais ne marchent pas vraiment. Si c'est en mode Collision ça ne marche pas du tout, et en Trigger ils ne s'activent que dans certains angles. En voilà un exemple: le code d'un objet assez simple que j'ai fait, qui est sensé s'activer en électrifiant l'air autour de lui lors du passage du joueur.

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

public class DéchargeEnergie : MonoBehaviour {

    public Transform Player;
    public Transform Centre;
    public float End = 3;
    public float Charge = 2;
    public float Durée = 3;
    public float Recharge = 2;

    // Use this for initialization
    void Start () {
        gameObject.GetComponent<CircleCollider2D>().enabled = false;
	}
	
	// Update is called once per frame
	void Update () {
        Vector2 player = new Vector2(Player.position.x + 36/2, Player.position.y + 24/3);
        Vector2 center = new Vector2(Centre.position.x, Centre.position.y);
        RaycastHit2D hit = Physics2D.Raycast(center, player, End);
        Debug.DrawRay(center, player, Color.blue);
        if (hit.collider.isTrigger == Player)
        {
            Debug.Log("Touché");
            StartCoroutine(Decharger());
        }

    }

    IEnumerator Decharger()
    {
        yield return new WaitForSeconds(Charge);
        gameObject.GetComponent<CircleCollider2D>().enabled = true;
        yield return new WaitForSeconds(Durée);
        gameObject.GetComponent<CircleCollider2D>().enabled = false;
        yield return new WaitForSeconds(Recharge);
        StopCoroutine(Decharger());
    }
}

Tout d'abord le raycast partait dans une autre direction que celle du joueur, donc j'ai rajouté un Offset à sa direction. Ensuite le code semble contenir une erreur à la ligne RaycastHit2D hit = Physics2D.Raycast(center, player, End); (object reference not set to an instance of an object), et ne détecte le joueur que s'il se trouve à sa gauche :hap:
Bien sûr ça présente les mêmes problèmes pour les autres codes contenant des raycasts donc c'est assez handicapant

Je débute un peu donc si quelqu'un a une idée de ce que je pourrais faire ça m'intéresse :ok:

TheRealMarco
Niveau 10
03 juin 2018 à 15:40:39

(object reference not set to an instance of an object)

Ça signifie qu'une des trois variables n'a pas de valeur. Peut-être tu as oublié dans lInspector de donné le GameObject à la variable Player ou Centre.

Pseudo supprimé
Niveau 10
03 juin 2018 à 15:47:00

Le 03 juin 2018 à 15:40:39 TheRealMarco a écrit :

(object reference not set to an instance of an object)

Ça signifie qu'une des trois variables n'a pas de valeur. Peut-être tu as oublié dans lInspector de donné le GameObject à la variable Player ou Centre.

Pourtant non, les deux sont assignées, le centre à un empty object placé au centre du parent (j'ai aussi essayé en transform.position sans le Centre), et player à mon joueur... :-( C'est possible que ce soit End (float) qui pose problème ?

Pseudo supprimé
Niveau 10
03 juin 2018 à 18:03:50

bon alors maintenant c'est if (hit.collider.isTrigger == Player) qui reçoit le "object reference not set to an instance of an object", et vu que j'ai défini hit comme raycast, ainsi que défini et assigné la variable player, le problème vient de isTrigger... QQun a une idée de la façon dont je pourrai régler le problème svp ? :(

Liven28
Niveau 5
03 juin 2018 à 18:24:40

Le 03 juin 2018 à 18:03:50 vv13 a écrit :
bon alors maintenant c'est if (hit.collider.isTrigger == Player) qui reçoit le "object reference not set to an instance of an object", et vu que j'ai défini hit comme raycast, ainsi que défini et assigné la variable player, le problème vient de isTrigger... QQun a une idée de la façon dont je pourrai régler le problème svp ? :(

J'ai l'impression qur t'essay de comparer un boolean (istrigger) à un transform (Player).
Si ton but c'est de déterminer si c'est bien le player qui est touché, un truc comme ça devrait mieux fonctionner

if (hit.collider.gameObject.transform == Player)

par contre je sais pas comment t'arrive à lancer l'excecution avec se type d'erreur, ça devrait t'indiquer une erreur à corriger avant même de pouvoir lancer le playmode. A moins que tu ais désactivé un truc et à ce moment je doute que ce soit une bonne idée

Désoler, je débarque un peut et n'ai pas suivi toute la discussion depuis le début donc je suis peut être complètement à coté de la plaque et j'ai pas test ma solution non plus, je ne garanti pas le placement des majuscules, mais l'idée est là.

Pseudo supprimé
Niveau 10
03 juin 2018 à 18:34:44

Le 03 juin 2018 à 18:24:40 Liven28 a écrit :

Le 03 juin 2018 à 18:03:50 vv13 a écrit :
bon alors maintenant c'est if (hit.collider.isTrigger == Player) qui reçoit le "object reference not set to an instance of an object", et vu que j'ai défini hit comme raycast, ainsi que défini et assigné la variable player, le problème vient de isTrigger... QQun a une idée de la façon dont je pourrai régler le problème svp ? :(

J'ai l'impression qur t'essay de comparer un boolean (istrigger) à un transform (Player).
Si ton but c'est de déterminer si c'est bien le player qui est touché, un truc comme ça devrait mieux fonctionner

if (hit.collider.gameObject.transform == Player)

par contre je sais pas comment t'arrive à lancer l'excecution avec se type d'erreur, ça devrait t'indiquer une erreur à corriger avant même de pouvoir lancer le playmode. A moins que tu ais désactivé un truc et à ce moment je doute que ce soit une bonne idée

Désoler, je débarque un peut et n'ai pas suivi toute la discussion depuis le début donc je suis peut être complètement à coté de la plaque et j'ai pas test ma solution non plus, je ne garanti pas le placement des majuscules, mais l'idée est là.

Maintenant ça marche, ce qui est déjà un grand pas en avant, merci ! :ok:
Toutefois l'erreur persiste sur la même ligne, même avec ta proposition :(

TheRealMarco
Niveau 10
03 juin 2018 à 18:48:32

Dans la doc, ils vérifient que le collider est différent de nul : https://docs.unity3d.com/ScriptReference/Physics2D.Raycast.html
if (hit.collider != null)

je te conseil de le vérifier avant de vérifier que c'est le même GameObject. :ok:

Pseudo supprimé
Niveau 10
03 juin 2018 à 21:50:10

Le 03 juin 2018 à 18:48:32 TheRealMarco a écrit :
Dans la doc, ils vérifient que le collider est différent de nul : https://docs.unity3d.com/ScriptReference/Physics2D.Raycast.html
if (hit.collider != null)

je te conseil de le vérifier avant de vérifier que c'est le même GameObject. :ok:

ça a marché, merci beaucoup :ok:

TheRealMarco
Niveau 10
04 juin 2018 à 23:01:28

Le 04 juin 2018 à 19:00:34 LarryLuckMan a écrit :
Salut c'est encore moi le galérien d'Unity 3D :hap:
Cette fois je rencontre un problème au niveau de l'animation, je veut que l'anim se lance et se joue en boucle lorsque je passe mon curseur sur l'objet, sauf que ba l'anim se lance des que je lance le jeux et des que je passe mon curseur sur l'objet la scene se met sur pause :hap:

Merci de votre aide

Dur de répondre sans voir ton code et ton animatorController. :ok:

Dans ton anim controller, tu dois créer un etat "tampon", qui est inutile. Quand tu lances l'appli, tu vas dans l'etat tampon, et quand tu bouges la souris sur l'objet, tu délenches un trigger qui lance la vraie anim.

TheRealMarco
Niveau 10
05 juin 2018 à 11:47:50

Le 05 juin 2018 à 08:39:55 LarryLuckMan a écrit :
D'accord mais c'est quoi un état tampon ?

C'est un nom que je donne comme ça. Tu fais juste une animation vide.

Pour les animations j'ai toujours utilisé l'AnimatorController.

L'erreur ça veut dire qu'il ne trouve pas une animation avec ce nom.

Pseudo supprimé
Niveau 10
05 juin 2018 à 19:06:03

Le 05 juin 2018 à 14:35:26 LarryLuckMan a écrit :
Ok je vois, tu n'aurais pas un tuto FR qui explique l'animator controller stp car la je comprends rien d'habitudes je faisais mes anims sur C4D ça se passé bien et la juste un objet qui va en arrière je galère comme pas possible :hap:

En FR je sais pas, mais tu peux essayer de mettre les sous titres en français sur le tutoriel officiel de unity si vraiment l'anglais te pose un problème :ok:

Par ailleurs je suis vraiment désolé les gars mais j'ai un nouveau problème, encore une fois tout con j'imagine :hap:
J'essaye de faire un code pour que l'objet auquel il est assigné envoie un Raycast à la verticale qui, si il est trigger par le joueur, fait déplacer l'objet pour "écraser" le joueur, puis revenir à sa place principale (comme https://www.noelshack.com/2018-23-2-1528217849-thwomp-nsmbu.png par exemple). J'ai concocté un petit code (posté ci dessous) qui devrait marcher, pourtant l'objet descend instantanément, et pas toujours jusqu'à sa cible. Dans tous les cas il reste bloqué en l'air, avant de remonter (voire pendant la descente)...
Une idée d'où ça peut venir stp ? Le code est pourtant pas bien compliqué :( Peut etre les commandes MoveTowards ou MovePosition, que j'ai mal utilisé ? :(

Le code:

public class FallingObject : MonoBehaviour
{
    //temps d'attente
    public float AttenteHaut = 1;
    public float AttenteBas = 1;
    public float Réinitialisation;
    //vitesse
    public float SpeedAller;
    public float SpeedRetour;
    
    public Transform Position;
    public Transform Target;
    public Transform Player;
    public float OffsetX = 0;
    public float OffsetY = 0;
    public float End = 5;
    public float Radius = 2;


    IEnumerator HammerFall()
    {
        yield return new WaitForSeconds(AttenteHaut);

        Vector3 Aller = Vector3.MoveTowards(Position.position, Target.position, SpeedAller * Time.deltaTime);
        Vector3 Retour = Vector3.MoveTowards(Target.position, Position.position, SpeedRetour * Time.deltaTime);

        GetComponent<Rigidbody2D>().MovePosition(Aller);
        yield return new WaitForSeconds(AttenteBas);
        GetComponent<Rigidbody2D>().MovePosition(Retour);
        yield return new WaitForSeconds(Réinitialisation);
        StopCoroutine(HammerFall());
    }

    void Update()
    {
        {
            Vector2 target = new Vector2(Target.position.x + OffsetX, Target.position.y + OffsetY);
            RaycastHit2D hit = Physics2D.CircleCast(transform.position, Radius, target, End);
            Debug.DrawRay(transform.position, target, Color.green);
            if (hit.collider != null)
            {
                if (hit.collider.gameObject.transform == Player)
                {
                    StartCoroutine(HammerFall());
                }
            }
        }
    }
}

EDIT: j'ai mis plein de variables pour pouvoir controler chaque composante du mouvement donc ça peut sembler un peu confus :hap:

TheRealMarco
Niveau 10
05 juin 2018 à 19:28:34

Le 05 juin 2018 à 14:35:26 LarryLuckMan a écrit :
Ok je vois, tu n'aurais pas un tuto FR qui explique l'animator controller stp car la je comprends rien d'habitudes je faisais mes anims sur C4D ça se passé bien et la juste un objet qui va en arrière je galère comme pas possible :hap:

Aucune qui me vient en tête.

void Update()
    {
        {
            Vector2 target = new Vector2(Target.position.x + OffsetX, Target.position.y + OffsetY);
            RaycastHit2D hit = Physics2D.CircleCast(transform.position, Radius, target, End);
            Debug.DrawRay(transform.position, target, Color.green);
            if (hit.collider != null)
            {
                if (hit.collider.gameObject.transform == Player)
                {
                    StartCoroutine(HammerFall());
                }
            }
        }
    }

1. La fonction HammerFall va être appelé toutes les frames où le player est dans la zone. Il va y avoir plusieurs coroutines qui vont essayer de la déplacer en même temps.

2. MoveTowards ça te retourne une seule position. qui est un décalage d'une seule frame, si je comprends bien. Tu veux utilisé cette unique position comme étant l'intégralité du mouvement, c'est bizarre.

A ta place, je créerai une variable de classe booléenne, que j'activerai quand "l'animation" se lance et false quand elle s'arrête. Avant de lancer une animation, je vérifierai que ce booléen n'est pas true.
Essaie déjà de faire une animation qui descend avant de vouloir faire les deux, sinon c'est dur de trouver où est ton erreur (j'ai jamais utilisé MoveTowards et MovePosition, mais j'ai l'impression que tu utilises mal le premier (et donc le deuxième vu que tu l'utilises avec le résultat du premier).

Pseudo supprimé
Niveau 10
05 juin 2018 à 19:47:37

Je vais tester ça je te remercie

Pseudo supprimé
Niveau 10
05 juin 2018 à 22:00:29
{
    //temps d'attente
    public float AttenteHaut = 1;
    public float AttenteBas = 1;
    public float Réinitialisation;
    //vitesse
    public float SpeedAller;
    public float SpeedRetour;
    
    public Transform Position;
    public Transform Target;
    public Transform Player;
    public float OffsetX = 0;
    public float OffsetY = 0;
    public float End = 5;
    public float Radius = 2;
    public bool AttackMode;

    private void Start()
    {
        AttackMode = false;
    }

    IEnumerator HammerFall()
    {
        AttackMode = true;
        Vector3 Aller = Vector3.MoveTowards(Position.position, Target.position, SpeedAller * Time.deltaTime);
        Vector3 Retour = Vector3.MoveTowards(Target.position, Position.position, SpeedRetour * Time.deltaTime);
        yield return new WaitForSeconds(AttenteHaut);
        GetComponent<Rigidbody2D>().MovePosition(Aller);
        yield return new WaitForSeconds(AttenteBas);
        GetComponent<Rigidbody2D>().MovePosition(Retour);
        yield return new WaitForSeconds(Réinitialisation);
        AttackMode = false;
        StopCoroutine(HammerFall());
    }


    void Update()
    {
        {
            Vector2 target = new Vector2(Target.position.x + OffsetX, Target.position.y + OffsetY);
            RaycastHit2D hit = Physics2D.CircleCast(transform.position, Radius, target, End);
            Debug.DrawRay(transform.position, target, Color.green);
            if (hit.collider != null)
            {
                if (hit.collider.gameObject.transform == Player & AttackMode == false)
                {
                    StartCoroutine(HammerFall());
                }
            }
        }
    }
}

Alors j'ai bien fait la boolean pour l'animation, donc en effet la Coroutine se lance une seule fois :ok:
Toutefois j'ai regardé sur d'autres scripts de mouvements ennemis que j'ai (recopié / largement inspiré de certains trouvés sur le net vu que je débute :hap: ), et ils comportent tous MoveTowards que j'ai utilisé de la même manière, et eux marchent :( Vu que tu utilises pas MoveTowards tu prendrais quoi toi ? Apprendre une nouvelle méthode ça pzut m'intéresser :ok:

Sujet : J'aide les gens dans Unity
   Retour haut de page
Consulter la version web de cette page