Déplacer, faire pivoter et mettre à l’échelle des sprites

Page mise à jour :
Date de création de la page :

Environnement de vérification

Windows
  • Fenêtres 11
Éditeur Unity
  • 2020.3.25f1
Packages du système d’entrée
  • 1.2.0

Conditions préalables à cette astuce

Les paramètres suivants sont préconfigurés comme condition préalable à l’explication de ces conseils.

Déplacement du sprite

Dans les jeux, vous utilisez souvent une manette pour déplacer votre personnage. Cette fois-ci, j’aimerais utiliser le clavier pour déplacer le sprite affiché à l’écran.

Si vous modifiez le script, vous pouvez le déplacer avec une manette de jeu en plus du clavier. Chaque entrée est résumée dans les conseils pour le système d’entrée, veuillez donc vous y référer.

Placement des sprites

Placez un sprite dans la vue. Pour obtenir des instructions sur le placement des sprites, reportez-vous aux conseils précédents. Pour l’instant, le type et la taille de l’image peuvent être n’importe quoi tant qu’elle est visible sur la vue.

Il y a aussi un texte de l’explication de l’opération, mais cela n’affecte pas cette opération.

Créez un script qui vous permet de déplacer les sprites à l’aide du clavier

Afin de déplacer le sprite par opération d’entrée, vous devez créer un script, donc créez un script dans votre projet. Le nom est arbitraire, mais dans ce cas SpriteMove , c’est .

Une fois que vous avez créé et ouvert le script, entrez ce qui suit : Ce script est basé sur l’hypothèse qu’il sera attaché au sprite à déplacer.

using UnityEngine;
using UnityEngine.InputSystem;  // 追加

public class SpriteMove : MonoBehaviour
{
  // 一定時間ごとに呼ばれます
  void FixedUpdate()
  {
    // キーボードの情報を取得
    var keyboard = Keyboard.current;
    if (keyboard == null)
    {
      Debug.Log("キーボードがありません。");
      return;
    }

    // スプライトの移動処理
    // Translate メソッドでスプライトの位置が移動します
    // Space.World を指定すると回転の影響をうけません
    if (keyboard.leftArrowKey.isPressed)
    {
      transform.Translate(-0.1f, 0, 0, Space.World);
    }
    if (keyboard.rightArrowKey.isPressed)
    {
      transform.Translate(0.1f, 0, 0, Space.World);
    }
    if (keyboard.upArrowKey.isPressed)
    {
      transform.Translate(0, 0.1f, 0, Space.World);
    }
    if (keyboard.downArrowKey.isPressed)
    {
      transform.Translate(0, -0.1f, 0, Space.World);
    }

    // スプライトの回転処理
    // Rotate メソッドでスプライトが回転します
    if (keyboard.spaceKey.isPressed)
    {
      transform.Rotate(0, 0, 5f);
    }

    // スプライトの拡大縮小
    // メソッドはないので localScale プロパティに倍率をかけます
    if (keyboard.aKey.isPressed)
    {
      transform.localScale *= 1.02f;
    }
    if (keyboard.zKey.isPressed)
    {
      transform.localScale /= 1.02f;
    }
  }
}

Afin de Update déplacer le sprite sur une base régulière, vous devez décrire le processus dans une méthode. FixedUpdate Dans ce cas, nous l’avons créé et décrit ici.

J’expliquerai les détails en détail une autre fois, maisUpdate le nombre de fois qu’une méthode est appelée par seconde dépend de l’environnement dans lequel elle s’exécute. Par conséquent, la vitesse de déplacement peut changer en fonction de l’environnement d’exécution. FixedUpdate Le nombre de fois que la méthode est appelée par seconde est déterminé par la valeur de réglage, de sorte que vous pouvez déplacer le sprite à la même vitesse dans n’importe quel environnement.

public class SpriteMove : MonoBehaviour
{
  // 一定時間ごとに呼ばれます
  void FixedUpdate()
  {
    // :
  }
}

Étant donné qu’il est supposé qu’il sera utilisé avec le clavier cette fois-ci, les informations sur le Keyboard.current clavier sont obtenues avec . Si vous modifiez le code ici, vous pouvez également l’obtenir avec une souris ou une manette de jeu.

