当前位置: 首页 > news >正文

【用unity实现100个游戏之9】使用Unity制作类八方旅人、饥荒风格的俯视角2.5D游戏

前言

2.5D游戏 是一种介于二维和三维之间的游戏形式。它通常在二维平面上展示游戏内容,但利用三维技术来实现更加逼真的图像效果。

在2.5D游戏中,角色和环境通常是以平面的形式呈现,但可以在垂直方向上移动。这意味着玩家可以在一个相对较薄的虚拟空间内进行自由探索和交互,同时享受到更加立体感的视觉效果。

与传统的二维游戏相比,2.5D游戏可以通过使用透视、光影效果和深度感等技术来增强场景的真实感。这为玩家提供了更好的沉浸式体验,同时保留了传统2D游戏的简单和直观性。

许多平台游戏、角色扮演游戏和冒险游戏都采用了2.5D的形式,从而使玩家能够在一个相对较小的空间内尽情探索。2.5D游戏的发展也受益于技术的进步,使得游戏制作人员能够创建更加精美、逼真的图像效果,为玩家带来更好的游戏体验。

这种类型的游戏在平台游戏、动作游戏和冒险游戏等类型中比较常见, 例如八方旅人、饥荒这种游戏就是2.5D这类游戏的标杆之作了。

先来看看本文实现的最终效果
在这里插入图片描述

素材

https://assetstore.unity.com/packages/2d/characters/tiny-rpg-forest-114685
在这里插入图片描述

一、绘制地图

首先我们需要搭建一个地图用于游戏测试,这里使用Unity的 Tile Map Editor 来搭建一个简单的地图。

在这里插入图片描述
层级需要特别注意,这里把 TileMap Renderer 的 Order in Layer 设置为0,这一层用于最下层背景显示,防止遮盖到其他对象。

搭建好的地图如下所示:
在这里插入图片描述

此时还需要在地图中增加一些场景物品,如大树、石头等等。

这里在面板中右键 2D Object -> Sprite 创建一个Sprite,然后在Sprite Renderer中设置想要的场景物体精灵图即可,这里要把 Order in Layer 设置为1,否则会看不到新创建的对象。
在这里插入图片描述
同时 要给这些添加的场景物品增加碰撞器,让玩家不能穿过该物体。
在这里插入图片描述
下面是添加完场景物品后的地图,看起来内容丰富了不少,效果好了很多。
在这里插入图片描述
在场景中新建一个游戏对象InteractionObject,将这些新建的场景物体全部放到InteractionObject对象下当做子物体,方便后期统一处理。

二、添加玩家动画和移动等操作

接下来再创建一个Sprite作为玩家,将 Order in Layer 层级 设置为1,并给玩家添加 Rigidbody2D刚体 和 Collider碰撞体并适当的调整大小。
在这里插入图片描述

接下来在Project下右键 Create -> Animatior Controller创建一个 Animatior Controller 用来管理玩家的动画,主要有 上、下、左、右移动和默认的Idle动画。

点开Animatior面板后创建两个 BlendTree混合树 。
在这里插入图片描述

接下来在Animator面板创建两个 Float类型的参数 InputX 和 InputY 用来在混合树中接收使用。
在这里插入图片描述
双击点开Idle混合树,将Blend Type设置为 2D Simple Doirectional,这样我们就有两个参数用来表示二维平面上移动。
在这里插入图片描述
然后点击混合树面板的 + 添加四个Motion,分别将Idle的上、下、左、右动画添加上去,并将对应的PosX和PosY数值添加上去。

这里的PosX和PosY代表分别代表玩家按下X轴和Y轴的方向。

例如 PosX为1时代表玩家按下右方向键 此时X轴上的值为1,所以播放Idle_Right动画;
PosY为1时代表玩家按下上方向键 此时Y轴上的值为1,所以播放Idle_Back动画。
在这里插入图片描述
同样的操作给Walk混合树也配置一下。
在这里插入图片描述
然后在Animator面板继续添加一个Bool类型的参数 IsMove,用来控制玩家的Idle和Walk状态的切换。
在这里插入图片描述
在这里插入图片描述
这样我们角色的动画就算配置好了,接下来写代码完成角色的移动方法和动画的播放就好了。

如果动画这块还不是很明白的话,也可以再去学习一下Unity中的动画相关知识:
Unity零基础到入门 ☀️| 近万字教程 对 Unity 中的 动画系统基础 全面解析+实战演练。

