Juego del cubo de Rubik (con código fuente abierto del juego)

La implementación inicial de este juego del cubo de Rubik se refirió a muchos tutoriales, pero toda la lógica del código fue escrita por mí mismo (el enlace de la publicación original se dará como referencia), y solo se discute la idea de la implementación.

terminado:

La rotación del Cubo de Rubik y el efecto de animación del Cubo de Rubik son compatibles con todas las fórmulas cfop del Cubo de Rubik, y el Cubo de Rubik se puede girar presionando el botón

Presione la tecla alt en el teclado para mover el mouse para observar el Cubo de Rubik en 360 grados sin callejones sin salida

El bloque central del cubo de Rubik tiene un indicador de rotación, que indica si el cubo de Rubik debe girar en sentido horario o antihorario. Haga doble clic en el indicador de rotación para configurarlo rápidamente en el lado F.

El cubo de Rubik gira en el sentido de las agujas del reloj de forma predeterminada. Presione la tecla Ctrl en el teclado para cambiar el tipo de rotación del cubo de Rubik y el tipo de indicación a rotación en el sentido contrario a las agujas del reloj.

La primera construcción se interrumpe, el estado del cubo de Rubik se guarda y se restaura, y se admite la detección de la restauración del cubo de Rubik. Se divide en el cubo de Rubik que se ha restaurado, las dos capas inferiores blancas y la capa superior amarilla se han restaurado. volteado (hay 5 tipos similares), y las dos capas de fondo blanco (similar a 5 tipos), cruz de fondo blanco (similar a 5 tipos)

El algoritmo de detección y restauración de la fórmula cfop del cubo de Rubik se ha completado (original) y la realización de Enlu se ha completado.

Tabla de prueba:

La idea de convertir el juego del cubo de Rubik originalmente surgió de un video en la estación b: ¿ Puede Meng Xinxue Unity hacer un cubo de Rubik?

Me proporcionó una buena idea. Lo que quiero hacer es un cubo de Rubik de tercer orden. La rotación del cubo de Rubik es el mayor problema. La idea del tipo grande en el video es:

1. Primero coloque 27 cubos para formar un cubo de Rubik y luego use 6 cubos delgados como controladores del cubo de Rubik, que se colocan en los seis lados del cubo de Rubik, y cada controlador de cubo de Rubik toca 9 cubos.

2. Cuando una determinada superficie del cubo de Rubik está a punto de girar, es equivalente a seleccionar un determinado controlador de cubo de Rubik, y luego el controlador de cubo de Rubik seleccionado detecta el objeto que se toca, lo convierte en su propio subobjeto y controles Si se vuelve a girar el dispositivo, se completa la rotación de una determinada cara del cubo de Rubik.

3. Si se selecciona un controlador de cubo de Rubik, los 5 controladores de cubo de Rubik restantes no pueden tener subobjetos. Si los hay, los subobjetos anteriores deben ser liberados, para evitar la superficie incompleta del cubo obtenida por el controlador de cubo de Rubik formado. . .

Aunque esta idea es factible, tiene una gran desventaja, solo puede rotar una determinada cara del cubo de Rubik, cuando quiero rotar (E, M, S) en el medio del cubo de Rubik, no puede hacerlo. Esto implica Al mecanismo de juicio del toque unitario:

Cuando el objeto A y el objeto B se tocan, si el objeto C toca el objeto A, la unidad pensará que el objeto C toca el objeto A y el objeto B.

Para usar una analogía más apropiada, si dos personas reciben una descarga eléctrica, usted recibirá una descarga eléctrica sin importar a quién toque.

Si uso las ideas mencionadas anteriormente para realizar cualquier rotación intermedia de E, M y S en el cubo de Rubik, lo que se gira es todo el cubo de Rubik, ¡no el bloque del medio!

Entonces, si queremos que el Cubo de Rubik formado por 27 cuadrados pequeños pueda girar a voluntad, el primer problema a resolver es: ¿cómo generar un controlador?

