---
# System prepended metadata

title: class4

---

:::info
<font color="#449df9">**第四次社課**</font>
:::
***這次社課一樣繼續探索遊戲的世界，一起享受吧***
上課前請先幫我登入學校的google帳號，並打開classroom，還沒加入的，幫我加入==egxnieml==，這個課程，方便大家存檔使用!
>[TOC]

## 開啟上次的存檔
打開上次的作業區，將檔案下載下來，之後會有一個壓縮檔，按右鍵解壓縮，之後開啟Unity，在原本新增檔案(藍色那裡)，按左邊灰色的==新增==，並選第一個，==從硬碟新增專案==，並選取剛剛下載下來的檔案，新增完後點擊專案並等待。
:::warning
等待的時候可以預覽下面的內容或複習之前的講義
:::

## 學習資源介紹
如果對遊戲開發想了解更多，我推薦一些資源。
我是透過網路自學的，我看的第一個影片是一個小朋友下樓梯的遊戲
https://www.youtube.com/watch?v=nPW6tKeapsM&t=267s
它有蠻詳細的介紹。但如果想學會一些更進階的，可以試試==阿空的遊戲部屋==
https://www.youtube.com/@RemptyGame
像是技能釋放，追蹤彈，跟隨鏡頭等，都很讚。

---

## 成果展示
{%youtube G0I2hmbpXGE %}

## 概念分析
:::info
忘記的可以再看一次!
:::
好那我們來分析一下:
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 
這次社課，目標將場境的切換以及其他功能介紹。
:::


## 開始製作(場景切換)

先在下方的資料夾中，找==Scenes==，點開後一開始是SimpleScenes，這時候右鍵==Rename==該為```level-1```，並在旁邊，一樣按右鍵新增一個==Scenes==，命名為```Home```，點兩下Home，並切換場景，他會是一個全新的空白場景，那我們先在左欄新增一個==Button==，所以按右鍵，找到下方的```UI```，然後點最下方的```legacy```，再選```Button```，之後新增一個程式腳本，名為```choose```並複製以下程式碼。
```using UnityEngine
using UnityEngine;
using UnityEngine.SceneManagement;
public class Choose : MonoBehaviour
{
    public string SceneName;
    public string PointNumber;
    public void Home()
    {
        SceneManager.LoadScene("home");
    }
    public void Replay()
    {
        SceneName = "level-" + PointNumber;
        SceneManager.LoadScene(SceneName);
    }
    public void Level1()
    {
        SceneManager.LoadScene("level-1");
    }
   
}

```

:::info
可以直接**複製**
:::

儲存完後點擊左上方的```File```->```Build Profiles```，之後可以看到畫面中有一個==Scene List==，他是全部場景的清單，所以這時候，你要將剛剛新增的==Home==場景新增上去(打勾)

