需求:

玩家有初始生命;

被敌人攻击后:掉血,播放受击音效,红屏(用UI图片做)闪烁提示,UI面板刷新生命

直至死亡:死亡播放死亡音效,游戏结束;

1.变量:

玩家生命

 public int startingHealth = 100;                            // 初始生命值
public int currentHealth; // 当前生命

组件:

public Slider healthSlider;                                 // 玩家生命条UI
Animator anim; // 玩家身上动画状态机
AudioSource playerAudio; // 玩家身上音效组件
PlayerMovement playerMovement; // 玩家移动组件
PlayerShooting playerShooting; // 玩家攻击组件

状态bool:

bool isDead;                                                // 玩家是否死亡
bool damaged; // 玩家受击后设置为True

受击红屏闪烁:

public Image damageImage;                                   // 受击后全屏显示的图片(半透的红图,真实感;初始设为全透明)
public float flashSpeed = 5f; // 受击图淡入淡出速度
public Color flashColour = new Color(1f, 0f, 0f, 0.1f); // 受击图显示的颜色,半透

2.初始化组件:

 void Awake ()
{
anim = GetComponent <Animator> ();
playerAudio = GetComponent <AudioSource> ();
playerMovement = GetComponent <PlayerMovement> ();
playerShooting = GetComponentInChildren <PlayerShooting> (); currentHealth = startingHealth;
}

3.在Update中,根据damaged状态显示受击红屏闪烁:

void Update ()
{
// 如果受击了,这一帧显示受击提示颜色;下一帧从当前颜色插值清除
if(damaged)
{
//设置受击图片的颜色为受击提示的颜色:半透红
damageImage.color = flashColour;
}
else
{
// 以flashSpeed速度 插值清除受击图片颜色到0,0,0,0
damageImage.color = Color.Lerp (damageImage.color, Color.clear, flashSpeed * Time.deltaTime);
} //重置受击状态
damaged = false;
}

4.玩家受伤:

public void TakeDamage (int amount)
{
//设置受伤变量为True,红屏闪烁后再恢复
damaged = true; // 减去受击生命
currentHealth -= amount; //UI面板显示
healthSlider.value = currentHealth; //播放受击音效
playerAudio.Play (); // 没血了,死亡,调用死亡函数
if(currentHealth <= 0 && !isDead)
{
Death ();
}
}

5.玩家死亡:

    void Death ()
{
// 设置死亡状态为True,避免重复调用Dead函数(状态变量好处!!)
isDead = true; // 关闭未播放完的玩家攻击的特效
playerShooting.DisableEffects (); //切换动画状态机到死亡
anim.SetTrigger ("Die"); // 切换音效为死亡音效并播放
playerAudio.clip = deathClip;
playerAudio.Play (); // 禁用玩家移动和射击组件,不可再移动和攻击
playerMovement.enabled = false;
playerShooting.enabled = false;
}

这里的playerShooting.DisableEffects ()做的是这样的事情:禁用了LineRenderer组件、Light点光源组件

6.重新开始:(游戏结束重新加载场景)

这里做法和敌人死亡一样,都是在死亡动画中加了事件,调用方法;主角死亡动画播放完时候进入这个事件重新加载场景。

 public void RestartLevel ()
{
SceneManager.LoadScene (0);
}

