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

news2024/11/25 0:47:05

文章目录

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

本节最终效果

在这里插入图片描述

前言

本节紧跟着上一篇,主要实现敌人受击死亡效果特效,主角等级、击杀数、经验、血条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.coloradmin.cn/o/1265425.html

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

相关文章

C# datagridview控件 绑定数据库中表中数据的方式-3

1.如下图所示&#xff0c;为数据库中的一张表结构&#xff0c;注意该表中共有11个字段 2.首先在窗体后台代码中拖入一个datagridview控件&#xff0c;并在窗体加载时&#xff0c;给datagridview控件添加列&#xff0c;添加的方式如下所示&#xff1a;请注意&#xff0c;每个列…

机器学习笔记 - 基于百度飞桨PaddleSeg的人体分割

一、简述 虽然Segment Anything用于图像分割的通用大模型看起来很酷(飞桨也提供分割一切的模型),但是个人感觉落地应用的时候心里还是更倾向于飞桨这种场景式的,因为需要用到一些人体分割的需求,所以这里主要是对飞桨高性能图像分割开发套件进行了解和使用,但是暂时不训练…

docker镜像原理

什么是镜像 容器解决应用开发、测试和部署的问题&#xff0c;而镜像解决应用部署环境问题。镜像是一个只读的容器模板&#xff0c; 打包了应用程序和应用程序所依赖的文件系统以及启动容器的配置文件&#xff0c;是启动容器的基础。镜像所打 包的文件内容就是容器的系统运行环…

SLURM资源调度管理系统REST API服务配置,基于slurm22.05.9,centos9stream默认版本

前面给大家将了一下slurm集群的简单配置&#xff0c;这里给大家再提升一下&#xff0c;配置slurm服务的restful的api&#xff0c;这样大家可以将slurm服务通过api整合到桌面或者网页端&#xff0c;通过桌面或者网页界面进行管理。 1、SLURM集群配置 这里请大家参考&#xff1…

【古月居《ros入门21讲》学习笔记】14_参数的使用与编程方法

目录 说明&#xff1a; 1. 参数模型&#xff08;全局字典&#xff09; 2. 实现过程&#xff08;C&#xff09; 创建功能包 参数命令行的使用 YAML参数文件 rosparam命令 使用示例 编程方法&#xff08;C&#xff09; 配置代码编译规则 编译并运行 编译 运行 3. 实…

开源堡垒机Jumpserver

文章目录 开源堡垒机JumpserverJumpserver介绍安装环境部署安装jumpserver访问jumpserver的web界面 开源堡垒机Jumpserver Jumpserver介绍 Jumpserver 是全球首款完全开源的堡垒机&#xff0c;使用 GNU GPL v2.0 开源协议&#xff0c;是符合 4A 的运维安全审计系统。 Jumpse…

天鹅湖国家旅游度假区 | 展柜OLED透明屏:创新展示提升互动体验

天鹅湖国家旅游度假区 | 展柜OLED透明屏 产品&#xff1a;一块55寸OLED透明屏嵌入玻璃安装 应用场景&#xff1a;用在天鹅湖国家旅游度假区——三门峡城市文化客厅展馆中的一个透明展示柜&#xff0c;用一块55寸OLED透明屏嵌入展示柜的玻璃&#xff0c;让观众即可以看到展柜里…

【赠书第9期】巧用ChatGPT高效搞定Excel数据分析

文章目录 前言 1 操作步骤 1.1 数据清理和整理 1.2 公式和函数的优化 1.3 图表和可视化 1.4 数据透视表的使用 1.5 条件格式化和筛选 1.6 数据分析技巧 1.7 自动化和宏的创建 2 推荐图书 3 粉丝福利 前言 ChatGPT 是一个强大的工具&#xff0c;可以为你提供在 Exce…

【axios封装】万字长文,TypeScript实战,封装一个axios - 基础封装篇

目录 前言版本环境变量配置引入的类型1、AxiosIntance: axios实例类型2、InternalAxiosRequestConfig: 高版本下AxiosRequestConfig的拓展类型3、AxiosRequestConfig: 请求体配置参数类型4、AxiosError: 错误对象类型5、AxiosResponse: 完整原始响应体类型 目标效果开始封装骨架…

算法通关第十三关-青铜挑战数学基础问题

