2014年11月21日金曜日

【Unity】 FixedUpdate と Input.GetKeyDown

■キーを押しているのに入力されない、反応しない、反応する時としない時がある


Sample Assets 2D Character.unityのrobotにローリングアクションを組み込んでいた時に起きた問題。

スプライトシートからRoll.animを作成しAnimatorに配置、bool rollingでRunからつなぐ。

Platformer2DUserControl.cs の中の FixedUpdate に
bool rolling = Input.GetKeyDown(KeyCode.LeftShift) ; を追加、Moveの第4引数としてrollingを渡す。
あとは渡された方でanim.SetBoolだのanim.GetBoolだの加えりゃできる。
実際できた。robotは転がったのだ。
ただLeftShiftキーを押したときに転がったり転がらなかったりで非常に不安定。
ゲームをしていて一番イラつくのは『押したのに反応しなかった』ってことで間違いないので直すことにする。

Debug.Logを使って調べたらやはり反応しない時があるようなので
どういうことだと思って調べてみるとどうもこういうことらしい。

http://gamesonytablet.blogspot.jp/2012/12/unityinput.html

Updateの方ならInputを確実に拾ってくれるみたいだ。

ってことで入力のスクリプトを書き換えた。でもやっぱりたまに拾えない。キーが反応しない。
拾えない頻度は…どうかな。あんまり変わらないような気もするが。

結局FixedUpdateの方にInput.GetKeyを使って解決した。
キー押しっぱで転がりっぱになったがこれはどうにでもなる。確実に反応することより大事なことはない。

追記
PC再起動してUpdateの方にInput.GetKeyDownを書き込んだら取りこぼしがなくなった。なぜ取りこぼしが発生していたのか。謎。直ったのでよしとする。



まとめ

FixedUpdate と Input.GetKeyDown は相性が悪い



最近Unityが不安定。
Runするとスクリプトのアタッチが外れたりAnimatorの矢印がなくなってたりする。あとMain Cameraのスクリプトが動作しなくなったり、これは頻繁に起こる。
ほとんどの症状はUnity再起動で直るあたりイラ壁。
とりあえずアセットをReImport All。初期状態に戻すことにする。

1 件のコメント:

  1. ありがとうございます。。。。unity始めてからまだ2ヶ月くらい。。同じ現象で困っていたので助かりました。

    返信削除