---
# System prepended metadata

title: Day 25 | 使用ManoMotion製作Flappy Bird遊戲 Part1 - 障礙物山 的移動與產生
tags: [Unity, AR手遊]

---

# 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);

}

```


---

以上就是障礙物-山的移動與產生，明天會寫到主角跳躍與手部偵測的部分，那就明天見囉~
