前言
- 玩過游戲的朋友都知道,市面上最常見的游戲多數(shù)分為2D和3D兩種。
- 2D和3D游戲之間的差異大家都知道,一個(gè)是類似紙片游戲?qū)儆诙S層面,另一個(gè)則是在3D立體空間中游玩。
- 其中還夾雜著一個(gè)
2.5D游戲
,本篇文章就來講一下怎么通過Unity進(jìn)行2.5D游戲是怎樣的以及如何制作2.5D游戲。 - 制作方法很簡(jiǎn)單,文中使用到了
Tile Map
制作2D地圖,通過控制相機(jī)角度來形成偽3D來制作2.5D效果的游戲。 - 下面就一起來看看到底是怎樣制作的吧!
【Unity實(shí)戰(zhàn)篇 】 | 如何制作一款2.5D游戲,2.5D游戲制作案例
一、2.5D 游戲概念
2.5D游戲
是一種介于二維和三維之間的游戲形式。它通常在二維平面上展示游戲內(nèi)容,但利用三維技術(shù)來實(shí)現(xiàn)更加逼真的圖像效果。
在2.5D游戲中,角色和環(huán)境通常是以平面的形式呈現(xiàn),但可以在垂直方向上移動(dòng)。這意味著玩家可以在一個(gè)相對(duì)較薄的虛擬空間內(nèi)進(jìn)行自由探索和交互,同時(shí)享受到更加立體感的視覺效果。
與傳統(tǒng)的二維游戲相比,2.5D游戲可以通過使用透視、光影效果和深度感等技術(shù)來增強(qiáng)場(chǎng)景的真實(shí)感。這為玩家提供了更好的沉浸式體驗(yàn),同時(shí)保留了傳統(tǒng)2D游戲的簡(jiǎn)單和直觀性。
許多平臺(tái)游戲、角色扮演游戲和冒險(xiǎn)游戲都采用了2.5D的形式,從而使玩家能夠在一個(gè)相對(duì)較小的空間內(nèi)盡情探索。2.5D游戲的發(fā)展也受益于技術(shù)的進(jìn)步,使得游戲制作人員能夠創(chuàng)建更加精美、逼真的圖像效果,為玩家?guī)砀玫挠螒蝮w驗(yàn)。
這種類型的游戲在平臺(tái)游戲、動(dòng)作游戲和冒險(xiǎn)游戲等類型中比較常見, 例如八方旅人/歧路旅人
這種游戲就是2.5D這類游戲的標(biāo)桿之作了。
下面來看一下在Unity中如何制作一款2.5D的游戲吧!
二、繪制地圖
首先我們需要搭建一個(gè)地圖用于游戲測(cè)試,這里使用Unity的 Tile Map Editor
來搭建地圖。
Tile Map Editor
的使用方法也很簡(jiǎn)單,可以看這篇文章學(xué)習(xí)下怎樣使用Tile Map
快速搭建一個(gè)地圖。
【Unity 實(shí)用工具篇】?| 學(xué)會(huì)使用 可編程瓦片Tile Map,快速搭建2D地圖
層級(jí)需要特別注意,這里把 TileMap Renderer
的 Order in Layer
設(shè)置為0,這一層用于最下層背景顯示,防止遮蓋到其他對(duì)象。
搭建好的地圖如下所示:
此時(shí)還需要在地圖中增加一些場(chǎng)景物品,如大樹、石頭等等。
這里在面板中右鍵 2D Object -> Sprite
創(chuàng)建一個(gè)Sprite,然后在Sprite Renderer中設(shè)置想要的場(chǎng)景物體精靈圖即可,這里要把 Order in Layer
設(shè)置為1,否則會(huì)看不到新創(chuàng)建的對(duì)象。
同時(shí) 要給這些添加的場(chǎng)景物品增加碰撞器,讓玩家不能穿過該物體。
下面是添加完場(chǎng)景物品后的地圖,看起來內(nèi)容豐富了不少,效果好了很多。
在場(chǎng)景中新建一個(gè)游戲?qū)ο?code>InteractionObject,將這些新建的場(chǎng)景物體全部放到InteractionObject對(duì)象下當(dāng)做子物體,方便后期統(tǒng)一處理。
三、添加玩家動(dòng)畫和移動(dòng)等操作
接下來再創(chuàng)建一個(gè)Sprite作為玩家,將 Order in Layer 層級(jí)
設(shè)置為1,并給玩家添加 Rigidbody2D剛體
和 Collider碰撞體
并適當(dāng)?shù)恼{(diào)整大小。
接下來在Project下右鍵 Create -> Animatior Controller
創(chuàng)建一個(gè) Animatior Controller
用來管理玩家的動(dòng)畫,主要有 上、下、左、右移動(dòng)和默認(rèn)的Idle動(dòng)畫。
點(diǎn)開Animatior面板后創(chuàng)建兩個(gè) BlendTree混合樹
。
接下來在Animator面板創(chuàng)建兩個(gè) Float類型的參數(shù) InputX 和 InputY 用來在混合樹中接收使用。
雙擊點(diǎn)開Idle混合樹,將Blend Type
設(shè)置為 2D Simple Doirectional
,這樣我們就有兩個(gè)參數(shù)用來表示二維平面上移動(dòng)。
然后點(diǎn)擊混合樹面板的 +
添加四個(gè)Motion
,分別將Idle的上、下、左、右動(dòng)畫添加上去,并將對(duì)應(yīng)的PosX和PosY數(shù)值添加上去。
這里的PosX和PosY代表分別代表玩家按下X軸和Y軸的方向。
例如 PosX為1時(shí)代表玩家按下右方向鍵 此時(shí)X軸上的值為1,所以播放Idle_Right動(dòng)畫;
PosY為1時(shí)代表玩家按下上方向鍵 此時(shí)Y軸上的值為1,所以播放Idle_Back動(dòng)畫。
動(dòng)畫需要自己找資源配套使用哦!
同樣的操作給Walk混合樹也配置一下。
然后在Animator面板繼續(xù)添加一個(gè)Bool類型的參數(shù) IsMove
,用來控制玩家的Idle和Walk狀態(tài)的切換。
這樣我們角色的動(dòng)畫就算配置好了,接下來寫代碼完成角色的移動(dòng)方法和動(dòng)畫的播放就好了。
如果動(dòng)畫這塊還不是很明白的話,也可以再去學(xué)習(xí)一下Unity中的動(dòng)畫相關(guān)知識(shí):
Unity零基礎(chǔ)到入門 ??| 近萬字教程 對(duì) Unity 中的 動(dòng)畫系統(tǒng)基礎(chǔ) 全面解析+實(shí)戰(zhàn)演練。
創(chuàng)建一個(gè)腳本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");
//讓玩家根據(jù)自己本地坐標(biāo)進(jìn)行向量計(jì)算
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放到玩家對(duì)象當(dāng)做子物體,這樣玩家移動(dòng)時(shí)相機(jī)也可以跟著玩家移動(dòng),此時(shí)運(yùn)行程序進(jìn)行測(cè)試。
可以看到,此時(shí)的游戲畫面就是單純的2D游戲畫面,看起來也沒有2.5D的既視感,所以還需要對(duì)相機(jī)進(jìn)行設(shè)置。
四、視角配置
4.1 調(diào)整攝像機(jī)與場(chǎng)景對(duì)象的角度
相機(jī)的設(shè)置其實(shí)很簡(jiǎn)單,只需要讓其視選擇45°,以俯視角的視角來觀看場(chǎng)景。
先來新建一個(gè)游戲?qū)ο?code>CameraPosition,將MainCamera放到該物體下作為子對(duì)象,再將MainCamera的Rotation設(shè)置為(-45,0,0),Position的數(shù)值可以根據(jù)搭建的地圖進(jìn)行微調(diào),新建一個(gè)腳本RotatingCamera
掛載到該對(duì)象上。
該腳本的作用是讓相機(jī)一直跟隨玩家移動(dòng),腳本內(nèi)容如下:
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;
}
}
再新建一個(gè)腳本FacingCamera
,將其掛載到前面搭建的場(chǎng)景對(duì)象的父物體InteractionObject
上。
該腳本的作用是讓該對(duì)象下的所有子物體的角度始終與相機(jī)的旋轉(zhuǎn)角度對(duì)齊,代碼如下:
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;
}
}
}
此時(shí)運(yùn)行游戲查看效果:
4.2 增加鏡頭旋轉(zhuǎn)功能
在有些2.5D游戲中還支持鏡頭的旋轉(zhuǎn),這里也加上這個(gè)功能看一下效果。
首先要修改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;
}
}
加入一個(gè)按下 Q/E 鍵進(jìn)行旋轉(zhuǎn)的方法,通過協(xié)程每次按下時(shí)旋轉(zhuǎn)45°,此時(shí)就大功告成了,下面一起看一下最終效果。
五、游戲效果展示
下面是2D風(fēng)格 和 2.5D風(fēng)格的對(duì)比,相對(duì)于2D畫面,此處的2.5D僅僅是增加了一個(gè)相機(jī)的拍攝角度,畫面風(fēng)格看起來就有挺大的差異。
2D風(fēng)格 | 2.5D風(fēng)格 |
---|
| |
真正在制作2.5D游戲時(shí),有非常多的細(xì)節(jié)需要處理,對(duì)于美術(shù)風(fēng)格的標(biāo)準(zhǔn)要求也比較高,制作出來的畫面也會(huì)更加好看。
總結(jié)
- 本文講了一下關(guān)于2.5D游戲及其制作方法的演示。
- 關(guān)于2.5D很多人的說法都不同,制作方案也有很多種,本文演示的也只是其中的一種解決方案。
- 主要還是讓大家了解一下關(guān)于2.5D的知識(shí),以及簡(jiǎn)單的制作方法,不至于在提及2.5D游戲時(shí)一臉茫然。
-
🎬 博客主頁:https://xiaoy.blog.csdn.net
-
🎥 本文由 呆呆敲代碼的小Y 原創(chuàng) 🙉
-
🎄 學(xué)習(xí)專欄推薦:Unity系統(tǒng)學(xué)習(xí)專欄
-
🌲 游戲制作專欄推薦:游戲制作
-
🌲Unity實(shí)戰(zhàn)100例專欄推薦:Unity 實(shí)戰(zhàn)100例 教程
-
🏅 歡迎點(diǎn)贊 👍 收藏 ?留言 📝 如有錯(cuò)誤敬請(qǐng)指正!
-
📆 未來很長(zhǎng),值得我們?nèi)Ρ几案篮玫纳?
-
------------------??分割線??-------------------------
資料白嫖,技術(shù)互助
學(xué)習(xí)路線指引(點(diǎn)擊解鎖) | 知識(shí)定位 | 人群定位 |
---|
🧡 Unity系統(tǒng)學(xué)習(xí)專欄 🧡 | 入門級(jí) | 本專欄從Unity入門開始學(xué)習(xí),快速達(dá)到Unity的入門水平 |
💛 Unity實(shí)戰(zhàn)類項(xiàng)目 💛 | 進(jìn)階級(jí) | 計(jì)劃制作Unity的 100個(gè)實(shí)戰(zhàn)案例!助你進(jìn)入U(xiǎn)nity世界,爭(zhēng)取做最全的Unity原創(chuàng)博客大全。 |
?? 游戲制作專欄 ?? | 難度偏高 | 分享學(xué)習(xí)一些Unity成品的游戲Demo和其他語言的小游戲! |
💚 游戲愛好者萬人社區(qū)💚 | 互助/吹水 | 數(shù)萬人游戲愛好者社區(qū),聊天互助,白嫖獎(jiǎng)品 |
💙 Unity100個(gè)實(shí)用技能💙 | Unity查漏補(bǔ)缺 | 針對(duì)一些Unity中經(jīng)常用到的一些小知識(shí)和技能進(jìn)行學(xué)習(xí)介紹,核心目的就是讓我們能夠快速學(xué)習(xí)Unity的知識(shí)以達(dá)到查漏補(bǔ)缺 |