当前位置:网站首页>项目实训-读报僵尸
项目实训-读报僵尸
2022-04-22 09:29:00 【azzin】
本次加入了读报僵尸,首先导入读报僵尸素材,共有9种动画

创建预制体,并为每个预制体创建动画和脚本
预制体包括读报僵尸和读报僵尸的头、读报僵尸的身体三部分,分别加上动画和脚本。
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using UnityEngine.Events;
public class PaperZombie : ZombieBase
{
protected override int MaxHP => 700;
protected override float speed => 4;
protected override float attackValue => 100;
protected override GameObject Prefab => GameManager.Instance.GameConf.PaperZombie;
protected override bool isSpecial => true;
public override Vector2 offset => new Vector2(-0.6f,-0.4f);
private bool isLostPaper = false;
public override void SpecialMove()
{
// 如果当前网格为空跳过移动检测
if (currGrid == null) return;
currGrid = GridManager.Instance.GetGridByWorldPos(transform.position + (Vector3)offset);
// 当前网格中有植物 并且 他在我的左边 并且距离很近
// 而且他可以被僵尸吃
if (currGrid.HavePlant
&& CurrGrid.CurrPlantBase.ZombieCanEat
&& currGrid.CurrPlantBase.transform.position.x < transform.position.x + ((Vector3)offset).x
&& transform.position.x + ((Vector3)offset).x - currGrid.CurrPlantBase.transform.position.x < 0.3f)
{
// 攻击这个植物
State = ZombieState.Attack;
return;
}
// 如果我在最左边的网格 并且 我已经越过了它
else if (currGrid.Point.x == 0 && currGrid.Position.x - transform.position.x - ((Vector3)offset).x > 1f)
{
// 我们要走向终点 - 房子
Vector2 pos = transform.position + (Vector3)offset;
Vector2 target = new Vector2(-9.17f, -1.37f);
Vector2 dir = (target - pos).normalized * 3f;
transform.Translate((dir * (Time.deltaTime / 1)) / speed);
// 如果我距离终点很近,意味着游戏结束
if (Vector2.Distance(target, pos) < 0.05f)
{
// 触发游戏结束
LVManager.Instance.GameOver();
//BOSSLVmanager.Instance.GameOver();
}
return;
}
if (animator.GetCurrentAnimatorStateInfo(0).IsName("LostPaper")) return; //如果播放丢失报纸动画,不移动
else if (!animator.GetCurrentAnimatorStateInfo(0).IsName("HasPaperWalk") && //如果没有报纸 移动加速
!animator.GetCurrentAnimatorStateInfo(0).IsName("HasPaperAttack"))
transform.Translate((new Vector2(-1.33f * 2, 0) * (Time.deltaTime / 1)) / speed);
else
{
transform.Translate((new Vector2(-1.33f, 0) * (Time.deltaTime / 1)) / speed);
}
}
public override void InitZombieHpState()
{
zombieHpState = new ZombieHpState(
0,
new List<int>() {
MaxHP, 400,100, },
new List<string>() {
"HasPaperWalk", "LostPaperWalk", "LostHeadWalk" },
new List<string>() {
"HasPaperAttack", "LostPaperAttack", "LostHeadAttack" },
new List<UnityAction>() {
null, CheckLostPaper,CheckLostHead }
);
}
public override void OnDead()
{
if (!isSpecialDie) //如果不是特殊死法
{
// 创建一个死亡身体
PaperZombie_DieBody body = PoolManager.Instance.GetObj(GameManager.Instance.GameConf.PaperZombie_Diebody).GetComponent<PaperZombie_DieBody>();
body.Init(animator.transform.position);
}
}
private void CheckLostPaper()
{
if (!isLostPaper)
{
// 报纸需要失去
isLostPaper = true;
// 播放失去报纸动画
animator.Play("LostPaper");
StartCoroutine(CheckLost());
}
}
IEnumerator CheckLost()
{
while (true)
{
yield return new WaitForSeconds(0.05f);
if (animator.GetCurrentAnimatorStateInfo(0).normalizedTime >= 1)
{
// 检测状态
CheckState();
}
}
}
/// <summary>
/// 检查掉头
/// </summary>
private void CheckLostHead()
{
if (!isLostHead)
{
// 头需要失去
isLostHead = true;
// 创建一个头
PaperZombie_Head head = PoolManager.Instance.GetObj(GameManager.Instance.GameConf.PaperZombie_Head).GetComponent<PaperZombie_Head>();
head.Init(animator.transform.position);
// 状态检测
CheckState();
}
}
}
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
public class PaperZombie_Head : BaseEFObj
{
public override string AnimationName => "PaperZombie_Head";
public override GameObject PrefabForObjPool => GameManager.Instance.GameConf.PaperZombie_Head;
}
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
public class PaperZombie_DieBody : BaseEFObj
{
public override string AnimationName => "PaperZombie_Diebody";
public override GameObject PrefabForObjPool => GameManager.Instance.GameConf.PaperZombie_Diebody;
/// <summary>
/// 用于炸死时的初始化
/// </summary>
public void InitForBoomDie(Vector2 pos)
{
Init(pos, "Zombie_BoomDie");
}
}
版权声明
本文为[azzin]所创,转载请带上原文链接,感谢
https://blog.csdn.net/azzin/article/details/124216868
边栏推荐
猜你喜欢

How to quickly turn off the classic FET - Kia MOS transistor

如何保障缓存和数据库的一致性(超详细案例)

软件测试基础知识,看完就可以和面试官硬碰硬

【dpdk】10.dpdk-dns学习笔记

浙政钉扫码登录

MOS tube driving circuit and precautions - Kia MOS tube

Detailed explanation of Navicat 15 installation and related problems

uni-app项目之 商品列表的下拉刷新 与 上拉加载更多

Oracle 18C RAC installation grid execution script root SH error, prcr-1013: unable to start resource ora ons

Kernel pwn 基础教程之 Heap Overflow
随机推荐
pytorch模型加载跑测试集和训练过程中跑测试集结果不一致的问题?
ShardingSphere分库分表
R语言进阶|广义向量和属性解析
Oracle 18C RAC installation grid execution script root SH error, prcr-1013: unable to start resource ora ons
经典场效应管如何快速关断技巧-KIA MOS管
PHP & Laravel & 掌握 api 生成 token 的几种方式以及一些注意事项(坑)
理解MySQL的MVCC同一个事务第一次快照读和第二次快照读——笔记
mySQL基础记录
server 2019服务器可用内存是实际内存的一半
一文学会text-justify,orientation,combine文本属性
npm yarn 启动报错【已解决】
Easy to use screenshot software
好用的截图软件
ANSI标准库中的time.h头文件
ShardingSphere简介与分表使用
【dpdk】10.dpdk-dns学习笔记
uni-app项目之 商品列表的下拉刷新 与 上拉加载更多
QT布局管理复习
jsp页面嵌套
微搭低代码零基础入门课(第二课)