一个简单的敌人自动寻找玩家进行攻击及受到伤害死亡效果实现
2017-11-02 11:18
531 查看
using System.Collections; using System.Collections.Generic; using System.Runtime.Remoting; using UnityEngine; using UnityEngine.AI; public class ZombieAI : MonoBehaviour { //动画状态机组件 private Animator Animator; //导航网格 private NavMeshAgent NavMeshAgent; //移动速度 public float MoveSpeed; //丧尸生命值 public float ZombieHealth; //伤害值 public float Damage; //是否存活 public bool Alive; //目标对象 public GameObject Target; //攻击范围 public float AttackRanage; //攻击时间 private float AttackTime; private float NextAttackTime; //获取玩家对象及玩家血量 public GameObject Player; public float PlayerHealth; // Use this for initialization void Start () { //初始化变量 //MoveSpeed = NavMeshAgent.speed; MoveSpeed = 1.0f; Alive = true; ZombieHealth = 50.0f; Damage = 20.0f; AttackRanage = 1.0f; AttackTime = 2.0f; Animator = GetComponent<Animator>(); NavMeshAgent = GetComponent<NavMeshAgent>(); Player = GameObject.FindWithTag("Player"); Target = GameObject.FindWithTag("Player"); } // Update is called once per frame void Update () { PlayerHealth = Player.GetComponent<Steam_VR_PlayerCharacter>().Health; //动画状态机信息 AnimatorStateInfo _animatorInfo; _animatorInfo = Animator.GetCurrentAnimatorStateInfo(0); if (Alive == true) { if (Target != null) { NavMeshAgent.destination = Target.transform.position; Animator.SetBool("Walk", true); //当敌人接近玩家并且进入到可攻击距离时进行攻击 if (Vector3.Distance(Player.transform.position, this.transform.position) < AttackRanage) { NavMeshAgent.Stop(); //transform.LookAt(Target.transform); Animator.SetBool("Walk", false); Animator.SetBool("Attack", true); } //播放攻击动画后对玩家造成伤害 if ((_animatorInfo.normalizedTime > 1 && _animatorInfo.IsName("Base Layer.Attack"))) { Animator.SetBool("Attack", false); if (NextAttackTime < Time.time) { NextAttackTime = Time.time + AttackTime; PlayerHealth = PlayerHealth - Damage; Player.GetComponent<Steam_VR_PlayerCharacter>().SendMessageUpwards("Damage", Damage); if (PlayerHealth < 0) PlayerHealth = 0; //通过外部设置玩家血量 Player.GetComponent<Steam_VR_PlayerCharacter>().SetHealth(PlayerHealth); print(PlayerHealth); } } } } //敌人血量为0时死亡 if (ZombieHealth <= 0) { Alive = false; Animator.SetBool("Die", true); NavMeshAgent.Stop(); Destroy(GetComponent<CapsuleCollider>()); StartCoroutine(ZombieDie()); } if ((_animatorInfo.normalizedTime > 1 && _animatorInfo.IsName("Base Layer.hit"))) { Animator.SetBool("Hit", false); } if (ZombieHealth <= 0) ZombieHealth = 0; } //死亡后销毁游戏对象 IEnumerator ZombieDie() { yield return new WaitForSeconds(5.0f); Destroy(this.gameObject); //ZombieHealth = 50; } //受到子弹撞击时减少血量 void OnCollisionEnter(Collision other) { if (other.gameObject.tag == "Bullet") { ZombieHealth -= 10; Animator.SetBool("Hit", true); } else { Animator.SetBool("Hit", false); } } //允许外部设置zombie血量 //public void SetZombieHealth(float ZombieHealth) { this.ZombieHealth = ZombieHealth; } }
相关文章推荐
- 实现敌人(怪物)的简单AI(自动巡逻、看到玩家攻击玩家、玩家离开恢复自动巡逻)
- 利用PreLoader实现一个平视显示(HUD)效果(可以运用到加载等待效果),并进行简单的讲解
- 利用PreLoader实现一个平视显示(HUD)效果(可以运用到加载等待效果),并进行简单的讲解
- android 自动划屏效果 在这里,我们需要用到google提到的一个包——android-support-v4.jar,这个包是为了方便实现android view之间的切换,关
- jQuery实现一个简单的选项卡效果
- 一个简单的脚本,实现自动执行MITM攻击(更新0.2)
- Tab切换动画滑动效果的一个简单实现
- 自己实现的一个简单的相册效果
- cocos2d-x 如何使用CCProgressTimer作为血条,实现跟随怪物进行移动,自动掉血,然后死亡。
- js/html/css做一个简单的图片自动(auto)轮播效果//带注释
- JS实现的一个简单的Autocomplete自动完成例子
- 代码录播:jQueryMobile 实现一个简单的弹出框效果
- jquery实现的一个简单进度条效果实例
- 【Python】简单例题tuple和list的转换;实现删除一个list里重复的元素;对list a进行排序,并且从最后一个开始删除重复元素
- Unity3d 一个简单的玻璃效果实现!
- 一个自动更新的简单实现(通过反射解耦)
- 玩家死亡,屏幕灰白效果实现
- ajax 实现的一个简单的自动的更新系统
- JS实现的一个简单的Autocomplete自动完成例子
- 想给自己制作一个简单的相册吗?快来看看 怎样实现3D图片相册效果