2015-12-09 1 views
2

J'ai écrit un script qui fait apparaître l'ennemi derrière le joueur, avec 1 chance sur 5 toutes les 3 minutes, j'ai changé le 1 sur 5 en 1 sur 1 chance de tester, mais je ne sais pas si cela fonctionne.L'ennemi apparaît derrière la chance du joueur 1 sur 5

Je sais comment placer l'ennemi derrière le joueur mais pas avec une chance de 1 sur 5.

Je l'ai essayé avec un nombre aléatoire entre 1 et 5. Et que si le nombre aléatoire est égal à 1 il doit engendrer l'ennemi et pas.

Voici le code:

using UnityEngine; 
using System.Collections; 
public class MainEnemy : MonoBehaviour 
{ 
    public GameObject Main; 
    public GameObject Holder; 
    public Transform player; 
    public Transform FPSController; 
    bool wantPosition; 
    bool appear; 
    float timer; 
    Vector3 temp; 
    // Use this for initialization 

    void Start() 
    { 
     wantPosition = true; 
     appear = false; 
     temp = new Vector3(0, 0, 0); 
     timer = 20;// 180; 
    } 

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

    Vector3 GetPosition() 
    { 
     Debug.Log("Hij doet het getposition"); 
     float px = player.transform.position.x; 
     float pz = player.transform.position.z; 
     // 
     float angle2 = Mathf.Cos(Camera.main.transform.eulerAngles.y) + 180; 
     // 
     float distance = 20; 
     float distancex = Mathf.Cos(angle2 + 180) * distance; 
     float distancez = Mathf.Sin(angle2 + 180) * distance; 
     // Tell distanceen bij coordinaten op 
     temp = new Vector3(distancex, -3, distancez); 
     return temp; 
    } 

    void SetFalse() 
    { 
     if (timer < 1) 
     { 
      timer = 10;// 180; // na 3 minuten weer kijken of hij hem laat zien 
     } 
     Main.SetActive(false); 
    } 

    void Position() 
    { 
     if (wantPosition) 
     { 
      temp = GetPosition(); 
      Holder.transform.position = player.position + temp; 
      Main.SetActive(true); 
      if (timer < 0) 
      { 
       timer = 10; // kort zichtbaar 
      } 
      wantPosition = false; 
     } 
    } 

    bool Appeared() 
    { 
     bool appear = false; 
     int rand = Random.Range(1, 1); 
     if (rand == 1) 
     { 
      appear = true; 
     } 
     else 
     { 
      appear = false; 
     } 
     return appear; 
    } 

    void Appear() 
    { 
     bool appear = false; 
     if (timer <= 0) 
     { 
      appear = Appeared(); 
     } 
     else 
     { 
      timer -= Time.deltaTime; 
      if (timer < 10) 
      { 
       Debug.Log(timer); 
      } 
     } 
     if (appear == true) 
     { 
      Position(); 
     } 
     else 
     { 
      SetFalse(); 
     } 
    } 
} 
+0

De quoi vous inquiétez-vous exactement? Génération aléatoire int?Serait plus facile de faire une petite application de console où vous générez des ints aléatoires juste pour voir si cela fonctionne comme prévu. –

Répondre

0

** EDIT Mise à jour pour UnityEngine

Changer votre méthode bool Appeared à:

bool Appeared() 
{ 
    bool appear = false; 
    int rand = Random.Range(1,6) 
    if (rand == 1) 
    { 
     appear = true; 
    } // else not needed 
    return appear; 
} 
+0

il utilise UnityEngine, son contient son propre aléatoire – AntiHeadshot

0

Un moyen facile et performant pour obtenir 1/5 la chance dans Unity3D est

if(Random.value < 1f/5f) 
    //do something 

Random.value renvoie un flotteur 0 <= value <= 1

+0

'Random.Range (int, int)' renvoie un int. –

+0

@RichardIrons vous avez raison, doit avoir négligé cela. – AntiHeadshot

5

Tout d'abord savoir que Random.Range retourne un nombre qui est supérieur ou égal à min, mais moins de (mais pas égal à)max. Si le cas spécial où min == max, alors cette valeur sera retournée.

Deuxièmement, votre fonction Appeared est un peu bavarde. En supposant que nous le remettre à une 1 chance sur 5, vous auriez ceci:

bool Appeared() 
{ 
    bool appear = false; 
    int rand = Random.Range(1, 6); 
    if (rand == 1) 
    { 
     appear = true; 
    } 
    else 
    { 
     appear = false; 
    } 
    return appear; 
} 

permettez-moi tout d'abord de souligner que disant:

if(x) 
    y = true 
else 
    y = false 

où x est une condition booléenne, est exactement la même en disant

y = x 

vous auriez peut-être changer à:

bool Appeared() 
{ 
    bool appear = false; 
    int rand = Random.Range(1, 6); 
    appear = rand == 1; 
    return appear; 
} 

Maintenant, regardez, pourquoi prendre la peine de régler appear sur false au début? Cette valeur n'est jamais utilisée. Peut-être ceci:

bool Appeared() 
{ 
    int rand = Random.Range(1, 6); 
    bool appear = rand == 1; 
    return appear; 
} 

Hmm, maintenant nous assignons juste une variable et la retournons ensuite sur la ligne suivante. OK, peut-être ceci:

bool Appeared() 
{ 
    int rand = Random.Range(1, 6); 
    return rand == 1; 
} 

Bien, oui. Cela semble familier. Maintenant, encore une fois, nous sommes presque juste en assignant une variable, puis en le retournant sur la ligne suivante. Avons-nous vraiment besoin de cette variable rand maintenant? Probablement pas. Que diriez-vous alors:

bool Appeared() 
{ 
    return Random.Range(1, 6) == 1; 
} 

Beaucoup mieux.

+0

'Si max est égal à min, min sera retourné. – AntiHeadshot