SurvivalShooter学习笔记(六.玩家生命)的更多相关文章

  1. Maven学习笔记(六):生命周期与插件

    何为生命周期:      Maven的生命周期就是为了对全部的构建过程进行抽象和统一.Maven从大量项目和构建工具中学习和反思,然后总结了一套高度完好的.易扩展的生命周期.这个生命周期包括了项目的清 ...

  2. java之jvm学习笔记六-十二(实践写自己的安全管理器)(jar包的代码认证和签名) (实践对jar包的代码签名) (策略文件)(策略和保护域) (访问控制器) (访问控制器的栈校验机制) (jvm基本结构)

    java之jvm学习笔记六(实践写自己的安全管理器) 安全管理器SecurityManager里设计的内容实在是非常的庞大,它的核心方法就是checkPerssiom这个方法里又调用 AccessCo ...

  3. Learning ROS for Robotics Programming Second Edition学习笔记(六) indigo xtion pro live

    中文译著已经出版,详情请参考:http://blog.csdn.net/ZhangRelay/article/category/6506865 Learning ROS for Robotics Pr ...

  4. Typescript 学习笔记六:接口

    中文网:https://www.tslang.cn/ 官网:http://www.typescriptlang.org/ 目录: Typescript 学习笔记一:介绍.安装.编译 Typescrip ...

  5. python3.4学习笔记(六) 常用快捷键使用技巧,持续更新

    python3.4学习笔记(六) 常用快捷键使用技巧,持续更新 安装IDLE后鼠标右键点击*.py 文件,可以看到Edit with IDLE 选择这个可以直接打开编辑器.IDLE默认不能显示行号,使 ...

  6. Go语言学习笔记六: 循环语句

    Go语言学习笔记六: 循环语句 今天学了一个格式化代码的命令:gofmt -w chapter6.go for循环 for循环有3种形式: for init; condition; increment ...

  7. 【opencv学习笔记六】图像的ROI区域选择与复制

    图像的数据量还是比较大的,对整张图片进行处理会影响我们的处理效率,因此常常只对图像中我们需要的部分进行处理,也就是感兴趣区域ROI.今天我们来看一下如何设置图像的感兴趣区域ROI.以及对ROI区域图像 ...

  8. Linux学习笔记(六) 进程管理

    1.进程基础 当输入一个命令时,shell 会同时启动一个进程,这种任务与进程分离的方式是 Linux 系统上重要的概念 每个执行的任务都称为进程,在每个进程启动时,系统都会给它指定一个唯一的 ID, ...

  9. MAVEN学习笔记之Maven生命周期和插件简介(3)

    MAVEN学习笔记之Maven生命周期和插件简介(3) clean compile site三套生命周期相互独立. clean pre-clean 执行清理前的工作 clean 清理上一次构建生成的所 ...

  10. # go微服务框架kratos学习笔记六(kratos 服务发现 discovery)

    目录 go微服务框架kratos学习笔记六(kratos 服务发现 discovery) http api register 服务注册 fetch 获取实例 fetchs 批量获取实例 polls 批 ...

随机推荐

  1. JavaScript/Jquery返回顶部代码

    <!DOCTYPE html> <html> <head> <title>返回顶部</title> <meta charset=&qu ...

  2. android 中的 Handler 线程间通信

    一. 在MainActivity中为什么只是类似的写一行如下代码就可以使用handler了呢? Handler handler = new Handler() { @Override public v ...

  3. Android数据格式解析对象JSON用法

    1.JSON概念: 一种轻量级的数据交换格式,具有良好的可读和便于快速编写的特性,从而可以在不同平台间进行数据交换.JSON采用兼容性很高的文本格式,同时也具备类似于C语言体系的行为. JSON可以将 ...

  4. STL容器分析--deque

    deque,故名思义,双向队列.可以在头尾进行插入删除. 而STL中采用了链表+线性表的数据结构来实现deque,因而除了满足双向队列的特点以外,还支持随机访问. 下面,贴一段代码. 总览:双向队列是 ...

  5. 报错"the microsoft.jet.oledb.4.0 provider is not registered on the local machine"解决方案

    报错提示:"the microsoft.jet.oledb.4.0 provider is not registered on the local machine" 错误起因:wi ...

  6. 有关linux磁盘分区优化

    Linux中几个重要的目录,这几个目录在ubuntu安装的硬盘分区时,可选择性的特别分区,进行挂载./usr 文件系统中一般不改变的文件,如库,程序./var 文件系统包含会改变的文件./home 文 ...

  7. [git]git动画教程

    git学习资料比较好的有廖雪峰的教程 还有2个动画教程: https://www.zhihu.com/question/38008771  git-scm  廖雪峰-Git教程  git-for ...

  8. Git-git 忽略 IntelliJ .idea文件

    $ echo ‘.idea’ >> .gitignore $ git rm -rf .idea $ git add .gitignore

  9. python学习之socket模块

    socket.socket(family=AF_INET,type=SOCK_STREAM,proto=,fileno=None) 使用给定的地址族,套接字类型和协议号创建一个新的套接字.family ...

  10. poj 1113 Wall 凸包的应用

    题目链接:poj 1113   单调链凸包小结 题解:本题用到的依然是凸包来求,最短的周长,只是多加了一个圆的长度而已,套用模板,就能搞定: AC代码: #include<iostream> ...