2017-06-30 15 views
0

所以我正在从Spectrum制作游戏“Snake Pit”的复制品。你可以作为你的玩家移动,并有多个AI控制的蛇。我试图找出如何让蛇头在你身边的时候移动到你的位置。这是我想要实现它的代码。如何检测范围内的AI上的特定对象?

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

通常在这些游戏的逻辑是徘徊无论在AI是,取1步步接近玩家角色..无论它是.. – BugFinder

+0

@BugFinder好有多个蛇,这会让游戏太难,我不介意测试和调整。你能帮助我吗?但是,除了这个功能之外,如果蛇在旁边,蛇会杀死玩家。现在他们只是要去的地方,并不真正关心球员。 – Shanespeed

+0

我不知道那是什么蛇游戏,但为什么不使用对撞机? –

回答

0

在蛇头下创建空的gameobject,并将其称为'DetectRange'或类似的东西。然后在巡视器中设置它的宽度和高度,以使您的蛇跟随玩家的范围的宽度和高度。所以如果玩家进入该范围,蛇就会开始跟随。然后你可以将玩家对象的标签设置为“玩家”或类似的东西(这是在检查员的顶部)。然后您将脚本到DetectRange和里面你做:

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

谢谢!这一定会解决我的问题! – Shanespeed