Unity做一个魔方

最近项目周期变得平稳,不再像之前那么忙了,所以抽空写了个魔方小游戏,在这里跟大家分享。

游戏原理并不复杂,在场景中,我们放了27个Cube,和6个面的触发器,根据触发器的Enter检测和Exit检测,确定对应面的子物体,使得触发器底下的9个Cube能同时转动,同时,再设置X,Y,Z三个轴向的整体转动,子物体是固定的27个Cube。

有了思路以后,我们来做场景,做完场景以后,画面大概是这样:

在FrontContent及以下5个物体中,我们要挂靠BoxCollider,和Rigibody组件,如图:

接下来,我们来写脚本,因为总体逻辑并不复杂,所以主逻辑只写了了一个GameController脚本,另外还有6个触发器脚本,以下是代码:

GameController.cs

using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using UnityEngine.UI;

public class GameController : MonoBehaviour {

    public static GameController Instance;

    public enum Axis {//旋转轴
        X = 1,
        Y = 2,
        Z = 3
    }

    public enum RotateModel {//旋转模式
        Forward = 90,
        Back = -90
    }

    public enum Direction {//旋转方位
        First = -90,
        Second = -180,
        Third = 90,
        Fourth = 0
    }

    private Direction cubeDirF;//F面转向
    private Direction cubeDirB;//B面转向
    private Direction cubeDirU;//U面转向
    private Direction cubeDirD;//D面转向
    private Direction cubeDirL;//L面转向
    private Direction cubeDirR;//R面转向
    private Direction cubeDirWholeX;//整体转向
    private Direction cubeDirWholeY;
    private Direction cubeDirWholeZ;

    private const float rotateSpeed = 150f;//旋转速度

    private Quaternion targetRotationF;//旋转角度
    private Quaternion targetRotationB;
    private Quaternion targetRotationU;
    private Quaternion targetRotationD;
    private Quaternion targetRotationL;
    private Quaternion targetRotationR;
    private Quaternion targetRotationWholeX;
    private Quaternion targetRotationWholeY;
    private Quaternion targetRotationWholeZ;

    private int targetFZ = 0;//旋转轴度数
    private int targetBZ = 0;
    private int targetUY = 0;
    private int targetDY = 0;
    private int targetLX = 0;
    private int targetRX = 0;
    private int targetWholeX = 0;
    private int targetWholeY = 0;
    private int targetWholeZ = 0;

    public Button FButton;
    public Button FAntiButton;
    public Button BButton;
    public Button BAntiButton;
    public Button UButton;
    public Button UAntiButton;
    public Button DButton;
    public Button DAntiButton;
    public Button LButton;
    public Button LAntiButton;
    public Button RButton;
    public Button RAntiButton;
    public Button XButton;
    public Button XAntiButton;
    public Button YButton;
    public Button YAntiButton;
    public Button ZButton;
    public Button ZAntiButton;

    public GameObject FrontContent;//旋转父物体
    public GameObject BackContent;
    public GameObject UpContent;
    public GameObject DownContent;
    public GameObject LeftContent;
    public GameObject RightContent;
    public GameObject WholeXContent;
    public GameObject WholeYContent;
    public GameObject WholeZContent;
    private GameObject prevContent;//上一个转动的模块

    public List<GameObject> FrontObjList;//旋转面方块集合
    public List<GameObject> BackObjList;
    public List<GameObject> UpObjList;
    public List<GameObject> DownObjList;
    public List<GameObject> LeftObjList;
    public List<GameObject> RightObjList;
    public List<GameObject> WholeObjList; 

    private bool isFrontClockwise = false;//旋转判断条件
    private bool isFrontAntiClockwise = false;
    private bool isBackClockwise = false;
    private bool isBackAntiClockwise = false;
    private bool isUpClockwise = false;
    private bool isUpAntiClockwise = false;
    private bool isDownClockwise = false;
    private bool isDownAntiClockwise = false;
    private bool isLeftClockwise = false;
    private bool isLeftAntiClockwise = false;
    private bool isRightClockwise = false;
    private bool isRightAntiClockwise = false;
    private bool isXClockwise = false;
    private bool isXAntiClockwise = false;
    private bool isYClockwise = false;
    private bool isYAntiClockwise = false;
    private bool isZClockwise = false;
    private bool isZAntiClockwise = false;
    private bool isPlaying = false;//正在旋转

    void Awake()
    {
        Instance = this;
    }

    void Start () {
        FButton.onClick.AddListener(OnClickFBtn);
        FAntiButton.onClick.AddListener(OnClickFAntiBtn);
        BButton.onClick.AddListener(OnClickBBtn);
        BAntiButton.onClick.AddListener(OnClickBAntiBtn);
        UButton.onClick.AddListener(OnClickUBtn);
        UAntiButton.onClick.AddListener(OnClickUAntiBtn);
        DButton.onClick.AddListener(OnClickDBtn);
        DAntiButton.onClick.AddListener(OnClickDAntiBtn);
        LButton.onClick.AddListener(OnClickLBtn);
        LAntiButton.onClick.AddListener(OnClickLAntiBtn);
        RButton.onClick.AddListener(OnClickRBtn);
        RAntiButton.onClick.AddListener(OnClickRAntiBtn);

        XButton.onClick.AddListener(OnClickXBtn);
        XAntiButton.onClick.AddListener(OnClickXAntiBtn);
        YButton.onClick.AddListener(OnClickYBtn);
        YAntiButton.onClick.AddListener(OnClickYAntiBtn);
        ZButton.onClick.AddListener(OnClickZBtn);
        ZAntiButton.onClick.AddListener(OnClickZAntiBtn);
    }

    void Update () {
        UpdateFrontClockwise();
        UpdateFrontAntiClockwise();
        UpdateBackClockwise();
        UpdateBackAntiClosewise();
        UpdateUpClockwise();
        UpdateUpAntiClockwise();
        UpdateDownClockwise();
        UpdateDownAntiClockwise();
        UpdateLeftClockwise();
        UpdateLeftAntiClockwise();
        UpdateRightClockwise();
        UpdateRightAntiClockwise();

        UpdateXAxisClockwise();
        UpdateXAxisAntiClockwise();
        UpdateYAxisClockwise();
        UpdateYAxisAntiClockwise();
        UpdateZAxisClockwise();
        UpdateZAxisAntiClockwise();
    }

    public void OnClickFBtn()//点击F按钮
    {
        ClickBtnEvent(RotateModel.Back, Axis.Z, ref FrontContent, ref FrontObjList, ref targetFZ, ref cubeDirF, ref targetRotationF, ref isFrontClockwise);
    }

    public void OnClickFAntiBtn()//点击F'按钮
    {
        ClickBtnEvent(RotateModel.Forward, Axis.Z, ref FrontContent, ref FrontObjList, ref targetFZ, ref cubeDirF, ref targetRotationF, ref isFrontAntiClockwise);
    }

    private void UpdateFrontClockwise()//F面正向旋转
    {
        UpdateRotateZEvent(Vector3.back, cubeDirF, targetRotationF, RotateModel.Back, ref FrontContent, ref isFrontClockwise, ref isFrontAntiClockwise);
    }

    private void 
评论 30
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值