Unity官方第一人称射击游戏<恶魔射手>_学习笔记三(敌人脚本)

敌人移动脚本

[RequireComponent(typeof(NavMeshAgent))]
public class MyEnemyMove : MonoBehaviour
{
    Transform mMyHero;
    //声明英雄、敌人生命值脚本在于它们决定了敌人的AI何时启动和终止
    MyPlayerHealth _MyPlayerHealth;
    MyEnemyHealth _MyEnemyHealth;
    //内置寻路导航对象
    NavMeshAgent _NavMeshAgent;
    private void Awake()
    {
        mMyHero = GameObject.FindWithTag("MyHero").GetComponent<Transform>();
        _NavMeshAgent = GetComponent<NavMeshAgent>();
        _MyEnemyHealth = GetComponent<MyEnemyHealth>();
        _MyPlayerHealth = mMyHero.GetComponent<MyPlayerHealth>();
    }

    private void Update()
    {
        //如果英雄、敌人自身都有生命值才开启寻路
        if (_MyEnemyHealth.mCurrentHealth > 0 && _MyPlayerHealth.mCurrentHealth > 0)
        {
            _NavMeshAgent.SetDestination(mMyHero.position);
        }
        else
        {
            _NavMeshAgent.enabled = false;
        }
    }
}
较为简单,我直接贴出全部代码。

public class MyEnemyHealth : MonoBehaviour
{

    public float mCurrentHealth;
    Animator _Animator;
    int _StartHealth = 100;
    bool _IsDead;
    bool _IsSkinking;
    private void Awake()
    {
        mCurrentHealth = _StartHealth;
        _Animator = GetComponent<Animator>();
    }
    private void Update()
    {
        //如果下沉条件成立
        if (_IsSkinking)
        {
            transform.Translate(Vector3.down* Time.deltaTime);
        }
    }

    public void TakeDamage(float amount)
    {
        //如果敌人死亡,便不再受到伤害
        if (_IsDead)
            return;
        mCurrentHealth -= amount;

        if (mCurrentHealth <= 0 && !_IsDead)
        {
            Dead();
        }
    }
    private void Dead()
    {
        _IsDead = true;
        _Animator.SetTrigger("Dead");
        MyScoreManager.mScore += 10;    //在这里更新玩家分数
    }

    //该函数被"Dead"动画事件驱动
    public void StartSinking()
    {
        //死亡动画开启,死亡敌人身体开始下沉
        _IsSkinking = true;
        gameObject.GetComponent<Rigidbody>().isKinematic = true;
        Destroy(gameObject, 2);
    }
}
同样直接贴出全部代码

下面的敌人攻击代码,相比较较为复杂,先贴出代码吧

public class MyEnemyAttack : MonoBehaviour
{
    GameObject _Player;
    MyPlayerHealth _MyPlayerHealth;
    MyEnemyHealth _MyEnemyHealth;
    Animator _Animator; 
    float _TimeBetweenAttack = 0.5f;    //攻击时间间隔
    int _AttackDamage = 10; //攻击力
    bool _IsPlayerInRange;  //英雄是否在攻击范围
    float _Timer;
    private void Awake()
    {
        _Player = GameObject.Find("MyHero");
        _MyEnemyHealth = GetComponent<MyEnemyHealth>();
        _MyPlayerHealth = _Player.GetComponent<MyPlayerHealth>();
        _Animator = GetComponent<Animator>();
    }
    private void Update()
    {
        _Timer += Time.deltaTime;
        if (_Timer > _TimeBetweenAttack && _MyEnemyHealth.mCurrentHealth > 0 && _MyPlayerHealth.mCurrentHealth > 0)
        {
            Attack();
        }
        if (_MyPlayerHealth.mCurrentHealth <= 0)
        {
            _Animator.SetTrigger("PlayerDead");
        }
    }
    //英雄进入攻击范围
    private void OnCollisionEnter(Collision collision)
    {
        if (collision.collider.gameObject == _Player.gameObject)
        {
            _IsPlayerInRange = true;
            _Animator.SetTrigger("PlayerDead");
        }
    }
    //英雄离开攻击范围
    private void OnCollisionExit(Collision collision)
    {
        if (collision.collider.gameObject == _Player.gameObject)
        {
            _IsPlayerInRange = false;
        }
    }
    private void Attack()
    {
        _Timer = 0;
        //必须满足攻击范围要求,才可以攻击
        if (_IsPlayerInRange)
        {
            _MyPlayerHealth.TakeDamage(_AttackDamage);
        }
    }
}
敌人攻击力逻辑其实很简单,敌人、英雄生命值、两者距离满足条件,此时可以给英雄造成伤害。

至此敌人相关的代码部分就结束了。




  • 1
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值