2D游戲若想模仿3D游戲的環(huán)境,一種很好的方案便是“2.5D”。
所謂2.5D,通常的理解是相機(jī)固定俯視的游戲視角。在此視角下,人物可以在x、y、z三個(gè)軸上移動(dòng),如此便能模仿3D游戲的環(huán)境,而美術(shù)成本要比3D低很多。
2.5D具體實(shí)現(xiàn)的方式也分多種,如2D角色+3D場(chǎng)景、3D角色+2D場(chǎng)景貼圖、2D角色+2D場(chǎng)景貼圖。此文章討論對(duì)象為最后一種,由于角色和場(chǎng)景都采用2D圖片,所以本質(zhì)仍可以歸為2D游戲。
Demo演示:
Vector3 v3=new Vector3();
float pi=3.14159265f;
float pi_180=pi/180;
if(performer!=null)
{
v3[0] = ((float)x);//和本體相同
v3[1] = ((float)(Mathf.Cos(30 * pi_180)*y+Mathf.Sin(30 * pi_180)*z));//將三維坐標(biāo)映射給二維貼圖,其中30是根據(jù)2D圖片假設(shè)的相機(jī)角度,pi_180是將角度轉(zhuǎn)換成弧度進(jìn)行計(jì)算。
v3[2] = ((float)z*0.01f);//用于控制遮擋順序,和本體成正比即可
performer.transform.position=v3;
}
此處采用了一種簡(jiǎn)單的方法:將人物本體(邏輯)和人物貼圖(表現(xiàn))分離,通過三角函數(shù)算出人物貼圖在2D場(chǎng)景中的位置。
假設(shè)相機(jī)角度為α,人物貼圖的位置為(x2,y2),人物邏輯的位置為(x,y,z),可知:
x2=x
y2=cos(α)*y+sin(α)*z
如此便在2D視角下模擬出了一個(gè)三維世界,而在此基礎(chǔ)上,還可以利用unity本身的物理系統(tǒng)設(shè)計(jì)出3D地形,從而實(shí)現(xiàn)斜坡、拱橋等功能。效果圖如下:
?由于人物本體仍處于3D空間中,因此可以直接在3D空間加入碰撞體來實(shí)現(xiàn)地形(可以看到碰撞體和貼圖之間并不貼合,之后會(huì)解釋原因)
那么要怎樣根據(jù)2D貼圖去制作碰撞體呢?之前有提到三維映射到二維的公式,那么反過來,從二維映射到三維也是可以的。但是二維上的一個(gè)點(diǎn)映射到三維會(huì)有無限種可能,直接套用公式并不可行,因此只能先假定y或z為一個(gè)固定值,通過另一值的變化量來計(jì)算相對(duì)坐標(biāo)。
設(shè)相機(jī)角度為α,貼圖的點(diǎn)位為(x2,y2),邏輯的點(diǎn)位為(x,y,z),一個(gè)格子為一個(gè)單位
如圖,Δz=0,Δy2≈1.92?
套公式得Δy2=cosα*Δy+sinα*0,得y=y2/cosα,此時(shí)我設(shè)置的α為30°,所以Δy≈2.217
?同理,得Δz≈5.688
?套用在碰撞體上即可
?可以發(fā)現(xiàn)映射后的y已經(jīng)比二維上的y更大了,所以在二維視角下碰撞體和貼圖并不貼合
↑寬度測(cè)試,符合預(yù)期結(jié)果
對(duì)于坡道的角度也要以同樣的方式處理,三維坡角=二維坡角/cosα,此處相機(jī)角度為30°,坡道貼圖的角度為15°,碰撞體的坡角即是17.32°。
拱橋則套用橢圓公式,x^2/a^2+ (y/cosα)^2/b^2?= 1
搭建好場(chǎng)景后,還需設(shè)置角色上坡和投射影子的邏輯,詳情可看此篇文章:文章來源:http://www.zghlxwxcb.cn/news/detail-735906.html
Unity 對(duì)角色上坡的研究__獨(dú)孤星夜_的博客-CSDN博客文章來源地址http://www.zghlxwxcb.cn/news/detail-735906.html
到了這里,關(guān)于Unity 2D視角下模擬3D環(huán)境和地形的文章就介紹完了。如果您還想了解更多內(nèi)容,請(qǐng)?jiān)谟疑辖撬阉鱐OY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!