【用unity实现100个游戏之17】从零开始制作一个类幸存者肉鸽(Roguelike)游戏4(附项目源码)

文章目录

  • 本节最终效果
  • 前言
  • 命中敌人闪白和击退效果
  • 敌人死亡效果
  • 等级 击杀数 经验
  • 绘制经验条
  • 显示等级和杀敌数
  • 游戏倒计时
  • 玩家血条
  • 参考
  • 源码
  • 完结

本节最终效果

在这里插入图片描述

前言

本节紧跟着上一篇,主要实现敌人受击死亡效果特效,主角等级、击杀数、经验、血条UI显示。

命中敌人闪白和击退效果

敌人动画配置
在这里插入图片描述

修改Enemy

WaitForFixedUpdate wait;void Awake()
{//。。。wait = new WaitForFixedUpdate();//等待下一帧 FixedUpdate() 调用
}void FixedUpdate()
{//anim.GetCurrentAnimatorStateInfo(0).IsName("Hit")判断0层(第一个层级)的动画状态是否为名为 "Hit" 的状态if (!isLive || anim.GetCurrentAnimatorStateInfo(0).IsName("Hit")) return;//。。。
}void OnTriggerEnter2D(Collider2D collision)
{//...StartCoroutine(KnockBack()); // 启动协程,执行击退效果if (health > 0){anim.SetTrigger("Hit"); // 播放受击动画}//...
}IEnumerator KnockBack()
{yield return wait; // 等待一段时间Vector3 playerPos = GameManager.instance.player.transform.position; // 获取玩家的位置Vector3 dirVec = transform.position - playerPos; // 计算从玩家位置指向当前位置的方向向量rigid.AddForce(dirVec.normalized * 3, ForceMode2D.Impulse); // 施加一个以该方向为单位向量的冲量,实现击退效果
}

效果
在这里插入图片描述

敌人死亡效果

敌人死亡动画
在这里插入图片描述
修改Enemy

Collider2D coll;coll = GetComponent<Collider2D>();private void OnEnable()
{target = GameManager.instance.player.GetComponent<Rigidbody2D>();isLive = true;health = maxHealth;coll.enabled = true;rigid.simulated = true;spriter.sortingOrder = 1;anim.SetBool("Dead", false);
}private void Update()
{if (anim.GetCurrentAnimatorStateInfo(0).IsName("Dead")){//持续的获取动画进度AnimatorStateInfo info = anim.GetCurrentAnimatorStateInfo(0);if (info.normalizedTime >= 1){//当播放完动画后Dead();}}
}void OnTriggerEnter2D(Collider2D collision)
{//...else{isLive = false;coll.enabled = false;rigid.simulated = false;spriter.sortingOrder = 0;//死亡降低排序,不要遮挡其他敌人anim.SetBool("Dead", true);}
}

效果
在这里插入图片描述

等级 击杀数 经验

修改

public int level;//等级
public int kill;//杀敌数
public int exp;//经验值
public int[] nextExp = { 3, 5, 10, 100, 150, 210, 280, 360, 450, 600 };//升级梯度//加经验和升级
public void GetExp(){exp++;if(exp == nextExp[level]){level ++;exp = 0;}
}

修改Enemy,敌人死亡加经验和杀敌数

void OnTriggerEnter2D(Collider2D collision)
{//...else{//...GameManager.instance.kill++;GameManager.instance.GetExp();}
}

效果,击杀敌人数据跟着增长
在这里插入图片描述

绘制经验条

画布配置
在这里插入图片描述
新增滑动条,配置如下
在这里插入图片描述
配置背景图
在这里插入图片描述
效果
在这里插入图片描述
新增HUD,用于显示不同类型信息的脚本

public class HUD : MonoBehaviour
{public enum InfoType { Exp, Level, Kill, Time, Health } // 信息类型枚举public InfoType type; // 当前信息类型TextMeshProUGUI myText; // 文本组件Slider mySlider; // 滑动条组件void Awake(){myText = GetComponent<TextMeshProUGUI>();mySlider = GetComponent<Slider>();}void LateUpdate(){switch (type){case InfoType.Exp:// 处理经验信息逻辑float curExp = GameManager.instance.exp;float maxExp = GameManager.instance.nextExp[GameManager.instance.level];mySlider.value = curExp / maxExp;break;case InfoType.Level:// 处理等级信息逻辑break;case InfoType.Kill:// 处理击杀信息逻辑break;case InfoType.Time:// 处理时间信息逻辑break;case InfoType.Health:// 处理生命值信息逻辑break;}}
}

挂载脚本
在这里插入图片描述
效果
在这里插入图片描述

显示等级和杀敌数

绘制UI
在这里插入图片描述

修改HUD

case InfoType.Level:// 处理等级信息逻辑myText.text = "Lv." + GameManager.instance.level;break;
case InfoType.Kill:// 处理击杀信息逻辑myText.text = GameManager.instance.kill.ToString();break;

挂载脚本
在这里插入图片描述
在这里插入图片描述
效果
在这里插入图片描述

游戏倒计时

绘制UI
在这里插入图片描述
修改HUD

case InfoType.Time:// 处理时间信息逻辑float remainTime = GameManager.instance.maxGameTime - GameManager.instance.gameTime;int min = Mathf.FloorToInt(remainTime / 60);int sec = Mathf.FloorToInt(remainTime % 60);myText.text = min + ":" + sec;break;

挂载脚本
在这里插入图片描述
效果
在这里插入图片描述

玩家血条

参考:
unity实现延迟虚血,掉血缓冲的血条效果
unity 3种办法实现血条效果并实现3d世界血条一直看向摄像机

绘制血条UI,和经验条差不多的方法,绘制即可,换个背景图
在这里插入图片描述
修改GameManager

public int health;//当前生命值
public int maxHealth = 100;//最大生命值private void Start() {health = maxHealth;
}

