Mover, rotar y escalar sprites

Actualización de la página :
Fecha de creación de la página :

Entorno de verificación

Windows
  • Windows 11
Unity Editor
  • 2020.3.25f1
Paquetes del sistema de entrada
  • 1.2.0

Requisitos previos para esta sugerencia

Los siguientes ajustes están preconfigurados como requisito previo para la explicación de estos consejos.

Mover el sprite

En los juegos, a menudo usas un controlador para mover a tu personaje. Esta vez, me gustaría usar el teclado para mover el sprite que se muestra en la pantalla.

Si cambias el script, puedes moverlo con un gamepad además del teclado. Cada entrada se resume en Consejos para el sistema de entrada, así que consúltelo.

Colocación de sprites

Coloque un sprite en la vista. Para obtener instrucciones sobre cómo colocar sprites, consulte los consejos anteriores. Por el momento, el tipo y el tamaño de la imagen pueden ser cualquier cosa, siempre y cuando sea visible en la vista.

También hay un texto de la explicación de la operación, pero no afecta a esta operación.

Crea un script que te permita mover sprites con el teclado

Para mover el sprite por operación de entrada, debe crear un script, así que cree un script en su proyecto. El nombre es arbitrario, pero en este caso SpriteMove , es .

Una vez que haya creado y abierto el script, introduzca lo siguiente: Este script se basa en la suposición de que se adjuntará al sprite que se va a mover.

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

Para Update mover el sprite de forma regular, debe describir el proceso en un método. FixedUpdate En este caso, lo hemos creado y descrito allí.

Explicaré los detalles en detalle en otra ocasión, peroUpdate el número de veces que se llama a un método por segundo depende del entorno en el que se esté ejecutando. Por lo tanto, la velocidad de movimiento puede cambiar según el entorno de ejecución. FixedUpdate El número de veces que se llama al método por segundo viene determinado por el valor de configuración, por lo que puede mover el sprite a la misma velocidad en cualquier entorno.

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

Dado que se supone que esta vez se operará con el teclado, la información del Keyboard.current teclado se obtiene con . Si cambia el código aquí, también puede obtenerlo con un mouse o gamepad.

Si desea cambiarlo, consulte los siguientes consejos.

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

SpriteMove La clase de la que se hereda contiene información sobre el objeto al que MonoBehaviour se está asociando. transform Al acceder a las propiedades, puede manipular la ubicación del objeto, por ejemplo.

Transform.Translate Puede llamar a un método para mover la posición del objeto desde su posición actual. Las coordenadas X e Y se mueven de acuerdo con las teclas del cursor, respectivamente.

Space.World , puede moverse sin verse afectado por la rotación que se describe a continuación.

// スプライトの移動処理
// 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 Puede llamar a un método para rotar un objeto desde su estado actual. El argumento es la cantidad de rotación con respecto al eje especificado. El eje X es el eje izquierdo y derecho, el eje Y es el eje arriba y abajo, y el eje Z es el eje que va hacia atrás. Por lo tanto, en 2D, si multiplicas la rotación con respecto al eje Z, girará en el sentido de las agujas del reloj y en el sentido contrario a las agujas del reloj.

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

Por cierto, especifiqué en el Space.World método anterior Translate , pero Si no se especifica, la dirección del movimiento girará de acuerdo con la dirección de rotación.

Por ejemplo, en la figura Space.World siguiente, se especifica y se realiza la operación de movimiento correcta con una rotación de 45°.

En la siguiente figura, Space.World la operación de movimiento correcto se realiza con una rotación de 45° sin especificar .

Space.World Si no se especifica de esta manera, la dirección del movimiento cambia con la dirección en la que se gira. Esto es útil para implementar operaciones 3D y controladas por radio.

Para el escalado, no hay ningún método para aumentar o disminuir la escala con respecto a la escala actual. localScale Realice cálculos en la propiedad.

Si simplemente multiplica el valor actual por un aumento, puede escalarlo de acuerdo con la pulsación de la tecla. Vector2 Si lo configura con , puede acercar solo la dirección X, acercar solo la dirección Y, etc.

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

Una vez que hayas guardado tu script, adjúntalo a tu sprite. El nombre del sprite en la jerarquía es el mismo que el nombre del archivo, por lo que, si es necesario, cámbielo para que sea más fácil de entender.

Después de eso, ejecute el juego y vea si funciona con su teclado.

Creo que esto es suficiente para mover tu nave en un juego de disparos vertical u horizontal. Por supuesto, si calculas automáticamente el movimiento del enemigo, puedes moverlo con el mismo código.