如何在AI范围内检测特定对象?

我正在制作一款复刻自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);    }}

Related Posts

L1-L2正则化的不同系数

我想对网络的权重同时应用L1和L2正则化。然而,我找不…

使用scikit-learn的无监督方法将列表分类成不同组别,有没有办法?

我有一系列实例,每个实例都有一份列表,代表它所遵循的不…

f1_score metric in lightgbm

我想使用自定义指标f1_score来训练一个lgb模型…

通过相关系数矩阵进行特征选择

我在测试不同的算法时,如逻辑回归、高斯朴素贝叶斯、随机…

可以将机器学习库用于流式输入和输出吗?

已关闭。此问题需要更加聚焦。目前不接受回答。 想要改进…

在TensorFlow中,queue.dequeue_up_to()方法的用途是什么?

我对这个方法感到非常困惑,特别是当我发现这个令人费解的…

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注