---
# System prepended metadata

title: Day 15 | 魔術方塊AR遊戲開發Part4 - 面的旋轉(下)+遊戲機制
tags: [Unity, AR手遊]

---

# Day 15 | 魔術方塊AR遊戲開發Part4 - 面的旋轉(下)+遊戲機制
###### tags: `Unity` `AR手遊`
在上一篇我們完成面的旋轉，卻發現旋轉途中若點擊放開，面會停留在旋轉途中，今天我們就要來解決這個問題。
> **目錄**
> 面的旋轉
> 遊戲機制

## 面的旋轉
### 旋轉到正確角度

* 新增布林變數控制是否自動旋轉
* 新增Quaternion來儲存數值
```
private bool autoRotating = false;
private Quaternion targetQuaternion;
```
RotateToRightAngle()函式中:
* 新增vue變數紀錄旋轉角度
* 使用Mathf.Round()來得到最靠近90的角度
```
  public void RotateToRightAngle()
    {
        Vector3 vec = transform.localEulerAngles;
       
        vec.x = Mathf.Round(vec.x / 90) * 90;
        vec.y = Mathf.Round(vec.y / 90) * 90;
        vec.z = Mathf.Round(vec.z / 90) * 90;

        targetQuaternion.eulerAngles = vec;
        autoRotating = true;
    }
```
並在Update()中加入 RotateToRightAngle()

### 自動旋轉
新增自動旋轉速度
```
private float speed = 300f;
```

AutoRotate()中:
* 計算旋轉一步的時間
* 如果開始旋轉，旋轉到底
  * 旋轉角度
  * 更新面的狀態及布林值
```
private void AutoRotate()
    {
        dragging = false;
        var step = speed * Time.deltaTime;
        transform.localRotation = Quaternion.RotateTowards(transform.localRotation, targetQuaternion, step);

        //如果開始旋轉，旋轉到底
        if (Quaternion.Angle(transform.localRotation, targetQuaternion) <= 1)
        {
            transform.localRotation = targetQuaternion;
            
            readCube.ReadState();
            autoRotating = false;
            dragging = false;                           
        }
    } 
```
在Update()中新增是否執行AutoRotate()的程式
```
 if (autoRotating)
        {
            AutoRotate();
        }
```
### 取消選取
在CubeStae中新增PutDown()，之後才可以選取別的面
```
   public void PutDown(List<GameObject> littleCubes, Transform pivot)
    {
        foreach (GameObject littleCube in littleCubes)
        {
            if (littleCube != littleCubes[4])
            {
                littleCube.transform.parent.transform.parent = pivot;
            }
        }
    }
```
並在AutoRotate()加入
```
cubeState.PutDown(activeSide, transform.parent);
```

魔術方塊的旋轉就完成嘍!

## 遊戲機制
魔術方塊的機制完成後，要來新增遊戲機制了。
### 碰撞
首先要先將角色與道具放置在魔術方塊上
![](https://i.imgur.com/5JgbaVQ.png)

新增Rigidbody，因為不需要重力，所以勾選 Is Kinematic
![](https://i.imgur.com/f1iutTY.png)

並且幫他們都加上碰撞器，因為遊戲機制是在同一面即可，碰撞器大小要確保可以碰到同面的道具。

新增PlayerController()，並加入碰撞偵測
```
 private void OnTriggerEnter(Collider other)
    {
        Debug.Log("Coll" + other.gameObject.name);
    }
```
### 場景切換
在撰寫場景切換程式碼前，要先在File>Build Settings>Scenes In Build中，確認場景都有被加入。

新增SceneManager，並在其中加入場景傳換、重新開始的程式碼。
```
//場景轉換
SceneManager.LoadScene(0);
```
```
//重新開始
SceneManager.LoadScene(SceneManager.GetActiveScene().name);
```

如此一來，魔術方塊AR遊戲就完成嘍!

---
以上就是魔術方塊AR遊戲的教學，下一篇會是FPS滅火遊戲的製作，明天見!