募集要項

  • ■ボイスの募集は終了しました。

    非常に沢山のご応募ありがとうございました!

     結果はこちら
2017年8月
    1 2 3 4 5
6 7 8 9 10 11 12
13 14 15 16 17 18 19
20 21 22 23 24 25 26
27 28 29 30 31    

« Unity アクションゲーム 制作中動画その3 | トップページ | ホーム画面のUIについて考えてみよう!@Unityアクション »

2012年6月25日 (月)

Unity ポーズ画面でキャラクターを動かしたい!

今日はポーズ画面について。絵的には進展なしですw

と、いう訳で早速。
Unityでポーズ画面を作る場合、一般的には

Time.timescale=0;

にしてゲームの進行を停止してコンフィグ画面やステータス画面を作成します。
ですが、動画見てもらってる人には分ると思いますが、
ステータス画面でポーズしてる際に、このゲームではキャラクターがアニメーションしてます。
なにげにコレが問題でして、単純に「Time.timescale=0;」で時間を停止すると、
メニュー内でのキャラクターのアニメーションやエフェクトが動かなくなってしまいます
これを回避するために、今までは以下のような処理を暫定でしていました。

・ポーズがかかった瞬間、isPauseフラグON
・isPauseを見て味方や敵、他要素のUpdateをスキップ
・isPauseを見て全モーションのモーションレートを0にして静止する

これがパッと見ではそれっぽいんですが、
Update以外で実行しているIEnumeratorとかのウェイトフレーム分処理が
どうしても止まらずに進んでしまいます。
ゲームとしては破綻してますね;;
そこで、アニメーションイベント等を駆使して個別にポーズ処理を実装、というのも
考えられますが、正直大変なのと、抜けが怖いという点で、
別の手段を模索して見ました。

結論としてはベストの解決策は見つかってないんですが、
とりあえず元よりはベターな処理で行けそうだったのでメモしておきます。

Photo
↓処理例↓
-----------------------------------------------------------
void Start () {
  StartCoroutine("idlemove");
}
IEnumerator idlemove () {
  float i=0.0f;
  float add=0.0333f;//30fps前提の値
  GameObject eft_test = Instantiate(EFT_prefab, transform.position, transform.rotation) as GameObject;
  ParticleSystem eft = eft_test.GetComponent<ParticleSystem>();
  while(true){
   animation["idle"].time = i;
   eft.Simulate(add);
   i+=add;
   yield return 0;
  }
}
--------------------------------------------------------------

上記のようなスクリプトをメニュー中に動かしたいオブジェクトに追加します。
そうする事でTimescaleが0でもモーションやエフェクトを再生する事が出来ます

ただ、欠点もありまして、Time.deltaTimeが見れないので、
フレームレートに適した速度での再生ができないのです;;

今回の場合は、メニューを開いている時のみフレームレートを30で固定し、
それ前提の値を加算しています。
そういった意味では、30fpsすら出ない機種で実行した場合は、再生速度が
遅くなる事になります・・・が、このあたりは動作最低機種に合わせて調整
すればギリギリ体裁は整うかな、という算段ですので、
一旦はこの形の実装を行おうと思います。
(これから前の処理をコメントアウトとかそれに伴う調整とかします)

Time.timescaleが0の状態でのfpsの取得法であったり、
他の良い解決方がある方教えて下さいw

おまけ、というか訂正:
     6/11に書いたNGUIのサイズ調整メモですが、ちょっと間違ってました・・・。
     3DUIは縦比率は自動で補正かけてくれるので、横幅で補正をかけたい時のみ
     スクリプトを書く必要があります。
     考え方は2DUIと一緒なので詳しくは割愛します。


追記:一通りステータス画面のポーズ処理修正完了(したと思う)
    装備によって待機が変わった際に動き反映させるのに手間取りました。。。
    再生中のモーション名の取得が汎用コマンドになさそうだったので、
    結局装備時に待機モーション分類を保存する変数を用意して、
    それを見てモーションのtimeを動かす対象を変えるようにしました。
    後、WaitForSecondsが何処かにあると、まともに動かなくなる事があるので注意。
    ・・・はー。エンバグ色々起こるなぁ・・・。大変だ。


---------------------------------------------------------------------

« Unity アクションゲーム 制作中動画その3 | トップページ | ホーム画面のUIについて考えてみよう!@Unityアクション »

Unityアクションゲーム製作」カテゴリの記事

コメント

こんにちは。「強火で進め」でここのブログが紹介されていたので来てみました。

私は以下のようにして、timeScaleに依存しないdeltaTimeを取得しました。
試して見て下さぃ。

public static class _Time
{
private static int iLastFrame = 0;
private static float fLastTime = 0.0f;
private static float fDeltaTime = 0.0f;

// 初期化:Start() で実行
public static void StartDeltaTime()
{
fLastTime = Time.realtimeSinceStartup;
iLastFrame = Time.frameCount;
}

// 更新:Updatr() で実行
public static void UpdateDeltaTime()
{
int iCurrentFrame = Time.frameCount;
if ( iCurrentFrame != iLastFrame )
{
float fCurrentTime = Time.realtimeSinceStartup;
fDeltaTime = fCurrentTime - fLastTime;
fLastTime = fCurrentTime;
iLastFrame = iCurrentFrame;
}
}

// 取得:Time.deltaTime を _Time.deltaTime に置き換えて使用する
public static float deltaTime
{
get { return fDeltaTime; }
}
}

ちょいミスった...

× Updatr() で実行
○ Update() で実行

ぉぉ、貴重な情報ありがとうございます!(TдT) 助かります!
参考にさせて頂きたいと思います(≧∇≦)b

resどうもです。

今Android+iPhone用のアプリを作っているのですが、
「そのアスペクト比を固定するぞ・・・っ!」がとても参考になり
感謝しています! m(_ _)m

ブログの記事を参考にしていただいたようでなによりです。
Unityの関連の情報(日本語のサイト)は基本的な情報は結構あるのですが、
まだまだ実践的な情報が不足しているイメージがあるので、
こういった形で情報交換など行えると嬉しいですね。

この記事が書かれたときにこの変数があったのかどうか分かりませんが
いまなら

Time.unscaledDeltaTime

で、取れますね。

>OZさん

情報ありがとうございます。
昔の記事になると、どうしても古い情報が多くなるので
こういったご指摘は有り難いです。

コメントを書く

(ウェブ上には掲載しません)

トラックバック

この記事のトラックバックURL:
http://app.f.cocolog-nifty.com/t/trackback/1500357/45873262

この記事へのトラックバック一覧です: Unity ポーズ画面でキャラクターを動かしたい!:

« Unity アクションゲーム 制作中動画その3 | トップページ | ホーム画面のUIについて考えてみよう!@Unityアクション »

Twitter等

  • にほんブログ村 ゲームブログ ゲーム制作へ

メールフォーム

  • 直接コンタクト取りたい方はこちらからどうぞ

サイト内検索
ココログ最強検索 by 暴想