La forma en que se me ocurrió es usar coordenadas tridimensionales para juzgar. Los hechos han demostrado que este método es muy efectivo. Siento que puede usarse no solo para el tercer nivel, sino también para el juicio del controlador del Cubo de Rubik. juegos como el cuarto y quinto nivel.

Primero, pongo el eje del cubo de Rubik de tercer orden en (0, 0, 0), y el blanco es la superficie inferior, y encontraré esa regla:

(a,a,-1)F (1,a,a)R (a,1,a)U

(a,a,1)B (-1,a,a)L (a,-1,a)D

Si desea juzgar los cuadrados en la superficie F, solo necesita dejar que los 27 cuadrados juzguen respectivamente si el eje z de las coordenadas tridimensionales es igual a -1, y obtiene 9 cuadrados calificados.

(a,0,a) E (0,a,a) M (a,0,a) S

Si desea juzgar los cuadrados en la superficie E, solo necesita dejar que los 27 cuadrados juzguen respectivamente si el eje y de las coordenadas tridimensionales es igual a 0, y obtiene 9 cuadrados medios que cumplen las condiciones.

f=S(condición)+F(condición) r=M(condición)+R(condición) u=E(condición)+U(condición)

b=S(condición)+ B(condición) l=M(condición)+L(condición) d=E(condición)+D(condición)

Si desea juzgar los cuadrados en el plano f, solo necesita dejar que 27 cuadrados juzguen respectivamente si el eje y de las coordenadas tridimensionales es igual a 0 o si el eje z es igual a -1, y usted obtener 18 cuadrados calificados.

Después de la implementación, encontré un pequeño problema, es decir, habrá un pequeño error en las coordenadas del Cubo de Rubik después de la rotación, no será solo igual a 1 o 0, puede ser 1.001 o 0.0082, etc. así que use Mathf.Round() para verificar el error antes de juzgar Solo al eliminar se puede obtener la cantidad correcta de cubos, de lo contrario, el cubo de Rubik perderá cubos si se da la vuelta.

La rotación del cubo de Rubik es la parte central de todo el juego, y los pasos para realizarla son:

1. Para la creación de 27 cubos de Rubik, la referencia principal es: Unity Tutorial | Te enseña a deletrear un "Cubo de Rubik" en 3D paso a paso , y solo se genera un modelo que no se puede mover.

2. Se crean 12 controladores de cubos de Rubik, con 6 controladores de superficie y 6 controladores de bloque central, que se utilizan para controlar 27 cubos.

3. Se definen 18 botones y se inicializan con un script. La referencia principal es: Unidad: use una matriz para administrar varios botones.

4. Realización de la animación de rotación del cubo de Rubik:

  1. La animación del cubo de Rubik realizada por interpolación de cuaterniones evita el problema del bloqueo universal, pero la rotación de cuaterniones desaparece solo una vez, por lo que es necesario guardar el valor de rotación y mantener la continuidad del ángulo, lo cual es una solución perfecta El método es el método de superposición de ángulos (mi original).

Método de superposición de ángulos: primero defina una dirección inicial de rotación, agregue 90 al girar en el sentido de las agujas del reloj, reste 90 al girar en el sentido contrario a las agujas del reloj y limite el ángulo entre -360 grados y 360 grados. Puede comprender el principio de rotación de esta manera y registrar el último Ángulo de tiempo, gire en el sentido de las agujas del reloj y sume 90 para obtener el valor objetivo de la rotación en el sentido de las agujas del reloj, y reste 90 en el sentido contrario a las agujas del reloj para obtener el valor objetivo de la rotación en el sentido contrario a las agujas del reloj.

2. Los valores de los controladores del cubo de Rubik no pueden afectarse entre sí. Después de mi exploración, las animaciones de los 12 controladores del cubo de Rubik simplemente no se ven afectadas entre sí.

