技术标签: Unity 实战100例 教程️ 2.5D游戏 绘制地图 瓦片地图 游戏引擎 游戏 2.5D
2.5D游戏
,本篇文章就来讲一下怎么通过Unity进行2.5D游戏是怎样的以及如何制作2.5D游戏。Tile Map
制作2D地图,通过控制相机角度来形成伪3D来制作2.5D效果的游戏。2.5D游戏
是一种介于二维和三维之间的游戏形式。它通常在二维平面上展示游戏内容,但利用三维技术来实现更加逼真的图像效果。
在2.5D游戏中,角色和环境通常是以平面的形式呈现,但可以在垂直方向上移动。这意味着玩家可以在一个相对较薄的虚拟空间内进行自由探索和交互,同时享受到更加立体感的视觉效果。
与传统的二维游戏相比,2.5D游戏可以通过使用透视、光影效果和深度感等技术来增强场景的真实感。这为玩家提供了更好的沉浸式体验,同时保留了传统2D游戏的简单和直观性。
许多平台游戏、角色扮演游戏和冒险游戏都采用了2.5D的形式,从而使玩家能够在一个相对较小的空间内尽情探索。2.5D游戏的发展也受益于技术的进步,使得游戏制作人员能够创建更加精美、逼真的图像效果,为玩家带来更好的游戏体验。
这种类型的游戏在平台游戏、动作游戏和冒险游戏等类型中比较常见, 例如八方旅人/歧路旅人
这种游戏就是2.5D这类游戏的标杆之作了。
八方旅人画面演示
下面来看一下在Unity中如何制作一款2.5D的游戏吧!
首先我们需要搭建一个地图用于游戏测试,这里使用Unity的 Tile Map Editor
来搭建地图。
Tile Map Editor
的使用方法也很简单,可以看这篇文章学习下怎样使用Tile Map
快速搭建一个地图。
【Unity 实用工具篇】| 学会使用 可编程瓦片Tile Map,快速搭建2D地图
层级需要特别注意,这里把 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
挂载到该对象上。
该脚本的作用是让相机一直跟随玩家移动,脚本内容如下:
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游戏时,有非常多的细节需要处理,对于美术风格的标准要求也比较高,制作出来的画面也会更加好看。
本文由 呆呆敲代码的小Y 原创
学习专栏推荐:Unity系统学习专栏
游戏制作专栏推荐:游戏制作
Unity实战100例专栏推荐:Unity 实战100例 教程
欢迎点赞 收藏 留言 如有错误敬请指正!
未来很长,值得我们全力奔赴更美好的生活
------------------️分割线️-------------------------
资料白嫖,技术互助
学习路线指引(点击解锁) | 知识定位 | 人群定位 |
---|---|---|
Unity系统学习专栏 | 入门级 | 本专栏从Unity入门开始学习,快速达到Unity的入门水平 |
Unity实战类项目 | 进阶级 | 计划制作Unity的 100个实战案例!助你进入Unity世界,争取做最全的Unity原创博客大全。 |
️ 游戏制作专栏 ️ | 难度偏高 | 分享学习一些Unity成品的游戏Demo和其他语言的小游戏! |
游戏爱好者万人社区 | 互助/吹水 | 数万人游戏爱好者社区,聊天互助,白嫖奖品 |
Unity100个实用技能 | Unity查漏补缺 | 针对一些Unity中经常用到的一些小知识和技能进行学习介绍,核心目的就是让我们能够快速学习Unity的知识以达到查漏补缺 |
文章浏览阅读438次。【代码】java(数据库连接池)_java 多数据源连接池释放
文章浏览阅读1.7k次。功率电路中MOSFET的热研究原文:https://wenku.baidu.com/view/282066fa16fc700aba68fc16.html电源管理应用中的功率MOSFET的热分析方法原文:https://wenku.baidu.com/view/2c1b8bceda38376baf1fae78.html_mosfet管在工作过程中的热性能仿真情况
文章浏览阅读446次,点赞2次,收藏4次。oracle新建用户、授权、修改密码、分配表空间、导入导出数据**一**:在pl/sql中新建用户:一:在pl/sql中新建用户:创建用户: create user 用户名 identified by 密码; ;给用户授权:grant dba to 用户名;修改密码:alter user 用户名 identified by 新密码;创建表空间:create tablespace 表空间..._oracle授权用户插入修改表
文章浏览阅读2k次。实验3《LSB与信息隐藏》3.1上机内容与要求3.1.1 写出“图像LSB清0”伪C语言描述的算法、原理与步骤;实验原始图像和不同位清0时载体图像的差别。3.1.2 写出“随机选取图像载体像素点,在LSB上信息隐藏嵌入过程和提取过程”原理与步骤;实验隐藏大小不同的信息时原始图像和载体图像的差别。3.2 实验过程分析3.2.1 写出“图像LSB清0”伪C语言描述的算法、原理与步骤;实验原始图像和不同位清0时载体图像的差别。Matlab语言:function data = shiyan3( )d_图像lsb清0
文章浏览阅读173次。在块分配机制中,涉及到几个主要的数据结构。通过ext4_allocation_request描述块请求,然后基于块查找结果即上层需求来决定是否执行块分配操作。在分配过程中,为了更好执行分配,记录一些信息,需要对分配行为进行描述,就有结构体ext4_allocation_contex。在搜寻可用空间过程中,是有可能使用预分配空间的,因此还需要有能够描述预分..._ext4_num_b2c
文章浏览阅读80次。最近工作比较忙,也没有时间写博客,看到好友芮峰云最近一直在写博客,所以也手痒了,就先把之前的一些积累下来的文章分享给大家。本文是介绍如何的使用smokeping来监控idc机房的网络质量情况,从监控图上的延时与丢包能分辨出你机房的网络是否稳定,是否为多线,是否为BGP机房,到各城市的3个运行商网络各是什么情况,如果出现问题,如果有针对的解决。而且如果选择新机房的时候,你可以根据smokepin..._smokeping 延迟与丢包数值
文章浏览阅读9.4k次,点赞5次,收藏57次。1.什么是网页静态化技术随着用户访问量以及数据量的增大,网页静态化技术方案如今越来越流行。 什么是网页静态化技术呢?简单来说就是将网页以纯静态方式的形式展现。2.网页静态化技术与缓存技术的比较共同点:都可以减小数据库的访问压力。区别:(1)缓存技术适用于小规模的数据。以及一些经常变动的数据。(2)网页静态化技术适用于大规模但是变化不太频繁的数据。页面静态化与缓存技术的定义:页面静态化是指通过一些模板技术(如freemarker)将数据模型生成静态html页面并通过.._freemarker使用教程
文章浏览阅读153次。一.基础笔试命令考察1. 开启MySQL服务service mysqld start/init.d/mysqld startsafe_mysql &关闭mysql服务service mysqld stop/etc/init.d/mysqld stopmysqladmin -uroot -p123456 shutdown2. 检测端口是否运行ls..._sql 语句分类及对应代表性关键字
文章浏览阅读3.3k次。window.clearFlags(WindowManager.LayoutParams.FLAG_TRANSLUCENT_STATUS);window.getDecorView().setSystemUiVisibility(View.SYSTEM_UI_FLAG_LAYOUT_FULLSCREEN | View.SYSTEM_UI_FLAG_LAYOUT_STABLE);window.addFlags(WindowManager.LayoutParams.FLAG_DRAWS_SYSTEM_BAR__android 隐藏状态栏
文章浏览阅读67次。类概述 public classMediaControllerextendsFrameLayout 一个包含媒体播放器(MediaPlayer)的媒体控制条。通常包括“播放/暂停”和SeekBar。它管理MediaPlayer的状态以保持控件的同步。 使用这个类的方法: a). 通过编程来实例化这个类。 这个媒体控制器将创建一个具有默..._vitamio mediacontroller
文章浏览阅读111次。题意:定义一种集合,只有两个数,两个数不同且加起来为素数。要从n个数里抽出数字组成该集合(数字也可以是1~n,这个好懵圈啊),要求你选择最多k个该种集合组成一个有最多元素的集合,求出元素的数量。思路:代码:#include <iostream>#include <cstdio>#include <algorithm>#in..._2017ccpc秦皇岛 h
摘要:本文讨论了读科研论文的三个层次(速读、精读、研读)、四个阶段(快速阅读、仔细阅读、批判性阅读、创造性阅读)以及需要关注的十个问题。分析了为什么读论文难,提供了读标题、摘要和引言的方法。同时还强调了与导师保持沟通的重要性。