:::info <font color="#449df9">**第三次社課**</font> ::: ***我們從這次社課開始,要開始製作大家第一款遊戲,不用擔心,我會詳細的帶著大家*** 上課前請先幫我登入學校的google帳號,並打開classroom,加入==egxnieml==,這個課程,方便大家存檔使用! >[TOC] ## 新建專案 登入學校帳號 建一個2D的專案  :::warning >[!Warning] >跟第一、二次社課一樣 ::: ## 免費素材介紹 在建立專案的時候,可以到以下幾個網站,尋找一些免費的遊戲素材,可在之後製作遊戲使用。但這節課先不會用到,但如果有喜歡的可以先下載,並傳到classroom。 [https://itch.io/game-assets/free/tag-2d/tag-unity](https://) 我推薦這個,但也有其他的,各位可以自行探索(也可以用AI生圖,像等下的成果展示,也有用AI生成的) ## 介面介紹 如果有忘記的可以複習一下 {%youtube 5xEKEpRSHkI %} --- 接下來我們要開始製作一款完整的遊戲,首先我們先看一下下面的成果影片,並想想看它背後的邏輯。 ## 成果展示 {%youtube G0I2hmbpXGE %} ## 概念分析 好那我們來分析一下: 1.我們一開始在首頁(Home),這時候有兩個選擇,==Choose==跟==Start==,這是第一個場景(Home)。 2.當我點擊==Choose==時,跳到選擇關卡的場景(Choose),可以選擇跳到某一關,而右上有一個Home鍵,點擊後一樣會回到首頁。 3.當我點擊==Start==時,便到第一關(Level-1),可以看到上面有顯示Level-1的字樣(Text)以及右邊有一個過關的門(gate),接著用到之前教的==WASD的移動==,但我們在左右動的時候,角色面朝的方向也要有所變化(render.flipX),接著影片中人物向前移動,突然地板消失一部分,這有兩種做法: 一、利用==距離==,分別讀取玩家以及地板的位置,當兩者距離為程式所規定的範圍以內,便將那塊地板刪除(Destroy)(影片為此種方式,好處:即使玩家用跳的或是如何,這樣距離在那個範圍便會觸動) 二、放一個小方塊(藏在地板,但凸出一點點),當玩家踩到便會觸發機制,導致地板消失(類似地雷)(壞處:需要玩家接觸到,否則不觸發) 此時我們過了這個地板後,發現會有一個紅色的三角形(Sting),突然冒出,並急衝而來,若玩家碰到則遊戲結束(Time.timeScale=0f),而這個是因為一開始就將它隱藏,等玩家的位置在所規定的位置時,將物體顯示,並像玩家移動一樣,重複執行,有速度,然後限定終點而停下,跳過後碰到門後,便到下一關(Level-2) :::success 這次社課,目標將第一關做完。 ::: ## 開始製作(player) 首先一樣是先創物件啦,也是一樣創一個正方形,並取名為==player==,在右邊滑到最下面```Add Compopent```點選```Box Collider2D```跟```Rigidbody2D```,然後一樣要用到 ==標籤(tag)== 它在物件名稱的下方,有一欄tag.....,按下那個下拉式選單,選最下面的```Add Tag...```,接著按加號,取兩個名字```player```、```floor```,按```save```,回到物件資料,把tag改成剛剛命名的,這樣便可以了! 在下方的==Assets==按右鍵,然後按```Create``` -->```Folder``` -->```命名成Script``` 接著打開這個資料夾,一樣按右鍵```Create``` -->```Scripting``` -->```Empty C# Script```-->```命名成player```,完成後便可以打開,複製以下程式。 ```using UnityEngine; using UnityEngine; public class player : MonoBehaviour { SpriteRenderer render; Rigidbody2D rigid2D; public float moveSpeed; public int JumpCount = 2; public float JumpForce; public float FallingSpeed; public bool fallingCheck = false; public bool groundCheck = true; public bool jumptofallcheck = false; public bool jumpingCheck = true; void Start() { Time.timeScale = 1f; moveSpeed = 5f; render = GetComponent<SpriteRenderer>(); rigid2D = this.gameObject.GetComponent<Rigidbody2D>(); JumpForce = 4.0f; } void Update() { if (Input.GetKey("d")) { if (render.flipX == true) { render.flipX = false; } transform.Translate(moveSpeed * Time.deltaTime, 0, 0); } else if (Input.GetKey("a")) { if (render.flipX == false) { render.flipX = true; } transform.Translate(-moveSpeed * Time.deltaTime, 0, 0); } if (Input.GetKeyDown("w") && JumpCount > 0) { Jump(); JumpToFall (); FallingFunction(); } } void Jump() { jumpingCheck = true; rigid2D.AddForce(new Vector2(0, JumpForce), ForceMode2D.Impulse); JumpCount -= 1; } void OnCollisionEnter2D(Collision2D other) { if (other.gameObject.tag == "floor") { JumpCount = 2; groundCheck = true; } } void FallingFunction() { if (FallingSpeed < 0 && groundCheck == false) { fallingCheck = true; } } void JumpToFall() { FallingSpeed = GetComponent<Rigidbody2D>().linearVelocity.y; if (FallingSpeed <= 1 && groundCheck == false) { jumptofallcheck = true; jumpingCheck = false; } } } ``` :::info 可以直接**複製**,player那裡要用跟建的檔案名稱一樣 ::: :::success 執行並看看物體會掉落並停在floor上,然後按AD控制左右,W跳躍! ::: {%youtube vQvcx3oVhZg %} --- ## 開始製作(Sting) 以下為釘子的程式,跟我們剛剛分析的一樣會有偵測距離以及移動的程式。 一樣先創建一個三角形(trangle),命名為Sting,顏色可以換一下,一樣要新增標籤(tag),命名為Sting,然後增加```Rigidbody2D```,那這次不一樣,碰撞改用```Polygon Collider 2D```,以下給大家看一下它跟```Box Collider2D```的差別:  左側為```Box Collider2D```右側則為```Polygon Collider 2D```可以看的出來左側是用一個方形範圍(Box),可以改用```Polygon Collider 2D```更適合三角形。 然後建一個空物件(Create Empty),並命名為stingManager,並再創一個程式文本(Scripting),複製以下程式。 ```using UnityEngine; using UnityEngine; public class stingManager : MonoBehaviour { public Transform myTransform; public Transform playerTransform; public float MoveSpeed; public float goalposition; [SerializeField] GameObject Sting; [SerializeField] GameObject playerPerfabs; void Start() { //MoveSpeed = 0.05f; Sting.SetActive(false); myTransform = Sting.transform; } void Update() { if (GameObject.Find("player") != null) { playerTransform = GameObject.Find("player").transform; } if (playerTransform) { if (myTransform.position.x - playerTransform.position.x <= 7f) { Sting.SetActive(true); //Sting.GetComponent<Animator>().SetBool("sting", true); if (myTransform.position.x > goalposition) myTransform.Translate(-MoveSpeed*Time.deltaTime, 0, 0); } } } } ``` 完成後記得儲存,接著拖曳到stingManager,你將看到程式那裡下面有Sting跟Player Perfabs,這兩格分別拖入player物件以及Sting物件。 然後速度跟距離可以自己設定。 {%youtube tNMa_02km-U %} 影片的最後可以看到,當我終點(Goalposition)設為0.3,他到便會固定在那,但他卻可以往左退,是因為速度(moveSpeed)設為正數,所以它只會往右跑。 但這個釘子碰到player好像沒有發生什麼事。 那我們在player的程式中加入碰到Sting則會消失的程式吧! ```void OnCollisionEnter2D(Collision2D other) void OnCollisionEnter2D(Collision2D other) { if (other.gameObject.tag == "floor") { JumpCount = 2; groundCheck = true; } if (other.gameObject.tag == "Sting") { Destroy(this.gameObject); } } ``` :::success 測試看看,碰到sting,player應該會消失。 ::: --- ## 開始製作(disappearfloor) 那我們還剩一個會突然消失的地板對吧,所以一樣新增一個正方形,並夾在地板中,加上```Box Collider2D```,再加一個程式文本,命名為```disappearfloor``` ```using UnityEngine; using UnityEngine; public class disappearfloor : MonoBehaviour { public Transform myTransform; public Transform playerTransform; [SerializeField] GameObject disappearfloorPerfabs; [SerializeField] GameObject playerPerfabs; void Start() { myTransform = disappearfloorPerfabs.transform; } void Update() { if (GameObject.Find("player") != null) { playerTransform = GameObject.Find("player").transform; } if (playerTransform) { if (myTransform.position.x - playerTransform.position.x <= 1f) { Destroy(disappearfloorPerfabs); } } } } ``` 而程式那欄會像下方:  下面兩欄要拖曳player跟disappearfloor。 :::warning 可以把物件照這樣擺! :::  ::: success 成功的話,當你靠近地板時,地板會消失。 然後Sting也會突然出現並會向前靠近。 ::: **恭喜大家完成今天的課程🎉🎉🎉** 各位可以對於今天所學到的功能多加練習,如果有任何不懂可以問我(教學長),講義有那裡不足也可以說,盡請期待下次社課😊 **存檔** 接者我們要進行==存檔==,因為電腦教室關機會重置。首先是要退出遊戲(記得存檔),然後在```檔案總管```搜尋當初建檔案的名稱,會找到一個資料夾,點進去,全選裡面的所有檔案,按右鍵,選擇```Assets``` ```Packages``` ```ProjectSettings```,然後```壓縮至...```選```壓縮檔案```,然後可能有等一下,壓縮完存到==classroom==即可! **簽退** 最後別忘記簽退喔! :::spoiler 要完成才能開喔(或是時間到了) :::spoiler 你確定? :::spoiler 不要先偷看喔! cHsH ::: **電腦關機前請確認以下幾點:** - [ ] 檔案是否已存在classroom - [ ] 是否填完簽退表單 確認完成後,那我們這次社課就結束囉,期待下次與你的相見!:heart_eyes::heart_eyes::heart_eyes: 掰掰~~ :kissing_heart: 以下為社服預購單,想要的火速下單。 [https://docs.google.com/forms/d/e/1FAIpQLSc49YyD_QV8fAbWMAGXy7C_QcosxCh0ou6QWz9pU_2n-IYxnw/viewform](https://)
×
Sign in
Email
Password
Forgot password
or
By clicking below, you agree to our
terms of service
.
Sign in via Facebook
Sign in via Twitter
Sign in via GitHub
Sign in via Dropbox
Sign in with Wallet
Wallet (
)
Connect another wallet
New to HackMD?
Sign up