このフレームで押された
CoddyのUnityジャーニー「本格的なゲームを作る」セクションの一部。レッスン 45/56。
isPressedは、押し続けている間の各フレームで「今、押されているか?」に答えます。押すたびに一度だけ実行したい処理には、コントロールがさらに2つの答えを持っています。wasPressedThisFrameはキーまたはボタンが押されたフレームでのみtrueになり、wasReleasedThisFrameはキーまたはボタンが離されたフレームでのみtrueになります。これらはInput.GetKeyDownとInput.GetKeyUp、およびGetMouseButtonDownとGetMouseButtonUpの代わりになります。このゴム印は、マウスボタンを押すと下がり、離すと上がります。
using UnityEngine;
using UnityEngine.InputSystem;
public class Stamp : MonoBehaviour
{
public float drop = 0.5f;
private int stamps;
void Update()
{
Mouse mouse = Mouse.current;
if (mouse.leftButton.wasPressedThisFrame)
{
transform.position += Vector3.down * drop;
stamps++;
Debug.Log("Stamp " + stamps);
}
if (mouse.leftButton.wasReleasedThisFrame)
{
transform.position += Vector3.up * drop;
}
}
}0.5秒間クリックを押し続けても、Stamp 1と一度だけログに出力され、ゴム印は一度だけ下がって元の位置に戻ります。最初のifでisPressedを使うと、同じクリックで約30回ログに出力され、ゴム印は机に15単位沈み込みます。キーも同じように動作します。Keyboard.current.spaceKey.wasPressedThisFrameは、スペースキーを押すたびに一度だけtrueになります。
チャレンジ
中級短距離走者はスターティングブロックで待っています。そのスクリプトにはspeed(6)とcrouch(0.3)があります。
- Spaceを押すと、走者はブロックに身をかがめます。
crouch単位だけ下に移動し、Setがログに記録されます。 - その後Spaceを離すと、走者は再び立ち上がり(
crouch単位だけ上に移動)、Go!がログに記録され、走り始めます。それ以降は、毎秒speed単位の速さで+z方向に走ります。 - Spaceを押し続けても、
Setが記録されるのは1回だけで、フレームごとには記録されません。走者が走り始めると、Spaceを押しても何も起こりません。
Keyboard.currentでSpaceの状態を読み取ります。Playを押し、Spaceを押し続けてから離し、その後Checkを押します。
自分で試してみよう
using UnityEngine;
using UnityEngine.InputSystem;
public class Sprinter : MonoBehaviour
{
public float speed = 6f;
public float crouch = 0.3f;
void Update()
{
// Spaceを押したとき: しゃがんでSetをログに出力する。Spaceを離したとき: 立ち上がり、Go!をログに出力して走る。
}
}
このレッスンには短いクイズがあります。レッスンを始めて解答し、進捗を記録しましょう。