iT邦幫忙

2021 iThome 鐵人賽

DAY 15
0
Mobile Development

從無到有! Unity AR手遊開發日誌-以山海異聞錄為例系列 第 15

Day 15 | 魔術方塊AR遊戲開發Part4 - 面的旋轉(下)+遊戲機制

在上一篇我們完成面的旋轉,卻發現旋轉途中若點擊放開,面會停留在旋轉途中,今天我們就要來解決這個問題。

目錄
面的旋轉
遊戲機制

面的旋轉

旋轉到正確角度

  • 新增布林變數控制是否自動旋轉
  • 新增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);

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

遊戲機制

魔術方塊的機制完成後,要來新增遊戲機制了。

碰撞

首先要先將角色與道具放置在魔術方塊上

新增Rigidbody,因為不需要重力,所以勾選 Is Kinematic

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

新增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滅火遊戲的製作,明天見!


上一篇
Day 14 | 魔術方塊AR遊戲開發Part3 - 面的旋轉(上)
下一篇
Day 16 | FPS滅火AR遊戲開發Part1 - 水柱粒子系統製作
系列文
從無到有! Unity AR手遊開發日誌-以山海異聞錄為例30

尚未有邦友留言

立即登入留言