我正在制作一款复刻自Spectrum游戏“蛇坑”的游戏。你可以作为玩家移动,并且有多个由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 initializationvoid Start () { InvokeRepeating("TimerInvoke", 0, .3f); lineTimer = UnityEngine.Random.Range(0, 2.5f); currentSize = 1;}// Update is called once per framevoid 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; } }}
回答:
在蛇头下创建一个空的游戏对象,并命名为“DetectRange”或类似的名称。然后在检查器中设置它的宽度和高度,以设定你希望蛇跟随玩家的范围大小。这样,当玩家进入这个范围时,蛇就会开始跟随。然后,你可以将玩家对象的标签设置为“Player”或类似名称(这是在检查器顶部设置的)。然后你将脚本附加到DetectRange
上,并在其中编写如下代码:
public GameObject playerObject; //在检查器中拖入玩家游戏对象private float snakeSpeed = 1.0f;void OnTriggerStay(Collider col){ if(col.gameObject.Tag == "Player") //检查玩家是否进入了碰撞体 { playerObject.transform.position = Vector3.MoveTowards(playerObject.transform.position, col.gameObject.position, snakeSpeed); }}