【Unity3D-Mirror多人坦克大战】机器人的移动、导航网格制作、对敌方的检测(十四)

目录

43、机器人对敌方的检测和移动逻辑

44、Navmesh路径

测试


43、机器人对敌方的检测和移动逻辑

更新PlayerBot.cs
using System;
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using UnityEngine.AI;
using Random = UnityEngine.Random;
public class PlayerBot : Player
{
    ……
    IEnumerator DetectPlayers()
    {
        yield return new WaitForEndOfFrame();
        while (true)
        {
            inRange.Clear();
            Collider[] cols = Physics.OverlapSphere(transform.position, range, LayerMask.GetMask("Player"));
            for (int i = 0; i < cols.Length; ++i)
            {
                Player p = cols[i].gameObject.GetComponent<Player>();
                if (p.teamIndex != teamIndex && !inRange.Contains(cols[i].gameObject))
                {
                    inRange.Add(cols[i].gameObject);
                }
            }
            yield return new WaitForSeconds(1);
        }
    }
    private void RandomPoint(Vector3 center, float range, out Vector3 result)
    {
        result = Vector3.zero;
        for (int i = 0; i < 30; ++i)
        {
            Vector3 randomPoint = center + (Vector3) Random.insideUnitCircle*range;
            NavMeshHit hit;
            if (NavMesh.SamplePosition(randomPoint, out hit, 1f, NavMesh.AllAreas))
            {
                result = hit.position;
                break;
            }
        }
        agent.SetDestination(result);
    }
    void FixedUpdate()
    {
        if (isDead) return;
        if (inRange.Count == 0)
        {
            if (Vector3.Distance(transform.position, targetPoint) < agent.stoppingDistance)
            {
                RandomPoint(transform.position, range * 3, out targetPoint);
            }
        }
        else
        {
            if (Vector3.Distance(transform.position, targetPoint) < agent.stoppingDistance)
            {
                RandomPoint(inRange[0].transform.position, range * 2, out targetPoint);
            }
        }
    }
}

44、Navmesh路径

选择窗口-AI-导航,生成如下
此时烘培了,发现地形上山坡上有些地方,也在范围内,所以只能自定义了
这样就自己制作cube来确定路线范围了
当前cube上显示浅蓝色,所以路线范围覆盖到了这个cube上,所以为了全面覆盖地图,就制作很多个cube,如图
为了方便演示,将Mesh Renderer设置一下
这样就看不到方块的外形了
而且仍然可以显示
将PlayerBot设置一下
最后由于Player的刚体没有设置触发器,所以这些cube, 要设置成触发器,取消碰撞。

测试

【bug修复】从上图可以看到,机器人是悬空的,离地面有一定的距离,这样的结果就是机器人的炮台有可能高于自己,从而开炮打不到自己,原因在于在烘培路线时,是在cube的表面烘培的,而cube本身就有一定的高度,虽然最后可以将cube隐藏,但是路线就是悬空的了,所以这些机器人也就是悬空了,处理方法就是将这些cube的高度y设置成0.1即可。
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

~Lomiss~

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值