移动、旋转和缩放精灵
验证环境
- 窗户
-
- 窗户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 的名称与文件名相同,因此如有必要,请对其进行更改以使其更易于理解。
之后,运行游戏,看看它是否适用于您的键盘。
我认为这足以在垂直或水平射击游戏中移动你的飞船。 当然,如果你自动计算敌人的移动,你可以用相同的代码移动它。