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灭火游戏的制作,明天见!


<<:  day14 channel实战使用 with webSocket,後面离题讲android接localhost

>>:  [Day14]ISO 27001 标准:资源传达

[Day 13] 从 tensorflow.keras 开始的 EfficientNet 生活

0. 进度条 模型 进度 VGG Net 完成 ResNet 完成 DensNet 完成 Mobil...

找LeetCode上简单的题目来撑过30天啦(DAY8)

题号;100 标题:Same Tree 难度;Easy Given the roots of two...

Day 11 运算宝石:EC2 储存资源 EBS Types 方案比较

今天我们要来介绍 EBS Type方案比较,那我们开始吧! 在之前的文章中我们有提过,EBS 相对...

JavaScript This

This JavaScript 的 This 会指向不同的对象,这依据函数如何被呼叫的。 当函数被呼...

Day19 Lab 2 - Object storage 数据校验和去重

本篇我们会分两部分 - 校验和去重 前面讲到的Metadata,如果有了Metadata,我们可以做...