关闭

SurvivalShooter学习笔记(五.敌人生命)

513人阅读 评论(0) 收藏 举报
分类:

敌人生命系统(受伤 死亡)

敌人生成后有初始生命,被攻击受伤有打击特效,降低生命值,直至死亡;

死亡后怪物:播放死亡音效,动画,然后下沉地表,销毁;玩家:得到相应分数。


敌人生命脚本如下:

1.变量:

 public int startingHealth = 100;            // 敌人初始生命
 public int currentHealth;                   // 敌人当前生命
 public float sinkSpeed = 2.5f;              // 死亡后敌人下沉到地下的速度
 public int scoreValue = 10;                 // 当前敌人死亡给予玩家的分数值
 public AudioClip deathClip;                 //敌人死亡的音效

2.组件:
Animator anim;                              // 敌人身上动画状态机
AudioSource enemyAudio;                     // 敌人身上音效播放器
ParticleSystem hitParticles;                // 敌人受击特效
CapsuleCollider capsuleCollider;            //敌人身上碰撞

3.记录状态变量:
bool isDead;                                // 敌人是否死亡
bool isSinking;                             // 敌人是否在死亡下沉

4.初始化获取组件:
void Awake ()
        {
            anim = GetComponent <Animator> ();
            enemyAudio = GetComponent <AudioSource> ();
            hitParticles = GetComponentInChildren <ParticleSystem> ();//特效物作为敌人的子物体,根据受击点调整位置
            capsuleCollider = GetComponent <CapsuleCollider> ();

            //初始化当前生命
            currentHealth = startingHealth;
        }

5.如果在死亡下沉状态,则敌人:以下沉速度下沉
void Update ()
        {
            // If the enemy should be sinking...
            if(isSinking)
            {
                transform.Translate (-Vector3.up * sinkSpeed * Time.deltaTime);
            }
        }

6.敌人受到伤害:如果敌人死亡,则不操作;否则,给予伤害,播放受伤音效特效 并判断是否死亡

注:敌人身上的AudioSource初始已经拖入受伤音效,所以直接播放就行;下面死亡音效则需要切换音效再播放

public void TakeDamage (int amount, Vector3 hitPoint)
        {
            //如果敌人死亡,则不操作
            if(isDead)
                return;

            //播放敌人受伤音效
            enemyAudio.Play ();

            //受伤,减少当前生命
            currentHealth -= amount;
            
            //设置特效在受击点播放
            hitParticles.transform.position = hitPoint;
            hitParticles.Play();

            //判断是否死亡
            if(currentHealth <= 0)
            {
                Death ();
            }
        }

7.敌人死亡:切换动画到死亡,并播放敌人死亡音效。

注意:因敌人死亡为立即,但动画播放到毁灭需要时间,所以死亡后把身上的碰撞的IsTrigger设True,把碰撞器转为触发器,使主角的射击可以穿过已死亡的敌人

 void Death ()
        {
            // 设置状态变量
            isDead = true;

            //把身上的碰撞的IsTrigger设True,把碰撞器转为触发器,使主角的射击可以穿过已死亡的敌人
            capsuleCollider.isTrigger = true;

            // 切换动画到死亡
            anim.SetTrigger ("Dead");

            //播放死亡音效(这会终止受伤音效的播放).
            enemyAudio.clip = deathClip;
            enemyAudio.Play ();
        }


8.敌人死亡下沉:停止自动寻路,为了用translate来下沉敌人所以取消敌人身上刚体的物理属性;下沉后几秒毁灭物体

public void StartSinking ()
        {
            // 禁用自动寻路组件
            GetComponent <UnityEngine.AI.NavMeshAgent> ().enabled = false;

            //取消刚体物理属性(since we use Translate to sink the enemy).
            GetComponent <Rigidbody> ().isKinematic = true;

            // 设置状态变量值,然后交由Update让敌人向下移动
            isSinking = true;

            // 加分
            ScoreManager.score += scoreValue;

            // 2秒后毁灭敌人
            Destroy (gameObject, 2f);
        }


可以注意到,在当前脚本中没有地方调用了StartSinking这个函数,那么项目中哪里调用它使敌人的尸体可以向下移动呢?

这是个很好玩的地方,该项目在敌人的死亡动画里加了事件,调用了这个方法; 就是在动画播放到敌人死亡身体水平跳起准备落下的帧上,执行这个下沉函数,nice!





这里补充关于Rigidbody上的IsKinematic取消物体属性参数:

