Как обнаружить конкретный объект в радиусе действия ИИ?
Поэтому я делаю точную копию игры "Яма со змеями" от Spectrum. И вы можете двигаться как ваш игрок, и есть несколько змей, контролируемых ИИ. И я пытаюсь понять, как заставить змееголовых переместиться к вам, когда они рядом с вами. Вот мой код, в который я хочу реализовать его.
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 ответ
Создайте пустой игровой объект под головой змеи и назовите его "DetectRange" или что-то в этом роде. Затем установите его ширину и высоту в инспекторе в соответствии с шириной и высотой диапазона, в котором ваша змея будет следовать за игроком. Так что, если игрок войдет в этот диапазон, змея начнет следовать. Затем вы можете установить тег объекта player на "Player" или что-то в этом роде (это сверху инспектора). Затем вы прикрепляете скрипт к 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);
}
}