修改HUD

case InfoType.Health:// 处理生命值信息逻辑float curHeadlth = GameManager.instance.health;float maxHealth = GameManager.instance.maxHealth;mySlider.value = curHeadlth / maxHealth;break;

挂载脚本
在这里插入图片描述
运行可以看到血条并不会跟随,因为我们把血条放在了UI屏幕上
在这里插入图片描述
新增Follow,控制血条跟随

public class Follow : MonoBehaviour
{RectTransform rect; // UI元素的RectTransform组件void Awake(){rect = GetComponent<RectTransform>();}void FixedUpdate(){// 将玩家的世界坐标转换为屏幕坐标,并将UI元素的位置设置为屏幕坐标rect.position = Camera.main.WorldToScreenPoint(GameManager.instance.player.transform.position);}
}

挂载脚本
在这里插入图片描述
效果
在这里插入图片描述

参考

【视频】https://www.youtube.com/watch?v=MmW166cHj54&list=PLO-mt5Iu5TeZF8xMHqtT_DhAPKmjF6i3x

源码

源码在最后一节

完结

赠人玫瑰,手有余香!如果文章内容对你有所帮助,请不要吝啬你的点赞评论和关注,以便我第一时间收到反馈,你的每一次支持都是我不断创作的最大动力。当然如果你发现了文章中存在错误或者有更好的解决方法,也欢迎评论私信告诉我哦!

好了,我是向宇,https://xiangyu.blog.csdn.net

一位在小公司默默奋斗的开发者,出于兴趣爱好,于是最近才开始自习unity。如果你遇到任何问题,也欢迎你评论私信找我, 虽然有些问题我可能也不一定会,但是我会查阅各方资料,争取给出最好的建议,希望可以帮助更多想学编程的人,共勉~
在这里插入图片描述

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/179934.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

手写promise A+、catch、finally、all、allsettled、any、race

目录 手写promise 同步版 1.Promise的构造方法接收一个executor()&#xff0c;在new Promise()时就立刻执行executor回调 2.executor()内部的异步任务被放入宏/微任务队列&#xff0c;等待执行 3.状态与结果的管理 状态只能变更一次 4.then()调用成功/失败回调 catch是…

