前置き
Unityでキーを押した際、短く押した場合(短押し)と長押しをした場合で処理を分けたい場合があります。
・攻撃キーを短押し:通常攻撃が出る
・攻撃キーを長押し:必殺技が出る
という風。
実装例
Invokeによるメソッドが呼び出し中か否かを判定するMonoBehaviour.IsInvoking
(https://docs.unity3d.com/ja/2018.4/ScriptReference/MonoBehaviour.IsInvoking.html)
を利用して作ったもの。↓
float LongPushTime = 0.5f; // 長押しに必要な時間
void Update()
{
if (Input.GetKeyDown(KeyCode.Space))
{
Invoke(nameof(LongPushed), LongPushTime);
}
else if (Input.GetKeyUp(KeyCode.Space) && IsInvoking(nameof(LongPushed)))
{
CancelInvoke(nameof(LongPushed));
ShortPushed();
}
}
void ShortPushed()
{
/* 短押しアクション */
}
void LongPushed()
{
/* 長押しアクション */
}
メリットとしては、Invokeをタイマー代わりに利用しているので、押下時間を計測するための変数を用意する必要が無い点です。
細かい点として、このコードの場合は
短押しアクションは キーを離したタイミング で実行されますが、
長押しアクションは 長押し時間が経過したタイミング で実行されます。
これは、長押ししている時に最短で長押しアクションが出るようにするためですが、
長押し時も最短ではなく キーを離したタイミング で実行させたい場合などには他の方法をお勧めします。
Qiita初記事ですが、ご参考になれば幸いです。