关于机器人寻路追踪巡逻的一些

本文详细解析了机器人在游戏开发中实现寻路、追踪与巡逻的代码逻辑。通过状态判断,机器人能在视野内玩家时停止追踪并开火,同时调整动画。当玩家不在视野范围内,机器人会依据警报位置进行追踪,加快速度。巡逻时,机器人会降低速度,按预定路径移动。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

以下为机器人的寻路追踪巡逻代码,机器人监测在不同时候做不同的事。

  void Update() {
            if (robot.isinsight==true&&playerhealth.health>=0)//如果在视野内,停下追踪,开始开枪,更改动画。
            {
                navagent.SetDestination(transform.position);
                Animator.SetBool("seeplayer", true);
                Shootblood();
            }
            else
            {
                Animator.SetBool("seeplayer", false);
                if (robot.alertposition != Vector3.zero&& playerhealth.health >= 0)//如果警报位置更改,开始追踪,去查看此位置,加快速度。
                {
                    navagent.speed = 4.5f;
                    Chase();
                }
                else//巡逻时,降低速度,关闭警报。
                {
                    Gamecontrol.getinstance.alarmOn = false;
                    navagent.speed = 2.5f;
                    Xunluo();
                }
            } 
     }
        public void Xunluo()
        {
            if(navagent.remainingDistance<1f/*&&Vector3.Distance(this.transform.position, waypoints[index].position)<0.5*/)//巡逻时即将到达位置时,停下来记时间,时间到了,更改下一个点。
            {
                timer += Time.deltaTime;
                if (timer > time)
                {
                    index++;//更改下一个目标点。
                    index = index % 4;//满四归零
                    navagent.destination = waypoints[index].position;
                    //navagent.updatePosition = false;
                    //navagent.updateRotation = false;//可以设置使nav与实物分离,可能版本不同,不能实现,遂妥协。
                    timer = 0;//归零时间
                }
            }
        }
        public void Chase()
        {
            navagent.speed = 3.5f;
            navagent.destination = robot.alertposition;//将追踪终点更改为警报位置
            if(navagent.remainingDistance<3f)
            {
                print("test");
                timer2 += Time.deltaTime;//此处开始计时,时间到了3f,若警报位置没有更换函数没有重复执行,说明player已经逃脱,遂关闭Chase(),开始巡逻;
                if (timer2>3f)
                {
                    robot.alertposition = Vector3.zero;
                    Gamecontrol.getinstance.lastPlayerposition = Vector3.zero;
                }
            }
        }
        public void Shootblood()
        {
            if (Animator.GetFloat("Shot") >=0.8)
            {
                piu.Play();
                print("11");
                playerhealth.health -= 100 - Vector3.Distance(this.transform.position, playerhealth.transform.position) * 8;//根据距离来计算伤害。
            }
        }
     }
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值