Unity 5

Ligne de vue raycasting

Le problème exposé dans ce sujet a été résolu.

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.

+1 -0

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…

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;
          }
      } 
  }
}

+1 -0

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 ?

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.

Connectez-vous pour pouvoir poster un message.
Connexion

Pas encore membre ?

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