最近项目周期变得平稳,不再像之前那么忙了,所以抽空写了个魔方小游戏,在这里跟大家分享。
游戏原理并不复杂,在场景中,我们放了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