移动、旋转和缩放精灵

更新页 :
页面创建日期 :

验证环境

窗户
  • 窗户11
Unity 编辑器
  • 2020.3.25f1
输入系统包
  • 1.2.0

此提示的先决条件

以下设置已预先配置为解释这些提示的先决条件。

移动精灵

在游戏中,您经常使用控制器来移动角色。 这一次,我想使用键盘来移动屏幕上显示的精灵。

如果更改脚本,除了键盘之外,还可以使用游戏手柄移动脚本。 每个输入都总结在输入系统的提示中,因此请参考它。

Sprite 放置

在视图中放置一个 Sprite。 有关放置精灵的说明,请参阅前面的提示。 目前,图像的类型和大小可以是任何内容,只要它在视图上可见即可。

还有操作说明的文字,但不影响此操作。

创建一个脚本,允许您使用键盘移动精灵

为了通过输入操作移动精灵,你需要创建一个脚本,所以在你的项目中创建一个脚本。 名称是任意的,但在本例 SpriteMove 中,它是 。

创建并打开脚本后,输入以下内容: 此脚本基于以下假设:它将附加到要移动的 Sprite。

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

为了 Update 定期移动精灵,您需要在方法中描述该过程。 FixedUpdate 在本例中,我们在那里创建并描述了它。

我将在下次详细解释细节,但Update 每秒调用方法的次数取决于它运行的环境。 因此,移动速度可能会根据执行环境而变化。 FixedUpdate 每秒调用方法的次数由设置值决定,因此您可以在任何环境中以相同的速度移动 Sprite。

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

由于假设这次将使用键盘进行操作,因此 Keyboard.current 使用键盘信息获取。 如果您在此处更改代码,也可以使用鼠标或游戏手柄获取它。

如果您想更改它,请参考以下提示。

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

SpriteMove 从中继承的类包含有关要附加到 MonoBehaviour 的对象的信息。 transform 例如,访问属性时,可以操作对象的位置。

Transform.Translate 可以调用方法将对象的位置从其当前位置移动。 X 和 Y 坐标分别根据光标键移动。

Space.World ,您可以不受下述旋转的影响而移动。

// スプライトの移動処理
// 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 可以调用方法将对象从其当前状态旋转。 参数是相对于指定轴的旋转量。 X轴是左右轴,Y轴是上下轴,Z轴是向后走的轴。 因此,在 2D 中,如果将相对于 Z 轴的旋转相乘,它将顺时针和逆时针旋转。

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

顺便说一句,我之前 Translate 在方法中 Space.World 指定了 ,但是 如果未指定,则移动方向将根据旋转方向旋转。

例如,在下图 Space.World 中,指定了,并且以 45° 旋转执行正确的运动操作。

在下图中, Space.World 右运动操作是在不指定 的情况下旋转 45° 执行的。

Space.World如果不以这种方式指定,则移动方向会随着旋转方向而变化。 这对于实现 3D 和无线电控制操作很有用。

对于缩放,没有方法可以相对于当前缩放增加或减少缩放。 localScale 对属性执行计算。

如果只是将当前值乘以放大倍数,则可以根据按键进行缩放。 Vector2 如果将其设置为 ,则可以仅放大 X 方向,仅放大 Y 方向等。

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

保存脚本后,将其附加到精灵中。 层次结构中 Sprite 的名称与文件名相同,因此如有必要,请对其进行更改以使其更易于理解。

之后,运行游戏,看看它是否适用于您的键盘。

我认为这足以在垂直或水平射击游戏中移动你的飞船。 当然,如果你自动计算敌人的移动,你可以用相同的代码移动它。