Unity官方第一人称射击游戏<恶魔射手>_学习笔记三(敌人脚本)
2017-11-01 12:01
821 查看
敌人移动脚本
下面的敌人攻击代码,相比较较为复杂,先贴出代码吧
至此敌人相关的代码部分就结束了。
[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() { //如果英雄、敌人自身都有生命值才开 4000 启寻路 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); } } }敌人攻击力逻辑其实很简单,敌人、英雄生命值、两者距离满足条件,此时可以给英雄造成伤害。
至此敌人相关的代码部分就结束了。
相关文章推荐
- Unity官方_第一人称游戏<恶魔射手>----学习笔记一(英雄脚本)
- Unity官方第一个人称射击游戏<恶魔射手>—学习笔记四(游戏中的管理)
- 官方游戏<恶魔射手>--学习笔记二(英雄脚本)
- Unity官方游戏实例视频中文教程之太空射击学习笔记
- unity官方demo学习之Stealth(二十三)敌人射击功能
- IOS cocos2d学习笔记-<八>游戏关卡(Objective-C文件读写)
- 【Unity 3D】学习笔记二十一:unity游戏脚本(一)
- 【Unity 3D】学习笔记二十六:unity游戏脚本(六)
- 【Unity3D游戏开发学习笔记】(五)灵魂降临—Unity脚本的简单运用
- rocketmq学习笔记 二 官方实例<广播>
- 【Unity 3D】学习笔记二十二:unity游戏脚本(二)
- rocketmq学习笔记 二 官方实例<消息过滤>
- 【Unity 3D】学习笔记二十四:unity游戏脚本(四)
- 【Unity 3D】学习笔记二十三:unity游戏脚本(三)
- rocketmq学习笔记 二 官方实例<分布式事务>
- 【Unity 3D】学习笔记二十七:unity游戏脚本(七)
- rocketmq学习笔记 二 官方实例<消费者操作>
- 【Unity 3D】学习笔记二十五:unity游戏脚本(五)
- python学习笔记<os module>
- <Introduction to discrete event systems> 学习笔记4-3