SurvivalShooter学习笔记(五.敌人生命)
敌人生命系统(受伤 死亡)
敌人生成后有初始生命,被攻击受伤有打击特效,降低生命值,直至死亡;
死亡后怪物:播放死亡音效,动画,然后下沉地表,销毁;玩家:得到相应分数。
敌人生命脚本如下:
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使物体向下移动,则先取消其物理属性。
SurvivalShooter学习笔记(五.敌人生命)的更多相关文章
- muduo网络库学习笔记(五) 链接器Connector与监听器Acceptor
目录 muduo网络库学习笔记(五) 链接器Connector与监听器Acceptor Connector 系统函数connect 处理非阻塞connect的步骤: Connetor时序图 Accep ...
- C#可扩展编程之MEF学习笔记(五):MEF高级进阶
好久没有写博客了,今天抽空继续写MEF系列的文章.有园友提出这种系列的文章要做个目录,看起来方便,所以就抽空做了一个,放到每篇文章的最后. 前面四篇讲了MEF的基础知识,学完了前四篇,MEF中比较常用 ...
- (转)Qt Model/View 学习笔记 (五)——View 类
Qt Model/View 学习笔记 (五) View 类 概念 在model/view架构中,view从model中获得数据项然后显示给用户.数据显示的方式不必与model提供的表示方式相同,可以与 ...
- java之jvm学习笔记五(实践写自己的类装载器)
java之jvm学习笔记五(实践写自己的类装载器) 课程源码:http://download.csdn.net/detail/yfqnihao/4866501 前面第三和第四节我们一直在强调一句话,类 ...
- Learning ROS for Robotics Programming Second Edition学习笔记(五) indigo computer vision
中文译著已经出版,详情请参考:http://blog.csdn.net/ZhangRelay/article/category/6506865 Learning ROS for Robotics Pr ...
- Typescript 学习笔记五:类
中文网:https://www.tslang.cn/ 官网:http://www.typescriptlang.org/ 目录: Typescript 学习笔记一:介绍.安装.编译 Typescrip ...
- ES6学习笔记<五> Module的操作——import、export、as
import export 这两个家伙对应的就是es6自己的 module功能. 我们之前写的Javascript一直都没有模块化的体系,无法将一个庞大的js工程拆分成一个个功能相对独立但相互依赖的小 ...
- python3.4学习笔记(五) IDLE显示行号问题,插件安装和其他开发工具介绍
python3.4学习笔记(五) IDLE显示行号问题,插件安装和其他开发工具介绍 IDLE默认不能显示行号,使用ALT+G 跳到对应行号,在右下角有显示光标所在行.列.pycharm免费社区版.Su ...
- Go语言学习笔记五: 条件语句
Go语言学习笔记五: 条件语句 if语句 if 布尔表达式 { /* 在布尔表达式为 true 时执行 */ } 竟然没有括号,和python很像.但是有大括号,与python又不一样. 例子: pa ...
- 【opencv学习笔记五】一个简单程序:图像读取与显示
今天我们来学习一个最简单的程序,即从文件读取图像并且创建窗口显示该图像. 目录 [imread]图像读取 [namedWindow]创建window窗口 [imshow]图像显示 [imwrite]图 ...
随机推荐
- 图片转成base64, base64转成图片
1.我们在看代码时经常在img或css背景图片中看到: src=”data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAHgAAAB4CAMAAAAOusbgA ...
- eclipse 编译JAVA 项目导入的WEB项目 无法编译问题
右击你的项目 选择properties ---->java Build Path--->Default output folder新建一个classes目录就好了 watermark/2 ...
- Java学习笔记3、变量、数据类型
标识符 常见的命名规则(见名知意) 包名全部小写 类或者接口,一个单词:首字母大写,多个单词:每个单词首字母大写. 方法或者变量:一个单词:首字母小写,多个单词:从第二个单词开始,每个单词首字母大写. ...
- jquery下载保存文件
<html> <head> <meta http-equiv="Content-Type" content="text/html; char ...
- 【VBA编程】11.Application对象
Application对象常用属性[ActiveCell属性]ActiveCell属性返回一个Range对象,表示当前窗口或指定窗口中的单元格.如果窗口没显示工作表,则此属性无效.[代码区域] Sub ...
- linux下自己下载的程序装哪?
有两个选择: /usr/local:类似于C:\Program Files /opt:类似于D:\soft 其实都可以,关键是保持一致.
- jetty maven插件端口设置
在jetty的maven插件中有两种方式设置jetty的端口(默认为:8080). 第一种,通过命令行,在启动jetty的时候设置:mvn -Djetty.port=8081 jetty:run 第二 ...
- linux系统常用命令 -设置文件夹读写权限
设置文件夹的读写权限: sudo chmod -R 777 /data 权限码描述 sudo chmod 600 ××× (只有所有者有读和写的权限)sudo chmod 644 ××× (所有者有读 ...
- word2vector 理解入门
1.什么是word2vector? 我们先来看一个问题,假如有一个句子 " the dog bark at the mailman". 假如用向量来表示每个单词,我们最先想到的是用 ...
- 计算机系统监控 PerformanceCounter
PerformanceCounter 컴퓨터 성능 머니터링 CUP Processor 메모리 하터웨어 DB (CPU,User Connection,Batch Request,Blocking ...