Detection d'un objet et le faire apparaître

Pour les scripts écrits en C#
Règles du forum
Merci de respecter la NOMENCLATURE suivante pour vos TITRES de messages :

Commencez par le niveau de vos scripts
DB = Débutant
MY = Moyen
CF = Confirmé

Puis le domaine d'application
-RS = Réseau
-AL = Algorithmie

Exemple :

[DB-RS] Mouvement perso multijoueur
Seluj
Messages : 3
Inscription : 23 Nov 2015 15:16

Detection d'un objet et le faire apparaître

Message par Seluj » 23 Nov 2015 16:29

Bonjour à tous,
Tout d'abord je tiens à remercier les créateurs et administrateurs et toutes les personnes qui font qu’ Unity3d-france existe car j'ai trouvé de nombreuses solutions à mes soucis ici :super:
Mais cette fois-ci je n'ai rien trouvé :pleur4: : j'aimerais savoir comment détecter un objet et le faire apparaître si celui-ci est "visible" de mon joueur.
J'ai déjà quelque piste: je pense créer un "laser" depuis mon joueur et si celui-ci rencontre l'objet en question alors il apparaît.
Le problème c'est que je n'y arrive pas, j'ai fouillé les forums, tester 2 ou 3 solutions (j'arrive à créer mon laser (raycast)) mais impossible de m'en servir. :-|
Je tiens à préciser que je réalise un projet 2D, en vue de dessus, et que le laser ne doit pas être visible (sauf en debug bien sûr).

Merci de vos réponses.
Seluj.

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

Re: Detection d'un objet et le faire apparaître

Message par boubouk50 » 23 Nov 2015 16:45

Salut Seluj,

Alors déjà, qu'entends-tu par objet invisible? Désactivé ou bien le MeshRender est désactivé?
Lorsque un GameObject est désactivé, ses Components le sont aussi, donc tu ne peux pas les activés par le Raycast au contraire d'un MeshRender désactivé.
Aussi, tu peux aller farfouiller du coté du culling et de la distance de culling des layers. Les objets contenus dans un layer peuvent apparaître à partir d'une certaine distance.
"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

Avatar de l’utilisateur
MasterNovice
Messages : 610
Inscription : 23 Juil 2011 16:03

Re: Detection d'un objet et le faire apparaître

Message par MasterNovice » 23 Nov 2015 17:00

Salut,
(j'arrive à créer mon laser (raycast)) mais impossible de m'en servir
Qu'entends tu par : ne pas y arriver ? Ca ne marche pas ? Tu as des erreurs ? As-tu bien mis un collider sur l'objet ?
http://docs.unity3d.com/ScriptReference ... ycast.html
http://docs.unity3d.com/ScriptReference ... derer.html

Regarde ce code :

Code : Tout sélectionner

   
         Ray ray = cam.ScreenPointToRay(Input.mousePosition); // Remplacer par l'objet et la direction
         RaycastHit hit;
         
         if (Physics.Raycast(ray, out hit, 100)){ // 100 c'est la distance tu peux changer
            		 Debug.DrawLine(ray.origin, hit.point);
            		 hit.transform.gameObject.GetComponent(SpriteRenderer).enabled = true ; // SpriteRenderer  ou le Renderer que tu utilise.
        	   }
Merci boubouk, je viens d'apprendre un truc sur le culling des layers, je ne connaissais pas. Je vais aller regarder, si chaque élément du layer s'affiche indépendamment des autres, c'est super pratique et je vais devoir revoir certaines parties de mes optimisations.

Seluj
Messages : 3
Inscription : 23 Nov 2015 15:16

Re: Detection d'un objet et le faire apparaître

Message par Seluj » 23 Nov 2015 17:17

Merci pour vos réponses,

Par invisible j'entends que la texture n'apparait pas, étant un jeu 2D, je pensais jouer sur les calques mais je vais regarder aussi le culling et MeshRender (j'apprendrais surement des choses)

Pour le laser, j'ai regardé un tuto vidéo qui permet de créer un laser 2D, mais dès que je déplace mon personnage un peu trop, le laser part vers les coordonnées 0.0.0. Le personnage et l'obstacle ont bien un collider (BoxCollider)
Voilà le script:

Code : Tout sélectionner

using UnityEngine;
using System.Collections;

public class Laser : MonoBehaviour
{
    private LineRenderer lineRenderer;
    public Transform laserHit;
    void Start()
    {
        lineRenderer = GetComponent<LineRenderer>();
        lineRenderer.enabled = true;
        lineRenderer.useWorldSpace = true;
    }
    void Update()
    {
        RaycastHit2D hit = Physics2D.Raycast (transform.position, transform.up);
        Debug.DrawLine (transform.position, hit.point);
        laserHit.position = hit.point;
        lineRenderer.SetPosition (0, transform.position);
        lineRenderer.SetPosition (1, laserHit.position);

    }
}

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

Re: Detection d'un objet et le faire apparaître

Message par boubouk50 » 23 Nov 2015 18:35

Seluj a écrit :Je tiens à préciser que je réalise un projet 2D
Comme d'hab, mes yeux ne voient absolument pas le mot 2D... Evidemment, pour les layers, je pensais 3D... LayerCullingDistances
"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

Seluj
Messages : 3
Inscription : 23 Nov 2015 15:16

Re: Detection d'un objet et le faire apparaître

Message par Seluj » 24 Nov 2015 16:46

Au final j'ai réussi a faire ce que je voulais:

Code : Tout sélectionner

using UnityEngine;
using System.Collections;

public class RaycastDetection : MonoBehaviour
{

    // Variables
    public Transform sightStart, sightEnd;
    public bool spotted = false;
    private SpriteRenderer spriteRendererTarget;
    public GameObject[] redfor;
    
    // Use this for initialization
    void Strat()
    {
    }

    // Update is called once per frame
    void Update()
    {
        Raycasting();
    }

    //Function for raycast
    void Raycasting()
    {

        Debug.DrawLine(sightStart.position, sightEnd.position, Color.green);
        RaycastHit2D spotted = Physics2D.Linecast(sightStart.position, sightEnd.position); //ignorRaycast: 1 << LayerMask.NameToLayer("T")

        if (spotted == true)
        {
            //Debug - show collider hit by raycast
            //print(spotted.collider.transform.tag);

            //ColorSetup
            if (spotted.collider.transform.tag == "Enemy")
            {
                //spriteRendererTarget = GetComponent<SpriteRenderer>();
                //spriteRendererTarget = new Color(1f, 1f, 1f, 0f);
                spotted.collider.transform.GetComponent<SpriteRenderer>().color = new Color(1f, 1f, 1f, 1f);
            }
            else
            {
                redfor = GameObject.FindGameObjectsWithTag("Enemy");
                foreach (GameObject Enemy in redfor)
                {
                    Enemy.transform.GetComponent<SpriteRenderer>().color = new Color(1f, 1f, 1f, 0f);
                }
            }
        }
        else
        {
            redfor = GameObject.FindGameObjectsWithTag("Enemy");
            foreach (GameObject Enemy in redfor)
            {
                Enemy.transform.GetComponent<SpriteRenderer>().color = new Color(1f, 1f, 1f, 0f);
            }
        }
    }
}
Je pense qu'il y a plus simple mais cette solution fonctionne donc je vais la gardée. Merci pour les réponses. :super:

Répondre

Revenir vers « (C#) CSharp »