数组元素积的符号 描述 : 已知函数 signFunc(x) 将会根据 x 的正负返回特定值&#xff1a; 如果 x 是正数&#xff0c;返回 1 。如果 x 是负数&#xff0c;返回 -1 。如果 x 是等于 0 &#xff0c;返回 0 。 给你一个整数数组 nums 。令 product 为数组 nums 中所有元素值的…

视觉测量基础

1. 相机模型 1.1 坐标系转换原理 世界坐标系(world Coords):点在真实世界中的位置&#xff0c;描述相机位置。 相机坐标系(Cameras Coords):以相机光学系统中心&#xff08;镜头中心&#xff09;为原点&#xff0c;建立相机坐标系。 图像物理坐标系(Film Coords):经过小孔成…

pandas教程:2012 Federal Election Commission Database 2012联邦选举委员会数据库

文章目录 14.5 2012 Federal Election Commission Database&#xff08;2012联邦选举委员会数据库&#xff09;1 Donation Statistics by Occupation and Employer&#xff08;按职业与雇主划分的捐赠数据&#xff09;2 Bucketing Donation Amounts&#xff08;桶捐赠额&#x…

面试题:说一下你对 OAuth2 协议原理的理解?

文章目录 OAuth2简介角色流程客服端注册Client Type四种授权模式授权码模式隐藏式密码式凭证式RefreshToken OAuth2简介 OAuth 是一个开放授权协议标准&#xff0c;允许用户授权第三方应用访问他们存储在另外的服务提供者上的信息&#xff0c;而不需要将用户名和密码提供给第三…

【算法】一个简单的整数问题(树状数组、差分)

题目 给定长度为 N 的数列 A&#xff0c;然后输入 M 行操作指令。 第一类指令形如 C l r d&#xff0c;表示把数列中第 l∼r 个数都加 d。 第二类指令形如 Q x&#xff0c;表示询问数列中第 x 个数的值。 对于每个询问&#xff0c;输出一个整数表示答案。 输入格式 第一行…

leetcode面试经典150题——33 最小覆盖子串(滑动窗口)

题目&#xff1a; 最小覆盖子串 描述&#xff1a; 给你一个字符串 s 、一个字符串 t 。返回 s 中涵盖 t 所有字符的最小子串。如果 s 中不存在涵盖 t 所有字符的子串&#xff0c;则返回空字符串 “” 。 注意&#xff1a; 对于 t 中重复字符&#xff0c;我们寻找的子字符串中…

MySQL双主双从数据库集群搭建

1 引言 在之前的文章中提到过相关搭建方法&#xff0c;具体请参考《MySQL主从数据库搭建》这篇文章&#xff0c;本文主要讲述双主双从&#xff0c;双主多从集群的搭建方式。 这里要问一个问题&#xff0c;为什么MySQL要搭建数据库集群呢&#xff1f;我想应该有以下几点原因&…

figma 基础使用 —— 常用方法

一、 导入组件 分成两种方式 &#xff08;1&#xff09;离线的包导入&#xff08;iOS 常用组件.fig 直接拖拽到figma最近网页&#xff09; &#xff08;2&#xff09;在插件市场下载https://www.figma.com/community 二、figma中使用标尺 快捷键&#xff1a;shift R 三、插…

爬虫学习 异步爬虫(五)

多线程 多进程 协程 进程 运行中的程序 线程 被CPU调度的执行过程,操作系统 运算调度的min单位 在进程之中,进程中实际运作单位 from threading import Thread#创建任务 def func(name):for i in range(100):print(name,i)if __name__ __main__:#创建线程t1 Thread(target …

SP3109 STRLCP - Longest Common Prefix 题解

SP3109 STRLCP - Longest Common Prefix 题解 某省某年省选原题出处&#xff0c;看来 CCF 出原题这事由来已久。 简化题意 让你维护一个字符串序列。支持单点修改。支持单点插入。支持询问两个子串的最长公共前缀。 解法 本篇题解前置芝士&#xff1a;无旋 Treap&#xff…

孔明棋,(n + 2) x (m + 2)的棋盘,中间n x m的区域都是棋子,求最后最少剩余几个棋子

题目 #include <iostream> using namespace std; int f(int n, int m) {int t, res;if (n > m){t n;n m;m t;}if (n 1)res (m 1) / 2;else if (n 2){if (m % 3 0)res 2;elseres 1;}else if (n 3){res 2;}return res; } int change(int x) {x % 3;if (x 0…