2017-06-30 5 views
0

Donc je fais une réplique du jeu "Snake Pit" du Spectrum. Et vous pouvez vous déplacer comme votre joueur et il y a plusieurs serpents contrôlés par l'IA. Et j'essaie de comprendre comment amener les têtes de serpent à se déplacer quand elles sont juste à côté de vous. Voici mon code que je veux implémenter.Comment détecter un objet spécifique à portée, sur une IA?

public class SnakeController : MonoBehaviour { 

public int maxSize; 
public int currentSize; 
public GameObject snakePrefab; 
public Snake Head; 
public Snake Tail; 
public Vector2 nextPos; 
public int NESW; 
int Random; 
float lineTimer; 
int NESWTemp; 

// Use this for initialization 
void Start() { 
    InvokeRepeating("TimerInvoke", 0, .3f); 
    lineTimer = UnityEngine.Random.Range(0, 2.5f); 
    currentSize = 1; 
} 

// Update is called once per frame 
void Update() { 
    lineTimer -= Time.deltaTime; 
    if (lineTimer <= 0) 
    { 
     ComChangeD(); 
     lineTimer = UnityEngine.Random.Range(0, 2.5f); 
    } 
} 

void TimerInvoke() 
{ 
    Movement(); 
    if(currentSize >= maxSize) 
    { 
     TailFunction(); 
    } 
    else 
    { 
     currentSize++; 
    } 
} 

void Movement() 
{ 
    GameObject temp; 
    nextPos = Head.transform.position; 

    if(nextPos.y > 3.22) 
    { 
     NESW = 2; 
    } 

    else if (nextPos.y < -4.42) 
    { 
     NESW = 0; 
    } 

    else if (nextPos.x < -8.2) 
    { 
     NESW = 1; 
    } 

    else if (nextPos.x > 7.7) 
    { 
     NESW = 3; 
    } 

    switch (NESW) 
    { 
     case 0: 
      nextPos = new Vector2(nextPos.x, nextPos.y + 0.32f); 
      break; 
     case 1: 
      nextPos = new Vector2(nextPos.x + 0.32f, nextPos.y); 
      break; 
     case 2: 
      nextPos = new Vector2(nextPos.x, nextPos.y - 0.32f); 
      break; 
     case 3: 
      nextPos = new Vector2(nextPos.x - 0.32f, nextPos.y); 
      break; 
    } 

    temp = (GameObject)Instantiate(snakePrefab, nextPos, transform.rotation); 
    Head.SetNext(temp.GetComponent<Snake>()); 
    Head = temp.GetComponent<Snake>(); 
    return; 
} 

void ComChangeD() 
{ 
    NESWTemp = UnityEngine.Random.Range(0, 3); 
    if (NESW == 0) 
    { 
     switch (NESWTemp) 
     { 
      case 0: 
       NESW = 1; 
       break; 
      case 1: 
       NESW = 2; 
       break; 
      case 2: 
       NESW = 3; 
       break; 
     } 
    } 
    else if (NESW == 1) 
    { 
     switch (NESWTemp) 
     { 
      case 0: 
       NESW = 0; 
       break; 
      case 1: 
       NESW = 2; 
       break; 
      case 2: 
       NESW = 3; 
       break; 
     } 
    } 
    else if (NESW == 2) 
    { 
     switch (NESWTemp) 
     { 
      case 0: 
       NESW = 0; 
       break; 
      case 1: 
       NESW = 1; 
       break; 
      case 2: 
       NESW = 3; 
       break; 
     } 
    } 
    else if (NESW == 3) 
    { 
     switch (NESWTemp) 
     { 
      case 0: 
       NESW = 0; 
       break; 
      case 1: 
       NESW = 1; 
       break; 
      case 2: 
       NESW = 2; 
       break; 
     } 
    } 
} 
+1

normalement la logique dans ces jeux est whereever l'IA est, prendre 1 pas de plus vers le personnage du joueur .. où il est .. – BugFinder

+0

@BugFinder bien il y a plusieurs serpents et cela rendrait le jeu trop dur, ça ne me dérangerait pas de tester et de peaufiner ça. Pouvez-vous m'aider avec ça? Mais à part cette fonction est juste là pour que les serpents tuent le joueur s'ils sont à côté d'eux. Maintenant, ils vont juste à des endroits et ne se soucient pas vraiment du joueur. – Shanespeed

+0

Je ne sais pas ce qu'est ce jeu de serpent mais pourquoi ne pas utiliser des collisionneurs? –

Répondre

0

Créer gameobject vide sous la tête de serpent et l'appeler 'DetectRange' ou quelque chose comme ça. Réglez ensuite sa largeur et sa hauteur dans l'inspecteur sur la largeur et la hauteur de la plage que vous voulez que votre serpent suive. Donc, si le joueur entre dans cette zone, le serpent commencera à suivre. Ensuite, vous pouvez définir la balise de l'objet joueur sur "Player" ou quelque chose comme ça (c'est sur le dessus de l'inspecteur). Ensuite, vous attachez le script à l'DetectRange et à l'intérieur vous:

public GameObject playerObject; //Drag player gameobject in inspector 
private float snakeSpeed = 1.0f; 


void OnTriggerStay(Collider col) 
{ 
    if(col.gameObject.Tag == "Player") //Check if player entered collider 
    { 
     playerObject.transform.position = Vector3.MoveTowards(playerObject.transform.position, col.gameObject.position, snakeSpeed); 
    } 
} 
+0

Merci beaucoup! Cela va certainement résoudre mon problème! – Shanespeed