If enabled, the object will not be driven by the physics engine, and can only be manipulated by its Transform. This is useful for moving platforms or if you want to animate a Rigidbody that has a HingeJoint attached.
也就是说,勾选上,取消物理属性后,该物体不再受物理引擎驱动,而只能通过transform变换来操作。适用于模拟运动的平台或者模拟受铰链关节连接的刚体。

所以上面想要通过transform使物体向下移动,则先取消其物理属性。


0
0
查看评论

SurvivalShooter学习笔记(八.敌人管理器)

敌人管理器:管理敌人的随机出生点创建 在场景中建立几个空物体,作为敌人的出生点 public class EnemyManager : MonoBehaviour { public PlayerHealth playerHealth; // 玩家生命脚本 ...
  • qq_33337811
  • qq_33337811
  • 2017-01-04 14:23
  • 455

SurvivalShooter学习笔记(三.敌人移动)

1.敌人和玩家若存活,敌人始终朝着玩家所在位置移动,所以要给玩家物体一个Tag:Player从而找到玩家 2.敌人的自动寻路使用Unity自带的NavMeshAgent寻路组件寻路,要先把场景中不动的物体勾选Static,然后Navigation-Bake烘焙 移动 代码如下: ...
  • qq_33337811
  • qq_33337811
  • 2017-01-03 14:05
  • 752

SurvivalShooter学习笔记(四.敌人攻击)

此案例中,敌人始终朝着玩家移动 到达攻击玩家范围时(身上的大的触发器被玩家触发时(敌人靠近玩家,当身上的触发器被触发,且对象是玩家时条件达成)) 隔一个时间端,打击玩家一下,对玩家造成伤害,玩家掉血,直至死亡。
  • qq_33337811
  • qq_33337811
  • 2017-01-03 14:33
  • 415

SurvivalShooter学习笔记(六.玩家生命)

需求: 玩家有初始生命; 被敌人攻击后:掉血,播放受击音效,红屏(用UI图片做)闪烁提示,UI面板刷新生命 直至死亡:死亡播放死亡音效,游戏结束; 1.变量:  玩家生命 public int startingHealth = 100; ...
  • qq_33337811
  • qq_33337811
  • 2017-01-04 09:56
  • 402

Python基础 -- 05 基础语法(面向对象)

一、面向对象第一天 1、类的组成:类(Class) 由3个部分构成 类的名称:类名类的属性:一组数据类的方法:允许对进行操作的方法 (行为) 2、类的定义和实例化语法及演示 """ 类的定义: py...
  • wingzhezhe
  • wingzhezhe
  • 2018-01-21 15:03
  • 44

unity官方demo学习之Stealth(十二)角色生命值

1,为玩家添加脚本DonePlayerHealth using UnityEngine; using System.Collections; public class DonePlayerHealth : MonoBehaviour { public float health = 100...
  • u012723995
  • u012723995
  • 2015-10-05 10:00
  • 1276

CAN总线学习笔记

1.总线状态  总线有“显性”和“隐性”两个状态,“显性”对应逻辑“0”,“隐性”对应逻辑“1”。“显性”状态和“隐性”状态与为“显性”状态,所以两个节点同时分别发送“0”和“1”时,总线上呈现“0”。
  • coolibin
  • coolibin
  • 2014-05-30 09:47
  • 1717

cmake学习笔记(五)

在cmake 学习笔记(三) 中简单学习了 find_package 的 model 模式,在cmake 学习笔记(四)中了解一个CMakeCache相关的东西。但靠这些知识还是不能看懂PySide使用CMakeLists文件,接下来继续学习find_package的 con
  • dbzhang800
  • dbzhang800
  • 2011-04-22 12:05
  • 8169

人类无法创造有意识的AI——新书《生命3.0》解读

今天要说的是迈克斯·泰格马克(Max Tegmark)在17年8月出版的新书,全名是《生命3.0》( Life 3.0: Being Human in the Age of Artificial Intelligence ) ,作者是MIT的物理学教授。这本书主要讲的是...
  • s1314_JHC
  • s1314_JHC
  • 2017-10-14 10:20
  • 426

Junit学习笔记之一:junit的安装和测试原则

单元测试    1、自动化测试      1.1、通过断言的方式来确定结果是否正确Assert      1.2、引入junit的jar包      1.3、创建一个操作类   &...
  • xiao_xuwen
  • xiao_xuwen
  • 2016-10-21 22:50
  • 374
    个人资料
    • 访问:89387次
    • 积分:1618
    • 等级:
    • 排名:千里之外
    • 原创:57篇
    • 转载:110篇
    • 译文:1篇
    • 评论:6条
    最新评论