# Day 25 | 使用ManoMotion製作Flappy Bird遊戲 Part1 - 障礙物山 的移動與產生 ###### tags: `Unity` `AR手遊` > **目錄** > 遊戲機制介紹 > 障礙物-山的移動 > 障礙物-山隨機產生 ## 遊戲機制介紹 只要偵測到手部Grab的動作,帝江就會往上飛一點,如果偵測到連續動作,帝江就會飛越高,玩家要用Grab動作控制帝江不要撞到並且飛越山脈。 ### 使用素材 | 帝江 | 山| 山|山| | ---- | ---- | ---- |---- | | ![](https://i.imgur.com/ToRd3un.png)|![](https://i.imgur.com/uf93qOQ.png)|![](https://i.imgur.com/CB00VN5.png) |![](https://i.imgur.com/iP2PkmF.png)| ## 障礙物-山的移動 ### Step1 變數宣告 * rec 稍後用來改變物件canvas的位置 * speed 方便移動調整速度 ``` RectTransform rec; public float speed; ``` ### Step2 函式宣告 在山的產生器再產生山以後,用來給山呼叫的set函式,設定山的初始位置以及旋轉。 * setRec(RectTransform setPoint) 讓生成器設定山的位置 * setRotation() 如果是上面的山,就旋轉z軸180度,並調整成上面山的位置。 ``` public void setRec(RectTransform setPoint) { rec = setPoint; } public void setRotation(){ rec.localEulerAngles = new Vector3(0f, 0f, 180.0f); rec.anchoredPosition = new Vector3(2755, 440, 0); } ``` ### Step3 移動 * 山是往左邊移動所以是-x,- new Vector3( speed * TimedeltaTime,0,0)。 ``` void Update(){ rec.position -= new Vector3(speed * Time.deltaTime, 0, 0); } ``` 以上就是山的移動,接下來是山的產生。 ## 障礙物-山的隨機產生 時間到了就會產生新的山,所以需要計數器、山的物件、以及要產山生的點。 ### Step1 變數宣告 * f_nextGenTime 作為計數器 * mountainPrefab 儲存要產生的山物件 * rec 儲存生成山的UI位置的依據 ``` float f_nextGenTime = 3; public GameObject[] mountainPrefab; public RectTransform rec; ``` ### Step2 判斷產生時間到了沒 先判斷計數器超過1了沒 * 如果超過了就Random出一個整數,選擇要產生的山。 * 將Random數作為參數丟進產生山的函式。 * 產山完就將計數器歸零。 * 如果計數器沒有超過1,就計數。 ``` void Update() { if (f_nextGenTime > 1f) { int num = Random.Range(0, 3); Generate(num); num = Random.Range(0, 3); GenerateAbove(num); f_nextGenTime = 0; } else { f_nextGenTime += Time.deltaTime; } } ``` ### Step3 山的產生函式 * 將Random數作為參數,選擇要產山的3種山的mountainPrefab * 利用Instantiate生成山,如果是下面的山就呼叫setRec(),如果是上面的山就呼叫set。 ``` void Generate(int num) { GameObject mountain = Instantiate(mountainPrefab[num]) as GameObject; mountain.GetComponent<MountainMove>().setRec(rec); mountain.transform.SetParent(GameObject.FindGameObjectWithTag("canvas").transform, false); } void GenerateAbove(int num){ GameObject mountain = Instantiate(mountainPrefab[num]) as GameObject; mountain.GetComponent<MountainMove>().setRotation(); mountain.transform.SetParent(GameObject.FindGameObjectWithTag("canvas").transform, false); } ``` --- 以上就是障礙物-山的移動與產生,明天會寫到主角跳躍與手部偵測的部分,那就明天見囉~