创建一个脚本PlayerMovement ,将其挂载到玩家身上。

using System.Collections;
using System.Collections.Generic;
using UnityEngine;public class PlayerMovement : MonoBehaviour
{public float speed;new private Rigidbody2D rigidbody;private Animator animator;private float inputX, inputY;private float stopX, stopY;void Start(){rigidbody = GetComponent<Rigidbody2D>();animator = GetComponent<Animator>();}void Update(){inputX = Input.GetAxisRaw("Horizontal");inputY = Input.GetAxisRaw("Vertical");//让玩家根据自己本地坐标进行向量计算Vector2 input = (transform.right * inputX + transform.up * inputY).normalized;rigidbody.velocity = input * speed;if (input != Vector2.zero){animator.SetBool("IsMove", true);stopX = inputX;stopY = inputY;}else{animator.SetBool("IsMove", false);}animator.SetFloat("InputX", stopX);animator.SetFloat("InputY", stopY);}
}

可以选择将Main Camera放到玩家对象当做子物体,这样玩家移动时相机也可以跟着玩家移动,此时运行程序进行测试。
在这里插入图片描述
可以看到,此时的游戏画面就是单纯的2D游戏画面,看起来也没有2.5D的既视感,所以还需要对相机进行设置。

三、视角配置

调整摄像机与场景对象的角度

相机的设置其实很简单,只需要让其视选择45°,以俯视角的视角来观看场景。

先来新建一个游戏对象CameraPosition,将MainCamera放到该物体下作为子对象,再将MainCamera的Rotation设置为(-45,0,0),Position的数值可以根据搭建的地图进行微调,新建一个脚本RotatingCamera挂载到该对象上。网址:yii666.com

该脚本的作用是让相机一直跟随玩家移动,脚本内容如下:

using System.Collections;
using System.Collections.Generic;
using UnityEngine;public class RotatingCamera : MonoBehaviour
{private Transform player;void Start(){player = GameObject.FindGameObjectWithTag("Player").transform;}void Update(){transform.position = player.position;}
}

再新建一个脚本FacingCamera,将其挂载到前面搭建的场景对象的父物体InteractionObject上。

该脚本的作用是让该对象下的所有子物体的角度始终与相机的旋转角度对齐(面向摄像机),代码如下:

using UnityEngine;public class FacingCamera : MonoBehaviour
{Transform[] childs;void Start(){childs = new Transform[transform.childCount];for (int i = 0; i < transform.childCount; i++){childs[i] = transform.GetChild(i);}}void Update(){for (int i = 0; i < childs.Length; i++){childs[i].rotation = Camera.main.transform.rotation;}}
}

此时运行游戏查看效果:
在这里插入图片描述

增加镜头旋转功能

在有些2.5D游戏中还支持镜头的旋转(比如饥荒),这里也加上这个功能看一下效果。

首先要修改RotatingCamera的代码:

using System.Collections;
using System.Collections.Generic;
using UnityEngine;public class RotatingCamera : MonoBehaviour
{public float rotateTime = 0.2f;private Transform player;private bool isRotating = false;void Start(){player = GameObject.FindGameObjectWithTag("Player").transform;}void Update(){transform.position = player.position;Rotate();}void Rotate(){if (Input.GetKeyDown(KeyCode.Q) && !isRotating){StartCoroutine(RotateAround(-45, rotateTime));}if (Input.GetKeyDown(KeyCode.E) && !isRotating){StartCoroutine(RotateAround(45, rotateTime));}}IEnumerator RotateAround(float angel, float time){float number = 60 * time;float nextAngel = angel / number;isRotating = true;WaitForFixedUpdate wait = new WaitForFixedUpdate();for (int i = 0; i < number; i++){transform.Rotate(new Vector3(0, 0, nextAngel));yield return wait;}isRotating = false;}
}

加入一个按下 Q/E 键进行旋转的方法,通过协程每次按下时旋转45°,此时就大功告成了,下面一起看一下最终效果。
在这里插入图片描述

四、游戏效果展示

下面是2D风格 和 2.5D风格的对比,相对于2D画面,此处的2.5D仅仅是增加了一个相机的拍摄角度,画面风格看起来就有挺大的差异。

2D风格2.5D风格
在这里插入图片描述在这里插入图片描述

结束

真正在制作2.5D游戏时,有非常多的细节需要处理,对于美术风格的标准要求也比较高,制作出来的画面也会更加好看。
在这里插入图片描述
在这里插入图片描述

  • 本文讲了一下关于2.5D游戏及其制作方法的演示。
  • 关于2.5D很多人的说法都不同,制作方案也有很多种,本文演示的也只是其中的一种解决方案。
  • 主要还是让大家了解一下关于2.5D的知识,以及简单的制作方法,不至于在提及2.5D游戏时一脸茫然。

源码

https://github.com/RedFF0000/Don-t-Starve

参考

【视频】https://www.bilibili.com/video/BV1DT4y1A7DJ/

完结

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

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

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

相关文章:

【用unity实现100个游戏之9】使用Unity制作类八方旅人、饥荒风格的俯视角2.5D游戏

前言 2.5D游戏 是一种介于二维和三维之间的游戏形式。它通常在二维平面上展示游戏内容&#xff0c;但利用三维技术来实现更加逼真的图像效果。 在2.5D游戏中&#xff0c;角色和环境通常是以平面的形式呈现&#xff0c;但可以在垂直方向上移动。这意味着玩家可以在一个相对较薄…...

如何在群晖中,正确配置 docker 的 ipv6 地址

参考 2023年9月12日 https://synocommunity.com/ https://github.com/wangliangliang2/fix_synology_docker_ipv6 https://post.smzdm.com/p/an3np8m7/ 正文 关于这个话题&#xff0c;国内搜索引擎得到的结果出奇的一致&#xff0c;且过时。 &#xff08;看的我脑壳痛&#…...

XSS入门 XSS Challenges

level1(直接注入) <script>alert(xss)</script>level2(双引号闭合标签) 测试 <sCr<ScRiPt>IPT>OonN"\/(hrHRefEF)</sCr</ScRiPt>IPT>发现<>"被转换&#xff0c;构造新的语句 "><script>alert(/xss/)</…...

李沐《动手学深度学习》torch.cat() 和 torch.stack()的区别及思考

一、问题引出 好久没更新啦&#xff01;最近在学习沐神《动手学深度学习》6.5节池化层的时候&#xff0c;发现沐神在两处相似的地方使用了两种Python拼接函数torch.cat()和torch.stack()&#xff1a; 百思不得其解&#xff0c;于是查阅相关文档之后终于弄清楚了两者之间的区别…...

【算法与数据结构】235、LeetCode二叉搜索树的最近公共祖先

文章目录 一、题目二、解法三、完整代码 所有的LeetCode题解索引&#xff0c;可以看这篇文章——【算法和数据结构】LeetCode题解。 一、题目 二、解法 思路分析&#xff1a;本题和这道题类似【算法与数据结构】236、LeetCode二叉树的最近公共祖先&#xff0c;相同的算法也能解…...

bboss 流批一体化框架 与 数据采集 ETL

数据采集 ETL 与 流批一体化框架 特性&#xff1a; 高效、稳定、快速、安全 bboss 是一个基于开源协议 Apache License 发布的开源项目&#xff0c;主要由以下三部分构成&#xff1a; Elasticsearch Highlevel Java Restclient &#xff0c; 一个高性能高兼容性的Elasticsea…...

JVM详细教程

JVM 前言 还在完善中先发布 JVM虚拟机厂家多钟多样&#xff0c;具体实现细节可能不一样&#xff0c;这里主要讲的是虚拟机的规范&#xff0c;以下内容融合了各个平台发布的内容和周志明老师的《深入理解java虚拟机》 JVM概述 如何理解jvm跨平台&#xff1f; 编译成汇编代码…...

Smartbi吴华夫:后疫情时代,BI发展趋势的观察与应对

沿着旧地图找不到新大陆&#xff0c;“基于指标体系的可视化分析和增强分析”成为BI发展新阶段。Smartbi V11系列新品与时俱进&#xff0c;以指标为核心&#xff0c;同时融合BI应用&#xff0c;赋能管理者和业务&#xff0c;成为引领数字化运营的新航标&#xff01; ——思迈特…...

软件设计模式系列之三———工厂方法模式

1 模式的定义 工厂方法模式是一种常见的设计模式&#xff0c;属于创建型设计模式之一&#xff0c;它在软件工程中用于对象的创建。该模式的主要思想是将对象的创建过程抽象化&#xff0c;将具体对象的实例化延迟到子类中完成&#xff0c;以便在不同情况下可以创建不同类型的对…...

pytorch 多卡分布式训练 调用all_gather_object 出现阻塞等待死锁的问题

pytorch 多卡分布式训练 torch._C._distributed_c10d中的函数all_gather_object 出现阻塞等待死锁的问题 解决办法就是 在进程通信之前调用torch.cuda.set_device(local_rank) For NCCL-based processed groups, internal tensor representations of objects must be moved …...

SpringMvc增删改查

SpringMvc增删改查 一、前期准备二、逆向生成增删改查2.2.aspect切面层2.3.Mybatis generator逆向生成2.4.根据生成代码编写Biz层与实现类 三、controller层代码编写四、前台代码与分页代码五、案例测试 一、前期准备 1.2.导入pom.xml依赖 <?xml version"1.0" …...

【计算机网络】网络编程接口 Socket API 解读(5)

Socket 是网络协议栈暴露给编程人员的 API&#xff0c;相比复杂的计算机网络协议&#xff0c;API 对关键操作和配置数据进行了抽象&#xff0c;简化了程序编程。 本文讲述的 socket 内容源自 Linux man。本文主要对各 API 进行详细介绍&#xff0c;从而更好的理解 socket 编程。…...

手动实现一个bind函数!

原文地址&#xff1a;手动实现一个bind函数&#xff01; - 知乎 1.bind函数用法 bind()方法用于创建一个新的函数&#xff0c;这个新函数接收的第一个参数代表的就是this&#xff0c;利用bind()函数我就就可以任意改变函数内部的this指向了。 官网的解释&#xff1a; bind()…...

数据结构-时间复杂度/空间复杂度

Hello&#xff0c;好久没有更新了哦&#xff0c;已经开始学习数据结构了&#xff0c;这篇文章呢就是对刚学数据结构所接触到的时间复杂度进行一个分享哦&#xff0c;如果有错误之处&#xff0c;大家记得拍拍我哦~ 既然要讨论时间/空间复杂度&#xff0c;那我们就得知道时间/空…...

英语写作中“展示”、“表明”demonstrate、show、indicate、illustrate的用法

一、demonstrate、show、indicate在论文写作中主要用法是&#xff1a;demonstrate/show/indicate 从句&#xff1a; Sb./Sth. demonstrates/shows/indicates that ……从句中一般表达事实、观点和结论等。 例句&#xff1a; The authors demonstrated/showed/indicated that…...

Redis的java客户端

在Redis官网中提供了各种语言的客户端&#xff0c;地址&#xff1a;https://redis.io/resources/clients/ redis的java客户端 https://redis.io/resources/clients/#java 1.jedis使用 引入依赖 <dependency><groupId>redis.clients</groupId><artifac…...

Android环境配置笔记

文章目录 一、各环境文档二、参考 一、各环境文档 Gradle官方的兼容性文档&#xff1a;Java Compatibility 更新日期&#xff1a;2023.9.12 Android Gradle插件版本&#xff1a;Android Gradle Plugin 二、参考 参考文章&#xff1a;Android问题记录...

element-table 行的拖拽更改顺序(无需下载sortableJs

样例展示&#xff1a;vueelement 通过阅读element文档我们发现element并不提供拖拽相关的api 本博客通过element提供的行类名 注册函数 实现行与行的拖拽 1.设置el-table 的行样式类名 这里是用的是 function <el-table:data"outputData":row-class-name&qu…...

Docker部署jenkins

目录 一、jenkins原理二、Docker部署jenkins1.下载jenkins镜像文件2.查看下载的jenkins镜像3.创建Jenkins挂载目录并授权权限4.创建并启动Jenkins容器5.查看jenkins是否启动成功6.查看docker容器日志7.配置镜像加速8.访问Jenkins页面&#xff0c;输入ip地址加上9000端口9.获取管…...

从0到1学会Git(第三部分):Git的远程仓库链接与操作

写在前面:前面两篇文章我们已经学会了git如何在本地进行使用&#xff0c;这篇文章将讲解如何将本地的git仓库和云端的远程仓库链接起来并使用 为什么要使用远程仓库:因为我们需要拷贝我们的代码给别人以及进行协同开发&#xff0c;就需要有一个云端仓库进行代码的存储和同步&a…...

【技术解构】LPRNet_Pytorch:如何用轻量级模型实现工业级车牌识别

【技术解构】LPRNet_Pytorch&#xff1a;如何用轻量级模型实现工业级车牌识别 【免费下载链接】LPRNet_Pytorch Pytorch Implementation For LPRNet, A High Performance And Lightweight License Plate Recognition Framework. 项目地址: https://gitcode.com/gh_mirrors/l…...

别再只用总基尼系数了!用Python实现Dagum分解,看清区域差距的‘里子’

用Python拆解经济差距&#xff1a;Dagum基尼系数分解实战指南 当一份区域经济报告只给出一个总的基尼系数时&#xff0c;就像医生只告诉你"体温偏高"却不说明是哪个器官发炎——数据研究者常陷入这种诊断困境。传统基尼系数虽能反映整体不平等程度&#xff0c;却无法…...

算法高频核心:网格方向遍历从入门到精通

摘要:二维网格方向遍历是算法笔试、面试绝对高频考点,覆盖井字棋、五子棋、岛屿统计、单词搜索、游戏模拟等场景。本文用一套通用方向数组模板,打通 4 方向 / 8 方向遍历、k 连珠判定、DFS 连通块、回溯搜索四大题型,附完整可运行 C++ 代码与 LeetCode 原题对照,新手也能快…...

OpenClaw+QwQ-32B客服模拟:电商问答自动化测试

OpenClawQwQ-32B客服模拟&#xff1a;电商问答自动化测试 1. 为什么需要自动化客服测试 去年双十一前&#xff0c;我们团队遇到了一个棘手问题&#xff1a;每次大促前&#xff0c;客服团队都要手动测试上百个产品页面的问答话术。人工测试不仅耗时耗力&#xff0c;还经常遗漏…...

爱享素材下载器:跨平台资源下载的终极解决方案

爱享素材下载器&#xff1a;跨平台资源下载的终极解决方案 【免费下载链接】res-downloader 资源下载器、网络资源嗅探&#xff0c;支持微信视频号下载、网页抖音无水印下载、网页快手无水印视频下载、酷狗音乐下载等网络资源拦截下载! 项目地址: https://gitcode.com/GitHub…...

风电功率预测发SCI,别只盯着1区:这些2/3区‘潜力股’期刊也许更适合你

风电功率预测SCI投稿策略&#xff1a;如何在中科院2/3区期刊高效突围 风电功率预测作为新能源与人工智能交叉领域的热点方向&#xff0c;近年来在学术期刊投稿竞争日趋激烈。许多研究者习惯性瞄准中科院1区顶刊&#xff0c;却忽略了审稿周期长、录用率低的现实困境。事实上&…...

从‘拍糊了’到‘秒对焦’:深入拆解手机AF(自动对焦)与VCM马达工作原理

从‘拍糊了’到‘秒对焦’&#xff1a;深入拆解手机AF&#xff08;自动对焦&#xff09;与VCM马达工作原理 你是否曾在拍摄孩子奔跑的瞬间、宠物跳跃的刹那&#xff0c;或是夜景中闪烁的霓虹时&#xff0c;发现手机镜头反复"拉风箱"、对焦迟疑&#xff0c;最终错失精…...

实战教程:3分钟掌握高效抖音内容保存方案

实战教程&#xff1a;3分钟掌握高效抖音内容保存方案 【免费下载链接】douyin-downloader 项目地址: https://gitcode.com/GitHub_Trending/do/douyin-downloader 还在为喜欢的抖音内容无法保存而烦恼吗&#xff1f;这款完全免费的抖音下载工具正是你需要的专业解决方案…...

Retrieval-based Voice-Conversion-WebUI 专业指南:从认知到实践的语音转换技术全解

Retrieval-based Voice-Conversion-WebUI 专业指南&#xff1a;从认知到实践的语音转换技术全解 【免费下载链接】Retrieval-based-Voice-Conversion-WebUI 语音数据小于等于10分钟也可以用来训练一个优秀的变声模型&#xff01; 项目地址: https://gitcode.com/GitHub_Trend…...

终极终端效率提升指南:au/autocomplete如何让命令输入快如闪电

终极终端效率提升指南&#xff1a;au/autocomplete如何让命令输入快如闪电 【免费下载链接】autocomplete 为你的现有终端和Shell提供类似IDE风格的自动补全功能 项目地址: https://gitcode.com/GitHub_Trending/au/autocomplete 在当今快节奏的开发环境中&#xff0c;终…...