移動、旋轉和縮放精靈

更新頁 :
頁面創建日期 :

驗證環境

窗戶
  • 窗戶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的名稱與檔名相同,因此如有必要,請對其進行更改以使其更易於理解。

之後,運行遊戲,看看它是否適用於您的鍵盤。

我認為這足以在垂直或水平射擊遊戲中移動你的飛船。 當然,如果你自動計算敵人的移動,你可以用相同的代碼移動它。