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
Mais cette fois-ci je n'ai rien trouvé : 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.
Detection d'un objet et le faire apparaître
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
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
- boubouk50
- 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
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.
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
Nétiquette du forum
Savoir faire une recherche
Apprendre la programmation
- MasterNovice
- Messages : 610
- Inscription : 23 Juil 2011 16:03
Re: Detection d'un objet et le faire apparaître
Salut,
http://docs.unity3d.com/ScriptReference ... ycast.html
http://docs.unity3d.com/ScriptReference ... derer.html
Regarde ce code :
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.
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 ?(j'arrive à créer mon laser (raycast)) mais impossible de m'en servir
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.
}
Re: Detection d'un objet et le faire apparaître
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:
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);
}
}
- boubouk50
- 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
Comme d'hab, mes yeux ne voient absolument pas le mot 2D... Evidemment, pour les layers, je pensais 3D... LayerCullingDistancesSeluj a écrit :Je tiens à préciser que je réalise un projet 2D
"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
Nétiquette du forum
Savoir faire une recherche
Apprendre la programmation
Re: Detection d'un objet et le faire apparaître
Au final j'ai réussi a faire ce que je voulais:
Je pense qu'il y a plus simple mais cette solution fonctionne donc je vais la gardée. Merci pour les réponses.
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);
}
}
}
}