我们打开上一篇09着色器光透魔法球的项目,
本章要做的事情是在场景中创建一个怪物对象,当怪物被主角的魔法球击中后播放受击动画效果,此类技术用到动画事件帧,在动画上创建脚本。
首先打开资源商店选择一个免费资源的怪物模型加载至项目中
将导入包的熊Bear资源模型Prefab放置场景中
完全解压缩
创建一个怪物熊的动画状态机
命名为MonsterBearAC
在新建动画状态机中填入动画
添加线的参数
创建线
设直线
创建返回线
拖拽动画状态机
创建一个脚本MonsterBear.cs
编写脚本
using UnityEngine;
public class MonsterBear : MonoBehaviour{
int hp;
public int Hp {
get { return hp; }
set { hp = value; }
}
Animator animator;
void Start(){
Init();
}
void Init() {
hp = 300;
animator = GetComponent<Animator>();
}
void OnTriggerEnter(Collider other){
if (other.CompareTag("Damage")) {
Destroy(other.gameObject);
transform.LookAt(GameObject.FindGameObjectWithTag("Player").
transform.position + new Vector3(0, 0.3f, 0));
animator.SetTrigger("HitTrigger");
}
if (hp <= 0){
Destroy(gameObject);
}
}
}
将脚本挂载至场景中的怪物熊对象身上 并增加两个组件
这里增加Box Collider组件与Rigidbody组件是因为为了激活OnTriggerEnter(Collider other)函数
OnTriggerEnter(Collider other)函数被激活的条件是有两个碰撞器,其中一个要打开触发器也就是勾选Collider下的IsTrigger,且两个物体发生碰撞时需要其中一个物体具有刚体组件Rigidbody
同样我们需要在发生碰撞的魔法球预制体中添加Collider并勾选触发器IsTrigger
对Resources包下的Sphere对象增加一个标签Tag
命名为Damage后保存
将Damage标签挂至魔法球Prefab预制体身上
运行项目后控制主角发射魔法球击中怪物熊后,即可实现怪物熊受击效果的实现
但这时我们要实现的效果,
接下来我们要在怪物熊的受击动画上挂在一个脚本,让怪物熊实现受击后退的效果,并在血量低于0后播放死亡动画后在场景中消除。
首先我们找到怪物熊的动画状态机
强调一下要选中同样的动画剪辑
接下来展开Event添加事件
点击之后可以向右滑动添加一个动画事件帧
我们如果想在具体动画的哪个位置增加动画事件帧可以向上拖拽动画播放视频
点击运行与暂停就可以固定我们想在动画哪个位置建立动画事件帧了
重命名动画事件帧名字
点击Apply应用
我们在脚本中增加一个刚刚添加动画事件帧的名字
我们不想怪物在被主角血量消减至0以下触发销毁的效果,
我们想当怪物血量低于0时先触发死亡动画,过3秒后再被消除,则我们需要在怪物熊动画状态机中添加一个死亡动画。
修改脚本
using System.Collections;
using UnityEngine;
public class MonsterBear : MonoBehaviour{
int hp;
Rigidbody rb;
public int Hp {
get { return hp; }
set { hp = value; }
}
Animator animator;
void Start(){
Init();
}
void Init() {
hp = 300;
animator = GetComponent<Animator>();
rb = GetComponent<Rigidbody>();
}
void OnTriggerEnter(Collider other){
if (other.CompareTag("Damage")) {
transform.LookAt(GameObject.FindGameObjectWithTag("Player").
transform.position + new Vector3(0, 0.3f, 0));
animator.SetTrigger("HitTrigger");
Destroy(other.gameObject);
}
if (hp <= 0){
animator.SetTrigger("DieTrigger");
StartCoroutine(Delay3s());
}
}
public void HitAnimEvent() {
rb.AddForce(-transform.forward * 5,ForceMode.Impulse);
hp -= 200;
}
IEnumerator Delay3s() {
yield return new WaitForSeconds(3.5f);
Destroy(gameObject);
}
}
运行项目
当怪物熊受击后会播放受击动画并且血量减少并被击退一段距离
当怪物被击中后血量低于0后会播放死亡动画过三秒后消失
本篇只实现了怪物受击的动画事件功能,接下来还需做以下内容:
1.怪物被击退时显示击退图标的效果
2.怪物UI信息血量显示(笼)
3.怪物死亡特效
4.怪物死亡掉落物品
5.掉落物品拾取后的转移与穿戴
6.异步传送转换场景
7.目标点巡航功能
以及开放回合制、坐骑系统、宠物系统、背包系统、神炼系统、商城系统、Boss的目标跟随任务导航系统以及UI播放3D动画效果等等。
具体项目运行效果请关注water1024的b站视频项目演示《破碎纪元》