[Plug-in Unity3D] EasyTouch calcule l'angle de rotation du joystick et le rôle de contrôle à huit directions du joystick

1. Introduction

Lorsque j'ai écrit le contrôle à la troisième personne, j'ai utilisé WASD pour contrôler le caractère dans le test de l'ordinateur au début.
Plus tard, je dois le publier sur le téléphone mobile, j'ai donc ajouté un joystick
. Le code pour contrôler le caractère a été écrit et le personnage se déplace dans huit directions.

2. Idées de contrôle traditionnelles

 //当摇杆处于移动状态时,角色开始奔跑
  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. Contrôlez l'angle de bascule

Si vous souhaitez contrôler le rôle selon l’idée traditionnelle du joystick, il est très gênant de réécrire le code du rôle de contrôle. Je vais donc juger de la direction actuelle du joystick en calculant l’angle de rotation du joystick
. Maintenant, nous commençons à frapper le code.
Commençons par déboguer Observer la valeur de retour de l'axe x et de l'axe y du
joystick // Déplacer le joystick

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

Les résultats du débogage sont:
gauche: x = -1, y = 0; rotation dans le sens horaire X augmente progressivement et Y augmente progressivement en
haut: x = 0, y = 1; rotation dans le sens horaire X augmente progressivement et Y diminue progressivement à
droite : x = 1, y = 0 ; X dans le sens horaire rotation diminue progressivement, Y diminue progressivement
dans: x = 0, y = -1 ; rotation dans le sens horaire devient graduellement plus petite X, Y augmente progressivement
nous culbuteur basemap comme deux semi-circulaire, semi-circulaire supérieure et demi - cercle abaisser
Insérez la description de l'image ici
ensuite: le
mouvement de l' axe X vers la gauche, X = -1; axe X se déplace vers la droite: X = 1; axe X , de la gauche vers la droite de 180 degrés de rotation de l'
axe Y Lorsque vous vous déplacez vers la gauche, Y = 0; lorsque l'axe Y se déplace vers la droite: Y = 0; l'axe Y pivote de 180 degrés de gauche à droite.
Si vous regardez directement mes résultats de débogage, c'est certainement un peu étourdi. Il est recommandé de se référer à mon pendant le débogage Les résultats du débogage peuvent être compris de cette manière.
Si nous voulons calculer le degré de rotation actuel du joystick dans le coin supérieur gauche, comment le calculer?
Quiconque est allé à l'école primaire peut le faire, seulement pour voir les têtes -1 et 0 renvoyées par le joystick sont confuses

Lorsque le joystick se déplace vers la gauche, il est de 0 degré, 360 degrés (parce que 360 ​​degrés est un cercle, il est déjà revenu au point éloigné).
Lorsque le joystick se déplace vers le haut, il est de 90 degrés
. Degré
Lorsque le joystick descend, il fait 270 degrés

Comme on sait combien de degrés cela est beaucoup plus facile à
calculer, la formule est la suivante:
lorsque l'axe X est à droite, c'est 1, c'est-à-dire que l'axe X est à 180 degrés, puis: 1 * 90 + 90 = 180 L'
angle de rotation actuel de l'axe X est: axe X Valeur de retour * 90 degrés + 90 degrés

Pensez-vous que ce soit fini? J'étais trop heureux de calculer l'angle de rotation du demi-cercle supérieur avec cette formule.
Maintenant, nous voulons obtenir l'angle de rotation du demi-cercle inférieur, puis utiliser l'angle de rotation du demi-cercle supérieur + l'angle de rotation du demi-cercle inférieur = l'angle de rotation actuel
lorsque le joystick se déplace vers le demi-cercle inférieur Comment calcule-t-on l'angle de rotation?
Nous savons déjà que l'axe Y est 0 à gauche, 0 à droite et -1 en bas. Continuez à utiliser la formule pour calculer l'axe X

Y gauche: 0 * 90 + 90 = 90
Y haut: 1 * 90 + 90 = 180
Y bas: -1 * 90 + 90 = 0
Y droit: 0 * 90 + 90 = 90
X gauche: -1 * 90 + 90 = 0
X haut: 0 * 90 + 90 = 90
X bas: 0 * 90 + 90 = 90
X droite: 1 * 90 + 90 = 180

D'après les résultats , on peut conclure
lorsque l'axe Y est inférieur à 90 degrés, le basculeur est en demi - cercle
gauche inférieur de l' axe Y lorsque X est inférieur à 90 degrés et inférieur à 90 °: 270 degrés d'angle de rotation de + Y-axe
lorsque l'axe Y est inférieur à 90 Lorsque le degré est supérieur à X et 90 degrés, c'est le coin inférieur droit: 180 degrés + l'angle de rotation de l'axe Y est
terminé. Je commence à taper le code. Le code n'est pas beaucoup. Je l'ai posté directement. Après avoir lu le texte de l'appel, je pense que vous savez déjà comment ces codes sont renvoyés. Quelque chose est arrivé

/// 计算摇杆角度 <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, maintenant nous savons combien de degrés le joystick actuel a tourné, nous pouvons facilement juger la direction actuelle du mouvement par l'angle

Lors de l'utilisation du clavier:
A = gauche
WA = supérieur gauche
W = supérieur
WD = supérieur droit
D = droit
SD = inférieur droit
S = inférieur
SA = inférieur gauche

Lorsque l'angle du joystick est de 0 degré, vers la gauche
Lorsque l'angle du joystick est de 90 degrés, vers le haut
Lorsque l'angle du joystick est de 180 degrés, vers la droite
Ensuite, nous ne devons pas écrire de cette façon, pouvez-vous être sûr que le joueur utilise le joystick si précisément?
Parce que mon rôle de contrôle est ici de huit directions, donc: 360/8 = 45
Chaque direction peut être déclenchée à 45 degrés, puis venez à la solution suivante:
Supérieur: angle actuel <= 90 + 45/2 = 112,5 && angle actuel> =
90-45 / 2 = 67,5 préparé de la même manière, donnant le code suivant:

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";

Vous avez terminé, publiez-le rapidement sur votre téléphone et essayez-le, voici l'effet d'opération à huit voies que je veux

Publié 226 articles originaux · loué 509 · 530 000 vues

Je suppose que tu aimes

Origine blog.csdn.net/q764424567/article/details/103952897
conseillé
Classement