自前のフレーム変数を使い判定しているが
Time.deltaTimeを使用して時間単位で判定するのが適切でしょうか?
自前で作る必要はないというかUnityが持っている機能なのでそれを使うのはどうでしょうか?というのが答えです。
Time.deltaTime
がフレームを考慮した時間です。Time.timeScale
の値が1である限りターゲットとするFPS = 1秒になるように前フレームとの経過時間をできる限り正確に返してくれます。
自前で実装する必要はほぼ無いというのが僕の印象ですが、不安な部分があるなら小さなテストシーンを作って期待する動作になるか検証すると良いと思います。
Update関数内で判定を行うと処理落ちしたとき端末により動作に差がでるのではないか
(時間系の処理はFixedUpdateに記載するべきでしょうか? ※FixedUpdateは常に一定のため)
上で話した通りTime.deltaTime
を使う限りほぼ大丈夫です。というか信じる他ありません。
もし00秒である地点に完璧に移動したい時や滑らかに移動したい場合はVector3.Lerp
を使うと良いです。モバイル向けなら多用は厳禁ですので注意してください。
FixedUpdate
はUpdate
とまったく違います。Update
は期待するFPS(Application.targetFrameRate
)に達するまで出来る限り呼んでくれます。
FixedUpdate
はProject Settingsで決めた一定間隔で呼ばれるものです。
それなら一定間隔で呼ばれるFixedUpdate
で処理すれば良いと思うかもしれませんが、処理落ちした次のフレームでまた別の処理を呼ばれ処理しきれずフリーズやクラッシュするより、終わるまで少し停止してくれた方が端末に優しいと思いませんか?
なのでUpdate
が存在していると思います。
FixedUpdateの呼び出し回数設定
初期値は0.02(FPSで言えば50)
溜め攻撃の実装
溜め攻撃の実装を簡単に書いてみました。
良ければ参考にしてみてください。
C#
1
2using UnityEngine;
3
4public sealed class UserController : MonoBehaviour
5{
6 /// <summary>
7 /// 何秒押し続ければ溜め攻撃になるか?
8 /// </summary>
9 const float PointerDownDuration = 1f;
10
11 float pointerDownTime;
12
13 void Update()
14 {
15 // 左クリック中は時間を加算 キーの場合はInput.GetButton("キー名");
16 if (Input.GetMouseButton(0))
17 {
18 pointerDownTime += Time.deltaTime;
19 }
20 // 左クリックを離したタイミングで攻撃 キーの場合はInput.GetButtonUp("キー名");
21 else if(Input.GetMouseButtonUp(0))
22 {
23 // 想定時間経過してれば溜め攻撃
24 if (pointerDownTime >= PointerDownDuration)
25 {
26 ChargeAttack();
27 }
28 // 想定時間経過していなければ通常攻撃
29 else
30 {
31 Attack();
32 }
33 pointerDownTime = 0;
34 }
35 }
36
37 /// <summary>
38 /// 通常攻撃
39 /// </summary>
40 void Attack()
41 {
42 Debug.Log("通常攻撃");
43 }
44
45 /// <summary>
46 /// 溜め攻撃
47 /// </summary>
48 void ChargeAttack()
49 {
50 Debug.Log("溜め攻撃");
51 }
52}
53
Unirxを使う方法もあります。下記は長押し判定のみです。
もしUnirx使ってなければおすすめですよ。様々な場面で活躍します。
C#
1void Start()
2{
3 var mouseDownStream = this.UpdateAsObservable().Where(_ => Input.GetMouseButtonDown(0));
4 var mouseUpStream = this.UpdateAsObservable().Where(_ => Input.GetMouseButtonUp(0));
5
6 //長押しの判定
7 //マウスクリックされたら3秒後にOnNextを流す
8 mouseDownStream
9 .SelectMany(_ => Observable.Timer(TimeSpan.FromSeconds(3)))
10 //途中でMouseUpされたらストリームをリセット
11 .TakeUntil(mouseUpStream)
12 .RepeatUntilDestroy(this.gameObject)
13 .Subscribe(_ => Debug.Log("長押し"));
14
15}
コードの参照元