移動、旋轉和縮放精靈
驗證環境
- 窗戶
-
- 窗戶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的名稱與檔名相同,因此如有必要,請對其進行更改以使其更易於理解。
之後,運行遊戲,看看它是否適用於您的鍵盤。
我認為這足以在垂直或水平射擊遊戲中移動你的飛船。 當然,如果你自動計算敵人的移動,你可以用相同的代碼移動它。