Unity3D 夏日大作戰Jumper

2022-08-17 01:48:14 字數 3712 閱讀 3706

博主前些日子和別的學院的同學共同製作了一款小遊戲jumper,現在把其開源出來,希望可以給在unity初學道路上的同學一些幫助 :)

我們首先看一下遊戲的最終截圖,效果完成度不高,但是其中**的基本邏輯是比較齊全的。

我們看到的這只小雞就是我們的主角了!背景是乙個大樓,右上角有乙個溫度計,會隨著時間上公升。我們要跳上各種擋板,盡可能地在那些窗戶上安裝空調,(否則同學們會暴動的!)。提示,右下角有乙個藥丸,吃了可以大幅度提公升跳躍能力,左下角是乙個敵人的模型,別被黏黏的蝸牛觸碰到哦!

私以為運用unity,最重要就是場景的設計和遊戲主角的邏輯。只要這兩點明確下來,那麼附屬的物品等基本上就是輕車熟路了。包括閱讀別人的**,如果想從乙個指令碼中分辨出其十多個變數的意義,那麼無異於捨本逐末。只要理解了其最最基本的主角邏輯和場景邏輯,那麼再在其基礎上加上」藥物「、」物品「、」屬性「、」分數「這些東西,就會事半功倍。

即時是乙個最簡單的遊戲,

讓我們看一下主角的行為,character物件最後那個最最核心的update()

為了讓**更清晰易懂,我只保留了其中的一部分。

void update()

/*向左移動*/

transform.translate(vector3.right * -time.deltatime * movespeed, space.world);

}if (input.getkey(keycode.rightarrow))

transform.translate(vector3.right * time.deltatime * movespeed, space.world);

}/*跳躍*/

if (input.getkey(keycode.leftcontrol))

/*安裝空調*/

if (input.getkey(keycode.leftshift))

有些人喜歡將類似於jump和onworking()這樣的函式直接在update()中完成,我覺得這樣做非常不妥當。類中函式呼叫的開銷非常低,而且更有利於以後的重組、修改。而且整體邏輯看起來一目了然。

另乙個比較重要的和主角有關的邏輯是死亡判定,我將這一部分寫入到了另乙個物件score當中(它保有乙個character的引用)。因為主角的死亡原因可能不光是因為」跳到釘子上面「,還有可能是因為」超過了時間「等這樣的全域性因素影響。

void update()

if (!isdead)

if (isdead && !isset)

getcomponent().anchor = textanchor.middlecenter

; transform.position = new vector3(0.5f, 0.5f, 0);

gameobject.getcomponent

().text = "you lost\nyour score: " + score + "\nyour highscore: " + highscore;

isset = true;

player.getcomponent

().enabled = false;}}

另一大要素場景的邏輯稍顯複雜一些。我們除了背景固定外,各種障礙、跳板的位置是隨機的。而且種類很多,有普通板(x),破碎的板子(b),帶釘子的板子(s),需要安裝空調的窗戶(m)。

我寫了乙個類來專門負責它們的安裝工作,它將從乙個txt(類似於地圖)中讀取幾個預設,然後返回乙個arraylist來儲存類似於『x』『x』『x』『b』的字元。

private arraylist readpattern (string path),,

};int linecounter = 0;

foreach (string line in lines)

linecounter++;

} else

if (linecounter == 3) ,,};

linecounter = 0;}}

return patternlist;

}

我們已經得到了隨機的地圖,下一步是有方法來呼叫他。

並且在合適的位置和合適的時機(在離主角足夠近時)安裝上這些擋板。

void spawn ()

float staticlastspawny = lastspawny;

while (j <= staticlastspawny)

if (player.getcomponent

().transform

.position

.y > 50 && player.getcomponent

().transform

.position

.y< 100)

if (player.getcomponent

().transform

.position

.y > 100)

for (int k = 2

; k >= 0; k--)

if (temppattern [k, i].tostring () == "s")

if (temppattern [k,i].tostring () == "m")

if (temppattern [k,i].tostring () == "b") }}

clouds (j, getworldcoordinates (random.range (0, 5)) + random.range (-1, 1));

award (j, getworldcoordinates (random.range (0, 5)) + random.range (-1, 1));

}lastspawny += 10

; }

這個源**中還有幾個部分,例如【板子的種類】【藥物】【主角屬性的變化】【計時操作】,這幾個部分我們先將他們和c#檔案一一對應起來。再大段貼上**的話讀者已經很難看下去了~

【板子的種類】

共有missiontile、spiketile、brokentile它們共同繼承於tile(普通板)。missiontile向score」匯報「任務完成。(如果把這一工作交給了主角character來做,明顯是打破了單一職責原則)

【藥物】

包括了capsule,這個遊戲目前只有一種藥物。但是藥物的效果並沒有在裡面體現。只說明了這是」哪一種「藥物和 ontriggerenter()用來觸發人物吃藥的效果。我之所以這樣設計是因為直接讓藥物這樣的類去操縱人物的屬性不符合黎克特制替換原則。(簡單地說是請面對介面!)

【主角屬性的變化】【計時操作】

主角屬性的變化一般都是有時間限制的,我看到過一些寫法,是在主角character中完成這一計時。但是完全有更好的辦法就是協程:

(我不得不再粘點**上來。。)

ienumerator affecttimer()

這就先告一段落了,我上一次使用unity寫的乙個空調模擬系統這裡也一併貼出來佔一下空【請忽略下圖

c語言寒假大作戰3

1設計思路和遇到的問題 思路 如何進行這個隨機的意思,如何合理的運用rand 問題 如何使用rand 2程式結果截圖 3程式 include include include void menu void help void error void operation 1 void one 1 void...

Unity3D開發(九) Unity3d流光效果

遊戲開 壇 hello game 遊戲開發群 201276069 之前曾經注意過material 中紋理的屬性都有 tiling 和offset 但沒有深究過其用途,今天才知道竟然可以利用 offset做uv 動畫,從而完成各種有趣的動畫,比如流光效果!流過效果即通常一條高光光在物體上劃過,模擬高光...

Unity3d時鐘指令碼

var tu1 texture2d var time1 float 0 function fixedupdate function ongui function gettime time float string var lasttime string var hour mathf.floortoi...