内测分发平台是否支持敏捷开发和持续集成?

大家好&#xff0c;我是咕噜-凯撒。敏捷开发和持续集成是软件开发中非常重要的流程和方法。内测分发平台作为应用开发和测试的关键环节需要具备这种能力。下面我简单的介绍一下敏捷开发和持续集成和提供的功能。图片来源&#xff1a;news.gulufenfa.com 敏捷开发是一种迭代、协…

Asp.net core WebApi 配置自定义swaggerUI和中文注释

1.创建asp.net core webApi项目 默认会引入swagger的Nuget包 <PackageReference Include"Swashbuckle.AspNetCore" Version"6.2.3" />2.配置基本信息和中文注释&#xff08;默认是没有中文注释的&#xff09; 2.1创建一个新的controller using Micr…

SELinux(一) 简介

首发公号&#xff1a;Rand_cs 前段时间的工作遇到了一些关于 SELinux 的问题&#xff0c;初次接触不熟悉此概念&#xff0c;导致当时配置策略时束手束脚&#xff0c;焦头烂额&#xff0c;为此去系统的学习了下 SELinux 的东西。聊 SELinux 之前&#xff0c;先来看看什么叫做访…

Linux以nohup方式运行jar包

1、在需要运行的jar包同级目录下建立启动脚本文件&#xff1a; 文件内容&#xff1a; #! /bin/bash #注意&#xff1a;必须有&让其后台执行&#xff0c;否则没有pid生成 jar包路径为绝对路径 nohup java -jar /usr/local/testDemo/jdkDemo-0.0.1-SNAPSHOT.jar >/us…

C51--4G模块

EC03-DNC&#xff1a;4G通信模块 EC03-DNC 功能特点&#xff1a; 采用最新4G CAT1方案&#xff1b; 支持数据透明传输; 支持TCP、UDP 网络协议; 支持心跳包、注册包功能最大支持64个字节数&#xff1b; 支持MQTT协议&#xff0c;支持接入OneNet平台、百度云平台、阿里云平台的…

微信小程序开发——项目开发入门

版权声明 本文原创作者&#xff1a;谷哥的小弟作者博客地址&#xff1a;http://blog.csdn.net/lfdfhl 概述 本文重点介绍微信小程序开发者工具的下载与安装与项目开发入门。 下载开发者工具 请在官方网站下载微信小程序开发工具&#xff1b;图示如下&#xff1a; 请依据实际…

解决electron-builder打包不成功只能输出tgz文件的问题

现象&#xff1a; 对应项目里配的指令&#xff1a; 但就是死活不成功&#xff0c;只能输出tgz压缩文件。 最后一咬牙下载了官方的electron-quick-start拿来试试&#xff0c;结果还是一样。 一时间没想法了。 后来突然脑袋灵光一闪&#xff0c;去他妈的直接npx 执行看看&…

Java线程通信

