發表文章

Related Posts Plugin for WordPress, Blogger...

7-7 Creating A Simple 2D Game For Reinforcement Learning (3)

圖片
今天要來製作攝影機跟隨角色的功能 ,首先,我們從素材庫找到back跟middle兩個背景圖檔,並拉進場景中。 拉進場景後,你會發現背景圖將我們的主角與其他佈置都遮住了。 我們可以透過調整Z軸來解決背景與主角的遮擋問題。 由於主角與其他場景的Z軸位於0,而背景的Z軸位於0.1,所以會比較靠後。 但此時,你可能會發現,場景中仍有部分物體被遮擋。 假設,我們繼續調整Z軸,把背景的Z軸調到1,問題是否就能解決了呢? 然後繼續拓展我們的背景圖。 接著將middle的背景圖也加進來,這時會發生一個可怕的問題,middle與back的背景圖互相混淆在一起。即使你嘗試著調整Z軸數值,也一直會發生這個問題。 主因是我們的Main Camera的Projection設定為Perspective,這是在2D平面模擬3D視角所使用的攝影機種類,越遠越深的物品看起來越小,越近的物品看起來越大。由於我們現在要製作的是2D遊戲,考量到並不需要模擬3D視角的功能,所以將Projection調整為Orthographic。 關於更多Perspective與Orthographic的比較,可以參考下列影片: Perspective vs Orthographic Cameras in Unity https://www.youtube.com/watch?v=c_WVffzc6GU 此時,從遊戲畫面中,看起來是沒有問題了。使用Perspective或Orthographic都可以製作2D遊戲,如果你想要在某些畫面中模擬出3D的效果,就應該嘗試用Perspective。 再來,我們要在場景中建立一個Empty GameObject名為CameraRange,這是用來定義攝影機移動的範圍的。 替CameraRange設定Box Collider,由於Box Collider與Box Collider2D不會互相影響,所以不用擔心角色移動會受到影響。 接著,如下圖,替你的場景設定攝影機的拍攝範圍。由於原本的天空背景會擋住綠色的框框,我暫時關閉了。 到時候,我們可以使用Box Collider的bounds參數取得該範圍的最小值與最大值。 如下圖,我標示了bounds.min與bound...

7-6 Creating A Simple 2D Game For Reinforcement Learning (2)

圖片
本章要繼續來建構我們的2D遊戲場景啦!接下來,請先到Sunnlyland/artwork/Environment資料夾底下,找到tileset-sliced檔案,這是一個已經切割好的場景圖檔。 選擇圖片以後,在Inspector選擇Sprite Editor。 接著會開啟編輯視窗,大家可以看到這邊已經切割好每一個小元件了。假設大家自己的素材是沒有切割好的話,就請先切割吧。 然後在tileset-sliced旁有一顆小箭頭,按下去後會展開所有小元件。然後我們將第一個小元件拉進場景吧。 拉進場景以後,再進行複製,可以使用下圖的方式進行排列。另一個更好的選擇,是使用Unity提供的TileMap,這是一個免費提供的工具,但因為我使用的Unity版本2018.1.0的TileMap無法正常使用,所以我才使用比較原始的方式佈置場景。 排列好以後,就會長得如下圖。 接著我又進行了更多的複製與排列,這結構看起來略為複雜。 最後,請在結構最上層的tileset-sliced_0新增一個Box Collider 2D。 player-idle-1新增Box Collider 2 D,以及Rigidbody2D。 然後請自己調整Box Collider 2 D的大小。 場景的Box Collider 2 D也是如此設置。 接著,在Animator中新增一個名為Jump的Boolean參數。 並將Animator如下佈置。 然後記得在Jump新增補間動畫,Samples設為6。如不會操作Animator與Animation的話,可以參考上一篇文章: 7-5 Creating A Simple 2D Game For Reinforcement Learning (1) https://3dactionrpg.blogspot.com/2018/07/7-5-creating-simple-2d-game-for.html 然後我在Animator中的每一個Transition,都關掉了Has Exit Time,並將Transition Duration(s)設為0。這樣就會快速切換不同的動畫,由於2D動畫的影格變化很急速,跳起來就應該要立即換成跳躍的圖片,並不會像...

7-5 Creating A Simple 2D Game For Reinforcement Learning (1)

圖片
接下來,我們要來製作一個簡單的2D動作遊戲,並使用強化學習來訓練AI。接下來我會用許多章節來說明如何製作一款2D動作遊戲,之後才會說明使用Unity ML-Agent的部分,如想直接知道強化學習的內容,請直接跳過這幾章唷! 好的,我在Asset Store上找到了一個免費的像素風素材-Sunny Land。我想這個免費資源非常適合當作我們初學的目標。 下載資源的網址: https://assetstore.unity.com/packages/2d/characters/sunny-land-103349 原作者也有提供可遊玩的版本: https://ansimuz.itch.io/sunny-land-pixel-game-art 但由於Sunny Land沒有提供Unity的原始碼,所以我們需要自己撰寫相關的程式。 首先說明,為了使用Unity ML-Agent v0.4版,我使用Unity 2018.1.0f2來建置專案,建議大家選用高於2018的版本唷!從Asset Store下載Sunny Land後,Import進來。Import的都是美術資源,我們需要自己建立遊戲環境。 接著,在Scene視窗中,切換到2D模式。然後把資源內一個名為player-idle-1的Sprite拉到場景中,我們要使用他當作移動的角色。 新建一個Animator,名為Player。再新增三個Animation,名為Idle、Jump、Run。 回到剛剛在場景中建立的player-idle-1,替他新增一個Animator組件,並將Controller的部分設定為我們剛剛新增的Player。 打開Animator視窗進行編輯,點擊右鍵選擇Create State/Empty。 新增的State取名為Idle,Motion選擇剛剛建立的動畫Idle。 然後點選在Hierarchy的player-idle-1。 開啟Animation視窗,選擇編輯Idle。 然後,我們將角色有的四個Sprite都拉進Animation視窗中。 拉進去後,Animation視窗中的設定應如下圖,會顯示四張Sprite。 然後在Samples的設定,將60改為6。Samples是...