Mover, girar e dimensionar sprites
Ambiente de verificação
- Windows
-
- Janelas 11
- Unity Editor
-
- 25.3.2020F1
- Pacotes do sistema de entrada
-
- 1.2.0
Pré-requisitos para esta dica
As configurações a seguir são pré-configuradas como um pré-requisito para a explicação dessas dicas.
Movendo o sprite
Nos jogos, você costuma usar um controle para mover seu personagem. Desta vez, eu gostaria de usar o teclado para mover o sprite exibido na tela.
Se você alterar o script, poderá movê-lo com um gamepad além do teclado. Cada entrada é resumida em Dicas para o sistema de entrada, portanto, consulte-a.
Colocação de Sprite
Coloque um sprite na vista. Para obter instruções sobre como colocar sprites, consulte as dicas anteriores. Por enquanto, o tipo e o tamanho da imagem podem ser qualquer coisa, desde que esteja visível na visualização.
Há também um texto da explicação da operação, mas isso não afeta essa operação.
Criar um script que permite mover sprites com o teclado
Para mover o sprite por operação de entrada, você precisa criar um script, portanto, crie um script em seu projeto.
O nome é arbitrário, mas neste caso SpriteMove
, é.
Depois de criar e abrir o script, digite o seguinte: Este script é baseado na suposição de que ele será anexado ao sprite a ser movido.
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 o sprite regularmente, você precisa descrever o processo em um método.
FixedUpdate
Neste caso, nós o criamos e descrevemos lá.
Explicarei os detalhes em detalhes outra vez, masUpdate
o número de vezes que um método é chamado por segundo depende do ambiente em que ele está sendo executado.
Portanto, a velocidade do movimento pode mudar dependendo do ambiente de execução.
FixedUpdate
O número de vezes que o método é chamado por segundo é determinado pelo valor de configuração, para que você possa mover o sprite na mesma velocidade em qualquer ambiente.
public class SpriteMove : MonoBehaviour
{
// 一定時間ごとに呼ばれます
void FixedUpdate()
{
// :
}
}
Uma vez que se presume que ele será operado com o teclado desta vez, as informações do teclado são obtidas com o Keyboard.current
.
Se você alterar o código aqui, você também pode obtê-lo com um mouse ou gamepad.
Se você quiser alterá-lo, consulte as dicas a seguir.
// キーボードの情報を取得
var keyboard = Keyboard.current;
if (keyboard == null)
{
Debug.Log("キーボードがありません。");
return;
}
SpriteMove
A classe que você herda de contém informações sobre o objeto ao qual você MonoBehaviour
está anexando.
transform
Ao acessar propriedades, você pode manipular o local do objeto, por exemplo.
Transform.Translate
Você pode chamar um método para mover a posição do objeto de sua posição atual.
As coordenadas X e Y são movidas de acordo com as teclas do cursor, respectivamente.
Space.World
, você pode se mover sem ser afetado pela rotação descrita abaixo.
// スプライトの移動処理
// 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
Você pode chamar um método para girar um objeto de seu estado atual.
O argumento é a quantidade de rotação em relação ao eixo especificado. O eixo X é o eixo esquerdo e direito, o eixo Y é o eixo para cima e para baixo, e o eixo Z é o eixo que retrocede.
Portanto, em 2D, se você multiplicar a rotação em relação ao eixo Z, ele girará no sentido horário e anti-horário.
// スプライトの回転処理
// Rotate メソッドでスプライトが回転します
if (keyboard.spaceKey.isPressed)
{
transform.Rotate(0, 0, 5f);
}
By the way, eu especifiquei no Space.World
método anterior Translate
, mas
Se isso não for especificado, a direção do movimento girará de acordo com a direção da rotação.
Por exemplo, na figura Space.World
abaixo, é especificado, e a operação de movimento direito é realizada com uma rotação de 45°.
Na figura a seguir, Space.World
a operação de movimento à direita é realizada com uma rotação de 45° sem especificar .
Space.World
Se você não especificar dessa maneira, a direção do movimento muda com a direção em que você gira.
Isso é útil para implementar operações 3D e controladas por rádio.
Para o dimensionamento, não há nenhum método para aumentar ou diminuir a escala em relação à escala atual.
localScale
Realizar cálculos na propriedade.
Se você simplesmente multiplicar o valor atual por uma ampliação, poderá dimensioná-lo de acordo com o pressionamento da tecla.
Vector2
Se você configurá-lo com , você pode ampliar apenas a direção X, zoom apenas na direção Y, etc.
// スプライトの拡大縮小
// メソッドはないので localScale プロパティに倍率をかけます
if (keyboard.aKey.isPressed)
{
transform.localScale *= 1.02f;
}
if (keyboard.zKey.isPressed)
{
transform.localScale /= 1.02f;
}
Depois de salvar o script, anexe-o ao sprite. O nome do sprite na hierarquia é o mesmo que o nome do arquivo, portanto, se necessário, altere-o para facilitar a compreensão.
Depois disso, execute o jogo e veja se ele funciona com o teclado.
Acho que isso é suficiente para mover sua nave em um jogo de tiro vertical ou horizontal. Claro, se você calcular automaticamente o movimento do inimigo, você pode movê-lo com o mesmo código.