线程通信 案例 package com.itheima.d4;public class ThreadTest {public static void main(String[] args) {Desk desk new Desk();//创建3个生产者线程new Thread(() -> {while (true) {desk.put();}}, "厨师1").start();new Thread(() -> {while (true) {…

华为设备使用python实现文件自动保存下载

实验目的&#xff1a; 公司有一台CE12800的设备&#xff0c;管理地址为172.16.1.2&#xff0c;现在需要编写自动化脚本&#xff0c;STELNET实现设备的自动保存配置文件&#xff0c;使用SFTP实现设备的文件下载。 实验拓扑&#xff1a; 实验步骤&#xff1a; 步骤1&#xff1…

Android flutter项目 启动优化实战(二)利用 App Startup 优化项目和使用flutterboost中的问题解决

背景 书接上回&#xff1a; Android flutter项目 启动优化实战&#xff08;一&#xff09;使用benchmark分析项目 已经分析出了问题: 1.缩短总时长&#xff08;解决黑屏问题、懒启动、优化流程&#xff09;、2.优化启动项&#xff08;使用App Startup&#xff09;、3.提升用…

鸿蒙开发学习——应用程序框架

文章目录 UIAbility的生命周期Create状态WindowStageCreateForeground和Background前后台展示控制onWindowStageDestroyDestory 总结 UIAbility的生命周期 感觉这里他讲的不清晰&#xff0c;UIAbility的4个声明周期是Create、Foreground&#xff08;桌面展示&#xff09;、Back…

Java实现通过经纬度求两个任意地点在球面上的距离

我们在实际开发中会获取对应的经纬度&#xff0c;可以使用ES大数据搜索引擎进行计算对应区域的数据&#xff0c;那我们在如何根据两个经纬度获取对应的球面距离&#xff0c;就是在地球上从一个地点到另一个地点的直线距离 工具类如下: public class GeoUtils {// 地球半径&am…

虚幻学习笔记3—UI跟随弹窗

一、前言 本文使用的虚幻引擎5.3.2&#xff0c;继点击场景3D物体的两种处理方式的基础完成对3D物体的点击触发后&#xff0c;我们需要制作一个可以弹窗显示该物体信息的UI面板&#xff0c;同时保证弹窗可以跟随物体。另外还讲了一种UI上的悬浮提示跟随弹窗。 二、实现 2.1、创…

【计算机毕业设计】nodejs+vue音乐播放器系统 微信小程序83g3s

本系统的设计与实现共包含12个表:分别是配置文件信息表&#xff0c;音乐列表评论表信息表&#xff0c;音乐论坛信息表&#xff0c;歌手介绍信息表&#xff0c;音乐资讯信息表&#xff0c;收藏表信息表&#xff0c;token表信息表&#xff0c;用户表信息表&#xff0c;音乐类型信…

viple模拟器使用(四):unity模拟器中实现沿右墙迷宫算法

沿右墙迷宫算法 引导 线控模拟可以使得通过用户手动操作&#xff0c;实现机器人在模拟环境下在迷宫中行走&#xff08;即&#xff1a;运动&#xff09;&#xff0c;算法可以使得机器人按照一定的策略自动行走&#xff0c;沿右墙迷宫算法就是其中的一种策略。 目的 运行程序后&…

Python---lambda表达式

普通函数与匿名函数 在Python中&#xff0c;函数是一个被命名的、独立的完成特定功能的一段代码&#xff0c;并可能给调用它的程序一个返回值。 所以在Python中&#xff0c;函数大多数是有名函数 > 普通函数。但是有些情况下&#xff0c;我们为了简化程序代码&#xff0c;…

AT89S52单片机的定时器

目录 定时器/计数器的结构 工作方式控制寄存器TMOD和TCON 定时器/计数器T1、T0的4种工作方式 1.方式0 2.方式1 3.方式2 4.方式3 定时器/计数器T2的结构与工作方式 1.T2的特殊功能寄存器T2MOD和T2CON 2.特殊功能寄存器T2CON 3.T2的三种工作模式 1. 捕捉方式 2.重新…

IWDG和WWDG HAL库+cubeMX

一.IWDG 1.原理 启用IWDG后&#xff0c;LSI时钟会自动开启 2.IWDG溢出时间计算 3.IWDG配置步骤 4.HAL库相关函数介绍 HAL_IWDG_Init //使能IWDG&#xff0c;设置预分频系数和重装载值等 HAL_IWDG_Refresh //把重装载寄存器的值重载到计数器中&#xff0c;喂狗typedef str…

leetcode:2549. 统计桌面上的不同数字(python3解法)

难度&#xff1a;简单 给你一个正整数 n &#xff0c;开始时&#xff0c;它放在桌面上。在 109 天内&#xff0c;每天都要执行下述步骤&#xff1a; 对于出现在桌面上的每个数字 x &#xff0c;找出符合 1 < i < n 且满足 x % i 1 的所有数字 i 。然后&#xff0c;将这些…