2014年12月6日土曜日

【Unity】 ランゲー

ランニングゲームを継続して作ってます。
組み込んだのはフィールドの自動生成、スコアマネージャー、サウンドまわり、ゲームオーバー時の挙動。あとはGUI周りいじればほとんどシステムは完成かなー。

以下いつもの。


■Instantiateの第二引数について

あるオブジェクトA(Field)がInstantiateで新しいオブジェクトB(next Field)を生成する時に起きた問題。
Instantiateで生成すると子オブジェクトになってしまうということが原因。

Instantiate (_newField, Vector3.zero, Quaternion.identity);

こいつで生成すると親オブジェクトAと同じ位置にできてしまう。globalな原点(0, 0, 0)に生成したいのに。

Instantiateの第二引数にオブジェクトAの移動分を考慮してやればいいだけなので、すぐに原点に生成することはできた。

しかし生成するオブジェクトの座標がどんどん大きくなってしまう。(ランニングゲームなので)
別に動作に支障はないが気に入らない。

ということでGameController(Empty)(tag: GameController)を原点に作ってそいつにField Makingを任せることで解決した。

ただGameControllerに生成させればGameControllerの子になるのかと思ったらそうじゃなかった。GameControllerと同じ階層に生成されたのだ。この部分は非常に不可解。わかったら追記する。


■Animation Event が動作する時としない時がある

ジャンプを終えたらColliderのenableをtrueに戻そうとかそういう処理に使えるAnimation Eventが
普段はちゃんと動いていたのに急に動作しなくなってしまった。正しくは動作する時としない時があるような状態になってしまった。(Unityのversionは4.6beta)
スクリプトをいじってないのに急にそうなったのでわけがわからなかったんですが、イベントキーの位置をアニメーションの終わりから少しズラしたら解決しました。こんなかんじに↓














ただこうすることで違う問題が出てしまった。
このEvent実行とアニメーション終了の間の時間にジャンプの入力をするとColliderが元に戻らずいわゆる無敵状態になってしまった。

jump true, Collider off, Animation開始 >> Event実行, Collider on >> jump true, Collider off >> Animation終了

とまぁこんな風にColliderがonにならずにアニメーションを抜けてしまう。

こりゃーAnimation Eventは使わない方がいいのかもなぁ。


~追記~

もうちょっと検証してみた。
Event Keyをアニメーション終了ぴったりに合わせて、その上でEventが起こる瞬間にジャンプの入力を狙った。1フレあるかないかのタイミングだけど不可能じゃない。

そうしたらアニメーションはジャンプだけどColliderはジャンプしてないという現象も確認できた。
やはりAnimation Eventは使わない方がいい。少なくともシビアな入力が必要とされるものには使うべきでない。

最初からInvoke使えばよかったんや…

0 件のコメント:

コメントを投稿