[Unity3D plug-in] EasyTouch calcula el ángulo de rotación del joystick y la función de control de ocho direcciones del joystick

1. Introducción

Cuando escribí el control en tercera persona, usé WASD para controlar el personaje en la prueba de computadora al principio.
Más tarde, necesito publicarlo en el teléfono móvil, así que agregué un joystick
. El código para controlar el personaje ha sido escrito y el personaje se mueve en ocho direcciones.

2. Ideas de control tradicionales

 //当摇杆处于移动状态时,角色开始奔跑
  void OnJoystickMove(MovingJoystick move)
  {
    if (move.joystickName != "EasyJoystick")
    {
       return;
    }
   //获取摇杆偏移量
   float joyPositionX = move.joystickAxis.x;
   float joyPositionY = move.joystickAxis.y;
   if (joyPositionY != 0 || joyPositionX != 0)
   {
      //设置角色的朝向(朝向当前坐标+摇杆偏移量)
      transform.LookAt(new Vector3(transform.position.x + joyPositionX, transform.position.y, transform.position.z + joyPositionY));
       //移动玩家的位置(按朝向位置移动)
      transform.Translate(Vector3.forward * Time.deltaTime * 7.5F);
      //播放奔跑动画
       animation.CrossFade("Run");
     }
  }

3. Controlar el ángulo del balancín

Si desea controlar el rol de acuerdo con la idea tradicional del joystick, es muy problemático volver a escribir el código del rol de control, por lo que juzgaré la dirección actual del joystick calculando el ángulo de rotación del joystick
. Ahora comenzamos a tocar el código.
Primero, eliminemos el error Observe el valor de retorno del eje xy del eje y del
joystick // Mueva el joystick

void OnJoystickMove(MovingJoystick move)
{
      Debug.Log(move.joystickAxis.x + "," + move.joystickAxis.y);
}

Los resultados de la depuración son:
izquierda: x = -1, y = 0; la rotación en sentido horario X aumenta gradualmente e Y aumenta gradualmente en la parte
superior: x = 0, y = 1; la rotación en sentido horario X aumenta gradualmente y Y disminuye gradualmente a la
derecha : x = 1, y = 0 ; X agujas del reloj rotación se vuelve gradualmente más pequeño, Y disminuye gradualmente
en: x = 0, y = -1 ; rotación en sentido horario se vuelve gradualmente más pequeño X, Y aumenta gradualmente
que Rocker mapa base como dos y bajar semicírculo semi-circular, semi-circular superior
Inserte la descripción de la imagen aquí
entonces:
el movimiento del eje X a la izquierda, X = -1; eje X se mueve a la derecha: X = 1; X eje de la izquierda a la derecha por 180 grados de rotación
del eje y Cuando se mueve hacia la izquierda, Y = 0; cuando el eje Y se mueve hacia la derecha: Y = 0; el eje Y gira 180 grados de izquierda a derecha.
Si observa los resultados de mi depuración directamente, definitivamente está un poco mareado. Se recomienda hacer referencia a mi durante la depuración Los resultados de la depuración se pueden entender de esta manera.
Si queremos calcular el grado actual de rotación del joystick en la esquina superior izquierda, ¿cómo calcularlo?
Cualquiera que haya asistido a la escuela primaria puede hacerlo, solo para ver que las cabezas de -1 y 0 devueltas por el joystick están confundidas, y yo soy igual. Me llevó mucho tiempo hacerlo.

Cuando el joystick se mueve hacia la izquierda, es 0 grados, 360 grados (porque 360 ​​grados es un círculo, ya ha regresado al punto lejano).
Cuando el joystick se mueve hacia arriba, es 90 grados.
Cuando el joystick se mueve hacia la derecha, es 180. Grado
Cuando el joystick se mueve hacia abajo, es 270 grados

Como se sabe cuántos grados es mucho más fácil de
resolver, la fórmula es:
cuando el eje X está a la derecha, es 1, es decir, el eje X es 180 grados, luego: 1 * 90 + 90 = 180 El
ángulo de rotación actual del eje X es: eje X Valor de retorno * 90 grados + 90 grados

¿Crees que esto ha terminado? Estaba muy contento de calcular el ángulo de rotación del semicírculo superior con esta fórmula.
Ahora queremos obtener el ángulo de rotación del semicírculo inferior y luego usar el ángulo de rotación del semicírculo superior + el ángulo de rotación del semicírculo inferior = el ángulo de rotación actual
cuando el joystick se mueve al semicírculo inferior ¿Cómo calculamos el ángulo de rotación?
Ya sabemos que el eje Y es 0 a la izquierda, 0 a la derecha y -1 en la parte inferior. Continúe usando la fórmula para calcular el eje X