Si vous souhaitez le modifier, veuillez vous référer aux conseils suivants.

// キーボードの情報を取得
var keyboard = Keyboard.current;
if (keyboard == null)
{
  Debug.Log("キーボードがありません。");
  return;
}

SpriteMove La classe dont vous héritez contient des informations sur l’objet auquel vous MonoBehaviour vous attachez. transform Lorsque vous accédez aux propriétés, vous pouvez manipuler l’emplacement de l’objet, par exemple.

Transform.Translate Vous pouvez appeler une méthode pour déplacer la position de l’objet à partir de sa position actuelle. Les coordonnées X et Y sont déplacées en fonction des touches de curseur, respectivement.

Space.World , vous pouvez vous déplacer sans être affecté par la rotation décrite ci-dessous.

// スプライトの移動処理
// Translate メソッドでスプライトの位置が移動します
// Space.World を指定すると回転の影響をうけません
if (keyboard.leftArrowKey.isPressed)
{
  transform.Translate(-0.1f, 0, 0, Space.World);
}
if (keyboard.rightArrowKey.isPressed)
{
  transform.Translate(0.1f, 0, 0, Space.World);
}
if (keyboard.upArrowKey.isPressed)
{
  transform.Translate(0, 0.1f, 0, Space.World);
}
if (keyboard.downArrowKey.isPressed)
{
  transform.Translate(0, -0.1f, 0, Space.World);
}

Transform.Rotate Vous pouvez appeler une méthode pour faire pivoter un objet à partir de son état actuel. L’argument est la quantité de rotation par rapport à l’axe spécifié. L’axe X est l’axe gauche et droit, l’axe Y est l’axe haut et bas et l’axe Z est l’axe qui va vers l’arrière. Par conséquent, en 2D, si vous multipliez la rotation par rapport à l’axe Z, il tournera dans le sens des aiguilles d’une montre et dans le sens inverse des aiguilles d’une montre.

// スプライトの回転処理
// Rotate メソッドでスプライトが回転します
if (keyboard.spaceKey.isPressed)
{
  transform.Rotate(0, 0, 5f);
}

D’ailleurs, j’ai spécifié dans la Space.World méthode plus tôt Translate , mais Si ce n’est pas le cas, le sens du mouvement pivotera en fonction du sens de rotation.

Par exemple, dans la figure Space.World ci-dessous, est spécifié et l’opération de mouvement droit est effectuée avec une rotation de 45°.

Dans la figure suivante, Space.World l’opération de mouvement à droite est effectuée avec une rotation de 45° sans spécifier .

Space.World Si vous ne le spécifiez pas de cette manière, la direction du mouvement change avec la direction dans laquelle vous pivotez. Ceci est utile pour la mise en œuvre d’opérations 3D et radiocommandées.

Pour la mise à l’échelle, il n’existe aucune méthode permettant d’augmenter ou de diminuer l’échelle par rapport à l’échelle actuelle. localScale Effectuez des calculs sur la propriété.

Si vous multipliez simplement la valeur actuelle par un grossissement, vous pouvez la mettre à l’échelle en fonction de la pression sur la touche. Vector2 Si vous le définissez avec , vous pouvez zoomer uniquement dans la direction X, zoomer uniquement dans la direction Y, etc.

// スプライトの拡大縮小
// メソッドはないので localScale プロパティに倍率をかけます
if (keyboard.aKey.isPressed)
{
  transform.localScale *= 1.02f;
}
if (keyboard.zKey.isPressed)
{
  transform.localScale /= 1.02f;
}

Une fois que vous avez enregistré votre script, attachez-le à votre sprite. Le nom du sprite dans la hiérarchie est le même que le nom du fichier, donc si nécessaire, modifiez-le pour le rendre plus facile à comprendre.

Après cela, lancez le jeu et voyez s’il fonctionne avec votre clavier.

Je pense que c’est suffisant pour déplacer votre vaisseau dans un jeu de tir vertical ou horizontal. Bien sûr, si vous calculez automatiquement le mouvement de l’ennemi, vous pouvez le déplacer avec le même code.