南昌大型網(wǎng)站建設(shè)公司2023年8月份新冠癥狀
前言
2.5D游戲 是一種介于二維和三維之間的游戲形式。它通常在二維平面上展示游戲內(nèi)容,但利用三維技術(shù)來(lái)實(shí)現(xiàn)更加逼真的圖像效果。
在2.5D游戲中,角色和環(huán)境通常是以平面的形式呈現(xiàn),但可以在垂直方向上移動(dòng)。這意味著玩家可以在一個(gè)相對(duì)較薄的虛擬空間內(nèi)進(jìn)行自由探索和交互,同時(shí)享受到更加立體感的視覺(jué)效果。
與傳統(tǒng)的二維游戲相比,2.5D游戲可以通過(guò)使用透視、光影效果和深度感等技術(shù)來(lái)增強(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ī)?lái)更好的游戲體驗(yàn)。
這種類型的游戲在平臺(tái)游戲、動(dòng)作游戲和冒險(xiǎn)游戲等類型中比較常見, 例如八方旅人、饑荒這種游戲就是2.5D這類游戲的標(biāo)桿之作了。
先來(lái)看看本文實(shí)現(xiàn)的最終效果
素材
https://assetstore.unity.com/packages/2d/characters/tiny-rpg-forest-114685
一、繪制地圖
首先我們需要搭建一個(gè)地圖用于游戲測(cè)試,這里使用Unity的 Tile Map Editor 來(lái)搭建一個(gè)簡(jiǎn)單的地圖。
層級(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)景物品增加碰撞器,讓玩家不能穿過(guò)該物體。
下面是添加完場(chǎng)景物品后的地圖,看起來(lái)內(nèi)容豐富了不少,效果好了很多。
在場(chǎng)景中新建一個(gè)游戲?qū)ο驣nteractionObject,將這些新建的場(chǎng)景物體全部放到InteractionObject對(duì)象下當(dāng)做子物體,方便后期統(tǒng)一處理。
二、添加玩家動(dòng)畫和移動(dòng)等操作
接下來(lái)再創(chuàng)建一個(gè)Sprite作為玩家,將 Order in Layer 層級(jí) 設(shè)置為1,并給玩家添加 Rigidbody2D剛體 和 Collider碰撞體并適當(dāng)?shù)恼{(diào)整大小。
接下來(lái)在Project下右鍵 Create -> Animatior Controller創(chuàng)建一個(gè) Animatior Controller 用來(lái)管理玩家的動(dòng)畫,主要有 上、下、左、右移動(dòng)和默認(rèn)的Idle動(dòng)畫。
點(diǎn)開Animatior面板后創(chuàng)建兩個(gè) BlendTree混合樹 。
接下來(lái)在Animator面板創(chuàng)建兩個(gè) Float類型的參數(shù) InputX 和 InputY 用來(lái)在混合樹中接收使用。
雙擊點(diǎn)開Idle混合樹,將Blend Type設(shè)置為 2D Simple Doirectional,這樣我們就有兩個(gè)參數(shù)用來(lái)表示二維平面上移動(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)畫。
同樣的操作給Walk混合樹也配置一下。
然后在Animator面板繼續(xù)添加一個(gè)Bool類型的參數(shù) IsMove,用來(lái)控制玩家的Idle和Walk狀態(tài)的切換。
這樣我們角色的動(dòng)畫就算配置好了,接下來(lái)寫代碼完成角色的移動(dòng)方法和動(dòng)畫的播放就好了。
如果動(dòng)畫這塊還不是很明白的話,也可以再去學(xué)習(xí)一下Unity中的動(dòng)畫相關(guān)知識(shí):
Unity零基礎(chǔ)到入門 ??| 近萬(wàn)字教程 對(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游戲畫面,看起來(lái)也沒(méi)有2.5D的既視感,所以還需要對(duì)相機(jī)進(jìn)行設(shè)置。
三、視角配置
調(diào)整攝像機(jī)與場(chǎng)景對(duì)象的角度
相機(jī)的設(shè)置其實(shí)很簡(jiǎn)單,只需要讓其視選擇45°,以俯視角的視角來(lái)觀看場(chǎng)景。
先來(lái)新建一個(gè)游戲?qū)ο驝ameraPosition,將MainCamera放到該物體下作為子對(duì)象,再將MainCamera的Rotation設(shè)置為(-45,0,0),Position的數(shù)值可以根據(jù)搭建的地圖進(jìn)行微調(diào),新建一個(gè)腳本RotatingCamera掛載到該對(duì)象上。網(wǎng)址:yii666.com
該腳本的作用是讓相機(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ì)齊(面向攝像機(jī)),代碼如下:
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)行游戲查看效果:
增加鏡頭旋轉(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)的方法,通過(guò)協(xié)程每次按下時(shí)旋轉(zhuǎn)45°,此時(shí)就大功告成了,下面一起看一下最終效果。
四、游戲效果展示
下面是2D風(fēng)格 和 2.5D風(fēng)格的對(duì)比,相對(duì)于2D畫面,此處的2.5D僅僅是增加了一個(gè)相機(jī)的拍攝角度,畫面風(fēng)格看起來(lái)就有挺大的差異。
2D風(fēng)格 | 2.5D風(fēng)格 |
---|---|
![]() | ![]() |
結(jié)束
真正在制作2.5D游戲時(shí),有非常多的細(xì)節(jié)需要處理,對(duì)于美術(shù)風(fēng)格的標(biāo)準(zhǔn)要求也比較高,制作出來(lái)的畫面也會(huì)更加好看。
- 本文講了一下關(guān)于2.5D游戲及其制作方法的演示。
- 關(guān)于2.5D很多人的說(shuō)法都不同,制作方案也有很多種,本文演示的也只是其中的一種解決方案。
- 主要還是讓大家了解一下關(guān)于2.5D的知識(shí),以及簡(jiǎn)單的制作方法,不至于在提及2.5D游戲時(shí)一臉茫然。
源碼
https://github.com/RedFF0000/Don-t-Starve
參考
【視頻】https://www.bilibili.com/video/BV1DT4y1A7DJ/
完結(jié)
贈(zèng)人玫瑰,手有余香!如果文章內(nèi)容對(duì)你有所幫助,請(qǐng)不要吝嗇你的點(diǎn)贊評(píng)論和關(guān)注
,以便我第一時(shí)間收到反饋,你的每一次支持
都是我不斷創(chuàng)作的最大動(dòng)力。當(dāng)然如果你發(fā)現(xiàn)了文章中存在錯(cuò)誤
或者有更好的解決方法
,也歡迎評(píng)論私信告訴我哦!
好了,我是向宇
,https://xiangyu.blog.csdn.net
一位在小公司默默奮斗的開發(fā)者,出于興趣愛(ài)好,于是最近才開始自習(xí)unity。如果你遇到任何問(wèn)題,也歡迎你評(píng)論私信找我, 雖然有些問(wèn)題我可能也不一定會(huì),但是我會(huì)查閱各方資料,爭(zhēng)取給出最好的建議,希望可以幫助更多想學(xué)編程的人,共勉~