我感覺我最近有點睡得不安穩,總是半夜突然就驚醒了。然後起來看一眼手機,淩晨3點。
接着我發現遊戲體力滿了,花費了10分鐘把體力清空然後什麼東西都沒掉落。
我用這十分鐘換取了一夜未眠,我也不知道賺不賺。
這導緻我有的時候下午補覺會夢到一些奇怪的場景,例如遊戲裡的男角色抱着我的大腿說能不能别隻抽女角色你這個老色皮。
又或者是打遊戲玩到了超神結果網斷了,唰一下給我驚醒了,困意一下子給我幹沒了。
難怪醫生會說适當的午覺有助于人體身心健康,我今天愣是一把遊戲沒敢打就怕現實重演,時間全用在學習上了。
為了能讓其他人感覺到我的痛苦,我打算等我學會做RPG遊戲的時候把這些場景通通加到玩家角色身上。
言歸正傳,今天要講的内容是有關于場景類的知識。
話不多說直接出發!
一、場景類(P27)
- 一個遊戲由很多的場景組成,例如開始頁面、遊戲頁面、商店頁面等等。
- 最典型的新手村也是一個場景,每一個場景裡面也由很多遊戲物體組成。
- 每個遊戲物體由各種元件(腳本)組成
以上就是一個大概的遊戲架構了,之前都是在預設的遊戲場景中添加元件和腳本,其實也可以通過代碼或者元件來建立新的遊戲場景。
在Unity的層級視圖下可以看到有一個叫做SampleScene的東西,下面包含了兩個遊戲對象
這個SampleScene就是一個預設的遊戲場景,同時SampleScene在項目視圖中的Scenes檔案夾中,是以可以在Scenes檔案夾建立(滑鼠右鍵)一個新的遊戲場景。
輕按兩下打開之後就是新建立的場景了
1-1.通過代碼加載場景(從Sample加載到My)-場景跳轉
在SampleScence中打開檔案→項目-生成和設定(Ctrl+Shift+B)→将場景都拖進到build中的場景(0和1就是場景的索引号)
接下來建立一個空對象,再建立一個腳本檔案并挂載打開。
首先在代碼的頂部導入:using UnityEngine.SceneManagement.
同步加載場景代碼(索引):SceneManager.LoadScene(1);
回到Unity後運作,系統會自動打開1号場景(MyScene)
除了索引的方式也可以用名稱的方式,将數字改為“場景名稱”
SceneManager.LoadScene("MyScene");
1-2.擷取目前場景(目前激活的場景)
Scene scene = SceneManager.GetActiveScene();
代碼中的scene也就是目前的SampleScene(目前的場景)
為了驗證是否擷取成功,用列印的方式來驗證:
Debug.Log(scene.name);
在這裡的scene就是場景類,對于一些場景類而言有一些屬性需要了解下。
除了上面所提到的場景名稱Debug.Log(scene.name);
1-3.場景是否被加載
Debug.Log(scene.isLoaded);
1-4.場景路徑
Debug.Log(scene.path);
1-5.場景索引(得到在Build場景面闆中的索引号)
Debug.Log(scene.buildIndex);
1-6.得到所有根遊戲物體
scene.GetRootGameObjects();
這裡會傳回一個宿主:
GameObject[] gos = scene.GetRootGameObjects();
可以列印出來看一下宿主裡有什麼東西(列印長度):
Debug.Log(gos.Length);
在下面的圖中可以詳細看到控制台的傳回内容
- 第一個是場景名稱
- 第二個是場景已經加載(ture)
- 第三個是場景所存放的路徑
- 第四個是表示目前場景為0号場景
- 第五個是表示目前場景内有3樣物品
二、場景管理類(P27)
2-1.場景管理類(目前已加載的場景數量)
Debug.Log(SceneManager.sceneCount);
2-2.直接建立新場景(括号内自定義場景名稱)
SceneManager.CreateScene("newScene");
當然也可以設定一個傳回:
Scene newScene = SceneManager.CreateScene("newScene");
可以看到這裡直接多出了一個新的名為NewScene的空場景
如果把上述倆個行代碼順序進行颠倒的話,會發現目前已加載場景會從1變為2。
2-3.解除安裝場景(異步銷毀)括号内放入想要銷毀的場景
SceneManager.UnloadSceneAsync(newScene);
異步銷毀:該函數并不是立即銷毀物體而是給物體加了一個辨別符,物體還在記憶體中,在下一幀時才銷毀并從記憶體中移除
在這裡運作後可以看到,左下角的激活場景仍然為2但是沒有出現newScene這個場景。
因為是在建立出來之後被直接删除了。
2-4.加載場景(多參數)
SceneManager.LoadScene("MyScene",LoadSceneModel.Single);
這裡的Single是以簡單的替換加載存在,運作以後會直接加載為MyScene頂替掉原本的SampleScene。
如果将Single換為另一種:
SceneManager.LoadScene("MyScene",LoadSceneModel.Additive);
可以看到兩個場景的内容會疊加在一起
但是這種方式在加載複雜場景或者大型遊戲的場景時會很容易造成卡頓
關于如何加載複雜場景的異步加載将放在下篇筆記中進行講解。
今天的内容就到此為止了!
每次寫完文章都是十點多,感覺一天天也沒幹啥事時間淨霍霍了。
今天的我遊戲還沒打就先學習了,我要好好去獎勵一下自己。
大夥下篇筆記見,拜了個拜
原教程連結:
https://www.bilibili.com/video/BV1gQ4y1e7SS/?spm_id_from=333.337.search-card.all.click&vd_source=24f33eddf5587fb40e947798abce6715