Unity 5

Ligne de vue raycasting

L'auteur de ce sujet a trouvé une solution à son problème.
Auteur du sujet

Bonsoir à tous,

J'ai un script avec des caméras de surveillances, qui fonctionne parfaitement tant que je n'ai qu'une seule caméra. Si je duplique le préfab de la caméra avec le script, j'ai un problème (du à de l'inexpérience et pas à un véritable bug, je sais d'où il vient).

En effet, j'ai dupliqué ma caméra, et l'alarme ne s'active que sur la première caméra, pas sur les dupliquées. J'utilise un prefab avec le même script, j'ai vérifié les variables sont les mêmes, mais je vois pas comment lui dire que le script doit fonctionner indépendamment sur chaque caméra ?

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
using UnityEngine;
using System.Collections;

public class Guard : MonoBehaviour {

    public Transform sightStart, sightEnd;

    public bool spotted = false;
    public bool facingLeft = true;

    public GameObject arrow;


    void Start()
    {
        InvokeRepeating ("Patrol", 0f, Random.Range (3f,6f));
    }

    // Update is called once per frame
    void Update () {

        Raycasting ();
        Behaviours ();

    }

    void Raycasting()
    {
        Debug.DrawLine (sightStart.position, sightEnd.position, Color.green);
        spotted = Physics2D.Linecast (sightStart.position, sightEnd.position, 1 << LayerMask.NameToLayer ("Player"));
    }

    void Behaviours()
    {
        if (spotted == true) 
        {
            arrow.SetActive(true);
            Alarm_Behaviours ();
        } 
        else 
        {
            arrow.SetActive(false);
            if (Enemy_Script.Speed < 0)
            {
                Enemy_Script.Speed = -2f;
            }
            else
            {
                Enemy_Script.Speed = 2f;
            }
        }
    }

    void Patrol()
    {
        facingLeft = !facingLeft;
        if (facingLeft == true) 
        {
            transform.eulerAngles = new Vector2 (0, 0);
        }
        else 
        {
            transform.eulerAngles = new Vector2 (0, 180);
        }
    }

    void Alarm_Behaviours()
    {
        if (spotted == true) 
        {
            if (Enemy_Script.Speed < 0)
            {
                Enemy_Script.Speed = -8f;
            }
            else
            {
                Enemy_Script.Speed = 8f;
            }
        } 
    }
}

Est ce que quelqu'un aurait une idée de ce qui pourrait causer ce petit problème ? Merci d'avance.

Édité par Coyote

+0 -0

quand tu dis j'ai vérifié les variables sont les mêmes, tu veux dire que les variables sightStart de chaque caméra correspondent au même Transform ? si c'est le cas, alors tu as ton problème.

+0 -0
Auteur du sujet

En fait chaque caméra me détecte, et la variable spotted prend bien true comme je le souhaite. Mais l'alarme qui se déclenche si spotted est activée elle ne se lance que pour le spotted de la caméra 1, comme si c'était différent entre les caméras, et c'est ça que je ne comprend pas…

+0 -0

y'aurait moyen d'avoir une scène de test qui reproduit le problème ? (plus simple si on peut tester directement) et aussi, tu parles d'une alarme qui se déclenche mais dans le script y'a aucune référence à du son.

+0 -0
Auteur du sujet

Oui bien sur, j'ai même était stupide de pas proposer le .rar plus tôt…

Lien Supprimé, sujet résolu.

L'alarme c'est pas un son, juste une modification de la variable Speed des ennemis. Le son je rajouterai plus tard :)

Édité par Dr@zielux

+0 -0

Cette réponse a aidé l'auteur du sujet

je viens de comprendre le problème, c'est très con quand on y pense. Toutes les caméras ont le même script, donc toutes les caméras remettent à 2 la vitesse des ennemis si elles ne détectent pas le joueur. Donc si une caméra détecte le joueur, la caméra d'après à être testée remettra la vitesse à 2 comme elle aura spotted à false d'où le fait que la seule caméra qui fonctionne est celle qui est testée en dernière.

edit: je viens de modifier vite fait le script pour gérer ça:

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
using UnityEngine;
using System.Collections;

public class Guard : MonoBehaviour {

  public Transform sightStart, sightEnd;

  public bool spotted = false;
  public bool facingLeft = true;
  private static Guard spottedCam = null;

  public GameObject arrow;


  void Start()
  {
      InvokeRepeating ("Patrol", 0f, Random.Range (3f,6f));
  }

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

  }

  void Raycasting()
  {
      Debug.DrawLine (sightStart.position, sightEnd.position, Color.green);
      spotted = Physics2D.Linecast (sightStart.position, sightEnd.position, 1 << LayerMask.NameToLayer ("Player"));
      if(spotted)
          spottedCam = this;
  }

  void Behaviours()
  {
      if (spotted == true) 
      {
          arrow.SetActive(true);
          Alarm_Behaviours ();
      } 
      else if(spottedCam == this)
      {
          arrow.SetActive(false);
          if (Enemy_Script.Speed < 0)
          {
              Enemy_Script.Speed = -2f;
          }
          else
          {
              Enemy_Script.Speed = 2f;
          }
          spottedCam = null;
      }
  }

  void Patrol()
  {
      facingLeft = !facingLeft;
      if (facingLeft == true) 
      {
          transform.eulerAngles = new Vector2 (0, 0);
      }
      else 
      {
          transform.eulerAngles = new Vector2 (0, 180);
      }
  }

  void Alarm_Behaviours()
  {
      if (spotted == true) 
      {
          if (Enemy_Script.Speed < 0)
          {
              Enemy_Script.Speed = -8f;
          }
          else
          {
              Enemy_Script.Speed = 8f;
          }
      } 
  }
}

Édité par minirop

+1 -0
Auteur du sujet

Effectivement, "si" on y pense. Je me rends compte que j'ai pas fait assez attention à ce genre de problème :(

Et du coup merci pour la modification du script, par contre pourrais tu m'expliquer ce qu'est la variable spottedCam, et la valeur this. C'est une sorte de true mais pour ce type de variable ?

+0 -0

Cette réponse a aidé l'auteur du sujet

this correspond au script en lui-même. spottedCam contient la caméra qui a détecté le joueur (null si le joueur n'est détecté par aucune), donc seulement ce script (donc lorsque spottedCam == this) peut remettre à 2 la vitesse des ennemis.

+1 -0
Vous devez être connecté pour pouvoir poster un message.
Connexion

Pas encore inscrit ?

Créez un compte en une minute pour profiter pleinement de toutes les fonctionnalités de Zeste de Savoir. Ici, tout est gratuit et sans publicité.
Créer un compte