Accueil Forums J’ai besoin d’aide Unity3D Système de sélection avec un Raycast

Ce sujet a 6 réponses, 3 participants et a été mis à jour par  Dpg, il y a 2 mois.

7 sujets de 1 à 7 (sur un total de 7)
  • Auteur
    Messages
  • #1665

    Dpg
    Participant

    Bonjour, je cherche un faire une méthode pour la sélection d’un GameObject.
    Une sorte d’indication au joueur qu’il peut faire une action sur tel ou tel objet/emplacement. Comme dans les jeux de crafting.

    1ère fois que je tente cela donc je patauge un peu.

    Dans ma scène j’ai créée 4 planes de couleur gris (NonSelectionné), puis en enfant de chaque planes, un autre plane de couleur vert (Sélectionné).

    Puis j’ai créé un script de sélection :

    GameObject ObjetSelect;

    void Update()
    {
    PlayerLookAt ();
    }
    public void PlayerLookAt()
    {
    Ray rayon = new Ray (Camera.main.transform.position, Camera.main.transform.forward);
    RaycastHit touche;

    if (Physics.Raycast (rayon, out touche, rangeLook)) {
    if (touche.transform.gameObject.tag == “Selection”) {
    ObjetSelect = touche.transform.gameObject;
    ObjetSelect.SetActive (false);
    }
    }
    }

    Mon rayon touche bien les planes gris(taggé “Selection”), mais j’ai deux problèmes.

    – Premièrement il faut que lorsque le rayon ne touche plus l’objet, celui ci doit se réactivé. (jamais fait avec le Ray encore donc je n’y arrive pas.)
    J’ai tenté avec un “else{}” mais vu que la méthode est lancé dans l’Update pour le moment, ca créé des bugs.

    – Deuxièmement après que j’ai affecté l’objet touché à un GameObjet dédier au RaycasHit, j’aimerai accéder à son enfant. Pour activé l’objet enfant (vert).
    Mais je n’arrive pas accéder a son enfant..

    Je ne sais pas si déjà la méthode que j’empreinte est la bonne. Pas trouvé de tuto similaire à mon système.

    J’attends vos retours, dpg.

    • Ce sujet a été modifié le il y a 2 mois et 1 semaine par  Dpg.
    #1667

    Carotte
    Participant

    Bonjour,

    J’avais eu un problème similaire au tien il y a quelques temps, mon but était d’interagir avec des objets grâce a un rayon.
    Pour ce faire, j’ai utilisé 2 scripts:
    – le 1er script est le rayon, sur la camera, qui detecte les objets
    – le 2eme script est un script que tu place sur tous les objets aupres desquels tu veux interagir.

    Le but est simple, lorsque que le rayon(1er script) rencontre un objet avec un tag “interaction”, tu recupere le 2eme script placé sur ton objet, et a partir de ce script, tu en active une troisieme( egalement placé sur ton objet) qui permet de lancer différentes fonctions…
    Et pour détecter si tu vises plus l’objet, tu fait un système de : GameObject ancienObjet;. Et quand ton hit va détecter un nouvel objet, tu désactives ton ancien objet grâce au 2eme script et tu remplaces l’ancien objet par le nouveau.

    J’espère que cela peut t’aider. Bonne continuation pour ton projet.

    #1668

    MasterX
    Participant

    Bonjour,

    j’aimerai accéder à son enfant. Pour activé l’objet enfant (vert).
    Mais je n’arrive pas accéder a son enfant..

    par exemple ceci: Transform.GetChild

    #1669

    Dpg
    Participant

    Bonjour, bon j’ai trouvé mon problème.

    Merci Carotte, j’ai donc créée une fonction directement sur les objets concernés et tout fonctionne.

    Merci MaterX, je ne pense jamais à rechercher les objets par leur Transform, toujours avec GameObject..
    C’est une erreur de ma part. merci à vous.

    #1670

    Dpg
    Participant

    Je rencontre un nouveau soucis…

    Voici ma nouvelle fonction: (je n’ai pas encore réalisé la fonction pour sélectionner l’élément)
    if (Physics.Raycast (rayon, out touche, rangeLook))
    {
    if (touche.transform.gameObject.tag == “Selection”)
    {
    //Debug.Log (“Touche la selection!”);
    HitSelect = touche.transform.gameObject;
    HitSelect.GetComponent<SystemSelect> ().VisualSelect (); //Permet d’activer le 1er Plane (gris)
    }
    else
    {
    HitSelect.GetComponent<SystemSelect> ().NoVisualSelect (); //Permet de désactiver le 1er Plane (gris)
    HitSelect = null;
    }
    }

    Le script fonctionne bien, l’objet s’active et se désactive.
    Problème si le rayon touche un autre élément du décors (même non tagé), la console me rapporte une erreur.
    Je pense que le problème viens de mon else..

    Avez vous une réponse à ce problème?

    #1675

    Carotte
    Participant

    C’est quoi comme erreur et a quelle ligne exactement ?

    #1691

    Dpg
    Participant

    Voici l’erreur recontrée :

    NullReferenceException: Object reference not set to an instance of an object
    PlayerInput.PlayerLookAt () (at Assets/Fps_Player/Scripts_Player/Player/PlayerInput.cs:49)
    PlayerInput.Update () (at Assets/Fps_Player/Scripts_Player/Player/PlayerInput.cs:29)

    Et là se sont les deux méthodes utilisée dans le script plus haut:
    public void VisualSelect ()
    {
    select1.SetActive (true);
    select2.SetActive (false);
    }

    public void NoVisualSelect ()
    {
    select1.SetActive (false);
    select2.SetActive (false);
    }

    Pourtant j’utilise deux objets prédéfini donc le script ne devrait pas affecté les autres objets de la scène..
    D’ailleurs l’erreur s’active sur tout les objets que je regarde.

    Je me demande si je devrait utiliser une type “bool”, pour éviter certain soucis.

    • Cette réponse a été modifiée le il y a 2 mois par  Dpg.
7 sujets de 1 à 7 (sur un total de 7)

Vous devez être connecté pour répondre à ce sujet.