Y izquierda: 0 * 90 + 90 = 90
Y arriba: 1 * 90 + 90 = 180
Y abajo: -1 * 90 + 90 = 0
Y derecha: 0 * 90 + 90 = 90
X izquierda: -1 * 90 + 90 = 0
X Arriba: 0 * 90 + 90 = 90
X Abajo: 0 * 90 + 90 = 90
X Derecha: 1 * 90 + 90 = 180

De los resultados del cálculo se puede concluir que
cuando el eje Y es inferior a 90 grados, el eje de balancín está en el semicírculo inferior.
Cuando el eje Y es inferior a 90 grados y X es inferior a 90 grados, es el ángulo inferior izquierdo: 270 grados + ángulo de rotación del eje Y
Cuando el eje Y es inferior a 90 Cuando el grado es mayor que X y 90 grados, es la esquina inferior derecha: se
realiza el ángulo de rotación del eje 180 grados + Y. Empiezo a escribir el código. El código no es mucho. Lo publiqué directamente. Después de leer el texto de la apelación, creo que ya sabe cómo se devuelven estos códigos. Algo paso

/// 计算摇杆角度 <summary>
/// 计算摇杆角度
/// </summary>
/// <param name="_joyPositionX">摇杆X轴</param>
/// <param name="_joyPositionY">摇杆Y轴</param>
/// <returns>返回当前摇杆旋转多少度</returns>
private float CalculaAngle(float _joyPositionX, float _joyPositionY)
{
   float currentAngleX = _joyPositionX * 90f + 90f;//X轴 当前角度
   float currentAngleY = _joyPositionY * 90f + 90f;//Y轴 当前角度
   //下半圆
   if (currentAngleY < 90f)
   {
        if (currentAngleX < 90f)
        {
             return 270f + currentAngleY;
        }
        else if (currentAngleX > 90f)
        {
              return 180f + (90f - currentAngleY);
        }
     }
     return currentAngleX;
}

Ok, ahora sabemos cuántos grados ha girado el joystick actual, podemos juzgar fácilmente la dirección actual del movimiento por ángulo

Al usar el control del teclado:
A = izquierda
WA = superior izquierda
W = superior
WD = superior derecha
D = derecha
SD = inferior derecha
S = inferior
SA = inferior izquierda

Cuando el ángulo del joystick es de 0 grados, a la izquierda
Cuando el ángulo del joystick es de 90 grados, hacia arriba
Cuando el ángulo del joystick es de 180 grados, a la derecha
Entonces no debemos escribir de esta manera, ¿puede estar seguro de que el jugador opera el joystick con tanta precisión?
Debido a que mi función de control aquí es de ocho direcciones, entonces: 360/8 = 45
Cada dirección puede activarse a 45 grados, luego llegar a la siguiente solución:
Superior: ángulo actual <= 90 + 45/2 = 112.5 && ángulo actual> =
90-45 / 2 = 67.5 preparado de la misma manera, dando como resultado el siguiente código:

float currentAngle = CalculaAngle(joyPositionX, joyPositionY);

if (currentAngle <= 22.5f && currentAngle >= 0f || currentAngle <= 360f && currentAngle >= 337.5f)//0;左
    CurrentDire = "A";
else if (currentAngle <= 67.5f && currentAngle >= 22.5f)//45;左上
    CurrentDire = "WA";
else if (currentAngle <= 112.5f && currentAngle >= 67.5f)//90;上
    CurrentDire = "W";
else if (currentAngle <= 157.5f && currentAngle >= 112.5f)//135;右上
    CurrentDire = "WD";
else if (currentAngle <= 202.5f && currentAngle >= 157.5f)//180;右
    CurrentDire = "D";
else if (currentAngle <= 247.5f && currentAngle >= 202.5f)//225;右下
    CurrentDire = "SD";
else if (currentAngle <= 292.5f && currentAngle >= 247.5f)//270;下
    CurrentDire = "S";
else if (currentAngle <= 337.5f && currentAngle >= 292.5f)//315;左下
    CurrentDire = "SA";

Ya terminaste, publícalo rápidamente en tu teléfono y pruébalo, este es el efecto de operación de ocho vías que quiero

226 artículos originales publicados · 509 elogiados · 530,000 vistas

Supongo que te gusta

Origin blog.csdn.net/q764424567/article/details/103952897
Recomendado
Clasificación