已经过了大半年了,当初我想实现的魔方游戏自己复原也已经实现了,便对与魔方的状态表示当时也是一知半解,对之前的魔方状态法是不满意的,前几天有了思路就推导了出来, 不过没有之前踩的坑,也不会有现在的结论。
这个魔方状态表示法,不以整体为推导法,而是以魔方块为导论,很早之前我就知道了一个结论,一个魔方块有24种状态(三阶魔方),但是不知道为何不知,现在大差不差,就以魔方块而言,有棱块与角块:
棱块:2种状态(0或1),12个可移动位置
角块:3种状态(0或1或2),8个可移动位置
中心块状态没太大意义。
三阶状态读取以实现,Demo源码请看:GitHub - 10555gff/mofanCubeStata
注:此结论可任意选择F面,得到的读取结果同样适用,也可用于2-多阶魔方的状态读取
注要看MofanRestore这文件,主要用到的代码是这一段
using System;
using UnityEngine;
public class MofanRestore : MonoBehaviour
{
public static MofanRestore Instance = null;
//当前读取的魔方块
Transform curCubetransform;
int curMoIndex;
string str;
string mofanColor;
private void Start()
{
MofanRestore.Instance = this;
}
public string MofanStata(string mofanName)
{
int n= int.Parse(mofanName.Substring(1)) - 1;
curCubetransform = GameManager.Instance.cubePrefabList[n].transform;
mofanColor = mofanReColor(mofanName);
//区别棱块与角块
switch (mofanColor.Length)
{
case 2:
curMoIndex = mofancubeStat();
return string.Format("{0}{1}{2}{3}", str[0], mofanColor[curMoIndex], str[1], mofanColor[curMoIndex ^ 1]);
case 3:
string tmpStr = swapStr();
return string.Format("{0}{1}{2}{3}{4}{5}", str[0], mofanColor[curMoIndex], str[1], tmpStr[0], str[2], tmpStr[1]);
}
return null;
}
//点乘判断,用得1或-1,返回0
int reAbs(Vector3 v1, Vector3 v2)
{
return (int)Mathf.Abs(Vector3.Dot(v1, v2)) ^ 1;
}
#region 棱块判断块
//用点乘判断是棱块状态
int mofancubeStat()
{
Vector3 v3 = reInitVector();
Vector3 v3fu = isCenter() ? this.transform.forward : this.transform.up;
return reAbs(v3, v3fu);
}
//中间棱块与其它棱块分别定义初始轴
Vector3 reInitVector()
{
switch (curCubetransform.name)
{
//中间层定义初始轴方向
case "M20":
case "M2":
case "M26":
case "M8":
return curCubetransform.forward;
//其它层定义初始轴方向
default:
return curCubetransf