3. La animación de rotación del cubo de Rubik debe completarse a tiempo y asegurarse de que esté en su lugar. El uso de rutinas puede resolver este problema muy bien.

El código del efecto de animación del cubo mágico es:

private IEnumerator RotateOverTime(Transform transformToRotate, Quaternion targetRotation, float duration)
    {
        var timePassed = 0f;
        while (timePassed < duration)
        {
            var factor = timePassed / duration;

            transformToRotate.rotation = Quaternion.Slerp(transformToRotate.rotation, targetRotation, factor);
            // 增加自上一帧起经过的时间
            timePassed += Time.deltaTime;

            // 重要的这告诉Unity在这里中断,渲染这个帧
            // 在下一帧中从这里继续
            yield return null;
        }
        // 要确保以精确值结束,请在完成时设置目标旋转修复
        transformToRotate.rotation = targetRotation;
    }

El método para llamar a la rutina de animación:

StartCoroutine(RotateOverTime(mofanControlList[mofanConNum].transform,Quaternion.Euler(mofan_rotate * n1), 0.3f));

Observe libremente la implementación del cubo de Rubik:

Un guión está vinculado a la cámara principal para permitir que la cámara gire alrededor del Cubo de Rubik para lograr un efecto de observación aleatorio, pero esto también genera un problema, ya que se usan botones para controlar cada cara del Cubo de Rubik, pero es difícil saber cuál. cara es de qué cara, así que agregué un indicador de rotación del cubo de Rubik en el bloque central del cubo de Rubik.

Ahorro y restauración del estado del cubo de Rubik:

Se definen dos Vector3 con la estructura, que se utilizan para guardar las coordenadas y los ángulos de Euler de los cubos de Rubik 27. Después de guardar las coordenadas correspondientes y los ángulos de Euler del cubo de Rubik, se puede guardar el estado del cubo de Rubik. del cubo de Rubik se encuentran Y el ángulo de Euler puede invertir el color del cubo de Rubik, ver específicamente: Rubik's Cube State Detection 2_qq_39858654's Blog-CSDN Blog

Enumeré 480 registros y lo encontré en aproximadamente una semana.

Detección de la reducción del cubo de Rubik:

1. Primero juzgue si los 27 cubos de Rubik están restaurados:

Cuando es necesario detectar si un Cubo de Rubik está restaurado, es detectar si las coordenadas y el ángulo de rotación del Cubo de Rubik son correctos.

Detección de restauración de coordenadas de bloque de borde:

Por ejemplo: para detectar los bordes rojo y blanco, puede sumar las coordenadas del bloque central del cubo rojo a las coordenadas del centro del cubo blanco para obtener las coordenadas de los bordes rojo y blanco.

Detección de restauración de coordenadas de bloque de esquina:

Por ejemplo: para detectar bordes rojos, blancos y verdes, puede sumar las coordenadas del bloque central del cubo rojo a las coordenadas del centro del cubo blanco y las coordenadas del centro del cubo verde para obtener las coordenadas de los bordes rojo, blanco y verde.

Bloque de borde, detección de reducción de ángulo de rotación de bloque de esquina:

Siempre que el ángulo de rotación del bloque de borde o bloque de esquina sea el mismo que el ángulo de rotación del cubo de Rubik más central, se restaura.

Cuando pasan las dos pruebas anteriores, significa que un cubo de Rubik se ha restaurado con éxito, por lo que la restauración en tiempo real de 20 cubos de Rubik se puede detectar en tiempo real.
 

2. Luego, juzgue la cantidad de cubos de Rubik restaurados, divididos en 4, 8, 12 y 20. Para las diferentes etapas de restauración, si la capa superior amarilla se gira con éxito depende de si el bloque central amarillo está en el mismo lado que otros bloques. .

El código completo del juego ha sido subido a gitee, la dirección es:

Cubo de Rubik inteligente

Supongo que te gusta

Origin blog.csdn.net/qq_39858654/article/details/124038491
Recomendado
Clasificación