Unity3D:智能巡逻兵

Unity3D:智能巡逻兵

视频预览  代码

游戏规则:

Unity3D:智能巡逻兵_第1张图片

游戏难点:

1.地图实现

我根据题目要求自建了一个地图,并且进行了刚体处理并且勾选了Is Kinematic属性,使得地图不会因碰撞而移动

Unity3D:智能巡逻兵_第2张图片

2.巡逻兵位移限制

使用Random函数获得随机数,来得到转向的方向。并且判断是否为同方向、反方向或者会不会导致出界,最后再进行移动

int getRandomDirection(int index, bool isActive)
    {
        int randomDir = Random.Range(-1, 3);
        if (!isActive)
        {    //当碰撞时,不走同方向
            while (PatrolLastDir[index] == randomDir || PatrolOutOfArea(index, randomDir))
            {
                randomDir = Random.Range(-1, 3);
            }
        }
        else
        {              //当非碰撞时,不走反方向
            while (PatrolLastDir[index] == 0 && randomDir == 2
                || PatrolLastDir[index] == 2 && randomDir == 0
                || PatrolLastDir[index] == 1 && randomDir == -1
                || PatrolLastDir[index] == -1 && randomDir == 1
                || PatrolOutOfArea(index, randomDir))
            {
                randomDir = Random.Range(-1, 3);
            }
        }
        return randomDir;
    }

    //判定巡逻兵走出了自己的区域
    bool PatrolOutOfArea(int index, int randomDir)
    {
        Vector3 patrolPos = PatrolSet[index].transform.position;
        float posX = patrolPos.x;
        float posZ = patrolPos.z;
        switch (index)
        {
            case 0:
                if (randomDir == -1 && posX - 1 < -5
                    || randomDir == 1 && posX + 1 > 0
                    || randomDir == 2 && posZ - 1 < 0
                    || randomDir == 0 && posZ + 1 > 5)
                    return true;
                break;
            case 1:
                if (randomDir == 1 && posX + 1 > 5
                    || randomDir == -1 && posX - 1 < 0
                    || randomDir == 2 && posZ - 1 < 0
                    || randomDir == 0 && posZ + 1 > 5)
                    return true;
                break;
            case 2:
                if (randomDir == -1 && posX - 1 < -5
                    || randomDir == 1 && posX + 1 > 0
                    || randomDir == 2 && posZ - 1 < -5
                    || randomDir == 0 && posZ + 1 > 0)
                    return true;
                break;
            case 3:
                if (randomDir == 1 && posX + 1 > 5
                    || randomDir == -1 && posX - 1 < 0
                    || randomDir == 2 && posZ - 1 < -5
                    || randomDir == 0 && posZ + 1 > 0)
                    return true;
                break;
        }
        return false;
    }

3.巡逻兵追击

因为地图被分为4个部分,每个巡逻兵巡逻一个,其实现方法如下:按地图顺序新建巡逻兵,每次判断当前hero所处位置,就能找到对应的巡逻兵

void Update()
    {
        if (gameStatusOp.getHeroArea() == ownIndex)
        {    //只有当走进自己的区域
            if (!isCatching)
            {
                isCatching = true;
                addAction.addDirectMovement(this.gameObject);
            }
        }
        else
        {
            if (isCatching)
            {    //刚才为捕捉状态,但此时hero已经走出所属区域
                gameStatusOp.heroEscapeAndScore();
                isCatching = false;
                addAction.addRandomMovement(this.gameObject, false);
            }
        }
    }

参考博客

你可能感兴趣的:(Unity3D:智能巡逻兵)