這時候在Home的場景新增一個空物件```Create Empty```，並命名為==Choose==，將剛剛那段程式拉上去，再到按鈕那裡，有兩個物件，一個是==Text==，是在按鈕式顯示字，可改可不改，另一個是按鈕主體，滑到最下方，先按```加號```->```將剛剛的物件拉到那個格子```，在點擊右邊那格，選```Choose```->```Level1```，這樣設定就完成了。
![螢幕擷取畫面 2025-12-09 235614](https://hackmd.io/_uploads/SJHPwpSfWx.png)


:::success
執行並點擊畫面中的按鈕，看看有沒有成功切換成level-1
:::


---
## 開始製作(Replay)
先到==level-1==的場景，然後一樣新增一個空物件(Create Emphy)，並將==choose==的程式，重複跟上一不一樣的設定，但這次要選擇==Replay==，再來，因為這是第一關，所以將==point number==設為==1==，之後新增一個按鈕並重複上次的設定
:::success
測試看看，點擊按鈕後，物件(player)會回到原點，重新開始。
:::

---
## 開始製作(第二關)
那我們要做第二關，首先我們複製第一關的場景，並重新命名為```level-2```，先停留在level-1，先新增一個方形，並命名為```gate```，顏色可以改一下，做個區別，新增標籤(tag)，命名為```gate```，並套用在這個物件上，然後一樣新增```Box Collider2D```，但注意的是這裡要勾==Is Trigger==，這是一個能讓物體變成可以穿透的狀態，同時我也可以用碰撞偵測，所以我們先新增一個新的程式腳本，並命名為==gate==，之後複製以下的程式:

```using UnityEngine;
using UnityEngine;
using UnityEngine.SceneManagement;
public class gate : MonoBehaviour
{
    public string SceneName;
    public string PointNumber;
    void Start()
    {
        this.transform.tag ="gate";
    }
    public void chageScene()
    {
        SceneName = "level" + "-" + PointNumber;
        SceneManager.LoadScene(SceneName);
    }
}

```
儲存後，回到==player==的程式，新增以下程式:

```using UnityEngine;
void OnTriggerEnter2D(Collider2D other)
    {
        if (other.gameObject.tag == "gate")
        {
            
            other.gameObject.transform.GetComponent<gate>().chageScene();
        }
        
    }
```
:::success
測試看看，點擊按鈕後，物件(player)碰到gate，會跳到下一關。
:::


---
## 開始製作(上升樓梯)
首先先到level-2的場景，然後新增一個正方形(square)，命名為```upfloor```，並將標籤改成```floor```，新增```Box Colider2D```，接著創建一個腳本，命名為```upfloor```，然後複製以下程式:
```using UnityEngine;
using UnityEngine;

public class upfloor : MonoBehaviour
{
    public Transform myTransform;
    public Transform playerTransform;

    [SerializeField] GameObject Floor;

    [SerializeField] GameObject playerPerfab;
    [SerializeField] GameObject Light1;
    [SerializeField] GameObject Light2;
    void Start()
    {

        myTransform = Floor.transform;
        Light1.SetActive(false);
        Light2.SetActive(false);
    }
    void Update()
    {

        playerTransform = playerPerfab.transform;

        if (playerTransform)
        {
            if (myTransform != null)
            {
                if (myTransform.position.x - playerTransform.position.x <= 4f)
                {
                    Light1.SetActive(true);
                    Light2.SetActive(true);
                    if (myTransform.position.y <= 4.47f)
                    {
                        myTransform.Translate(0, 15f*Time.deltaTime, 0);
                    }
                    
                }
            }

        }
    }
    
    
}

```
:::success
測試看看，點擊按鈕後，物件(player)靠近upfloor，他便會升起。
:::

**恭喜大家完成今天的課程🎉🎉🎉**
各位可以對於今天所學到的功能多加練習，如果有任何不懂可以問我(教學長)，講義有那裡不足也可以說，盡請期待下次社課😊

**存檔**
接者我們要進行==存檔==，因為電腦教室關機會重置。首先是要退出遊戲(記得存檔)，然後在```檔案總管```搜尋當初建檔案的名稱，會找到一個資料夾，點進去，全選裡面的所有檔案，按右鍵，選擇```Assets``` ```Packages``` ```ProjectSettings```，然後```壓縮至...```選```壓縮檔案```，然後可能有等一下，壓縮完存到==classroom==即可!

**簽退**
最後別忘記簽退喔!
:::spoiler 要完成才能開喔(或是時間到了)
:::spoiler 你確定?
:::spoiler 不要先偷看喔!
27 CITRC th
:::
https://forms.gle/P6XajmpzUwNB4Jj87

**電腦關機前請確認以下幾點:**
- [ ]  檔案是否已存在classroom
- [ ]  是否填完簽退表單

確認完成後，那我們這次社課就結束囉，期待下次與你的相見!:heart_eyes::heart_eyes::heart_eyes:
掰掰~~ :kissing_heart: