Unity3D开发敌人自动攻击和自动寻路

简介:当制作动作类攻击游戏时,会用到敌人的自动攻击及自动寻找攻击目标,如何实现自动攻击和自动寻路呢?下面简单的讲解我对这方面的理解。

当你已经导入了敌人的模型并制作好了敌人动画控制状态机,接下来肯定会想让敌人具备攻击和寻找目标的能力,要开发这一功能,其实只需要做两件事情:

第一:通过CharacterController控制移动,即通过调用SimpleMove(Vector3)移动。

第二:根据主角的位置和距离,判断是否进行攻击,攻击的时候利用随机数来发起攻击动画的选择。

编写脚本:Enimy.cs

using UnityEngine;

usingSystem.Collections;

 

public class Enimy : MonoBehaviour {

 

         // Use this for initialization

    private Transform player;

    public float attackDistance = 2;//这是攻击目标的距离,也是寻路的目标距离

    private Animator animator;

    public float speed;

    private CharacterController cc;

    public float attackTime = 3;   //设置定时器时间 3秒攻击一次

    private float attackCounter = 0; //计时器变量

         voidStart () {

        player = GameObject.FindGameObjectWithTag("Player").transform;

        cc = this.GetComponent<CharacterController>();

        animator = this.GetComponent<Animator>();//控制动画状态机中的奔跑动作调用

        attackCounter = attackTime;//一开始只要抵达目标立即攻击

         }

        

         // Update is called once per frame

         voidUpdate () {

        

        Vector3 targetPos =player.position;

        targetPos.y = transform.position.y;//此处的作用将自身的Y轴值赋值给目标Y

        transform.LookAt(targetPos);//旋转的时候就保证已自己Y轴为轴心旋转

        float distance = Vector3.Distance(targetPos,transform.position);

        if (distance <= attackDistance)

        {

            attackCounter += Time.deltaTime;

            if (attackCounter >attackTime)//定时器功能实现

            {

                int num = Random.Range(0, 2);//攻击动画有两种,此处就利用随机数(【0】,【1】)切换两种动画

                if (num == 0)animator.SetTrigger("Attack1");

                else animator.SetTrigger("Attack2");

 

                attackCounter = 0;

            }

            else

            {

                animator.SetBool("Walk", false);

 

            }

        }

        else

        {

            attackCounter = attackTime;//每次移动到最小攻击距离时就会立即攻击

            if(animator.GetCurrentAnimatorStateInfo(0).IsName("EnimyWalk"))//EnimyWalk是动画状态机中的行走的状态

            cc.SimpleMove(transform.forward*speed);

            animator.SetBool("Walk ",true);//移动的时候播放跑步动画

        }

         }

}

 

结合上面的注释,是不是很清楚这些功能的实现原理了,至少当我忘记的时候看到这个笔记就会明白了。有问题可以留言,一起交流学习。

  • 21
    点赞
  • 176
    收藏
    觉得还不错? 一键收藏
  • 7
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值