【Unityメモ書き6】アニメーション追記&シーン切替時にライティングが変になるバグの修正

クロ

おもったより
Unity講座が長くなってしまって
いつ終わるか見えなくなってきました

それだけ
いままで勉強してなかったってことだわね
これから仕事でも主体になっていくから必死よ
霊夢
魔理沙 いままで
適当にやってきた
ツケが回ってきたってことだな
今回は
Unityのバグ?に関することと、アニメーションでやっていくうちにわかったことがあったので
それを追記していこうと思います
妖夢

クロ 大規模なゲームを作っている人ならおそらくハマった箇所
シーン切り替え時に3D空間のライティングが
正しくされない、暗いと言った問題に当たったことはないでしょうか?
ライティングの設定を変えても
一向に変化なく
ライトを増やして双方向から当てても変わらないのよね……
霊夢
魔理沙 デバッグでそのシーンだけを再生すると
正しくライティングされるんだよな
結構致命的な感じだな
このバグ、どうやら
Unityさんが高速化のために予めライティング情報を設定していて
それが更新されないために発生しているようです
妖夢

クロ 直し方は簡単です
Window → Lighting → Lighting設定
でライティングの設定画面を表示させます(すでに表示している場合は必要ありません)

出てきたウインドウの
下部にあるAuto Generateのチェックボックスを外して、Generate Lightingのボタンを押してね
チェックボックスじゃないのに注意よ
霊夢
魔理沙 しばらく何かの作業が行われて
動作が鈍くなるけど、終わるまで待てば完了だ
おそらくLighting情報をこれで作り直したんだろうな
この情報、意外とネットにもなくて
製作中も3日ぐらい考えてました
見つけたときはすごく嬉しかったですね
妖夢
クロ 次にUnityのアニメーションについてです
前々回に一度書いたのですが、ゲームを作っていくうちに説明不足だなと思うようになってきまして
新たに書きたいと思います

■指定の箇所にアニメーションを止める

クロ おそらくUnityのアニメーションは
止めることは考えて作ってないのでしょうね
stop関数とかないので別の方法で再生を止める必要があります

// アニメーターの取得
Animator lAnimator = this.GetComponent();
// 再生速度を0にする(停止する)
lAnimator.speed = 0;

上のコードがアニメーションを一時停止する方法よ
単純に再生速度を0にする方法ね
これ以外止める方法が(わから)ないのでどうしようもないわ……
霊夢

// アニメーターの取得
Animator lAnimator = this.GetComponent();
// 再生速度を0にする(停止する)
lAnimator.speed = 0;
// 指定位置に再生位置(5)を移動
lAnimator.Play("anime_01", 0, 0.5);

魔理沙 上のコードが、アニメーションを指定位置で停止させるコードだ
前のコードと違う点はPlay関数を記述して、第3引数が入力されているところだな
ここが再生位置を設定する箇所だ
再生位置はノーマライズ(正規化)された値になるので
0~1までの値になります
半分なら0.5と記述します
妖夢

     // アニメーションの再生時間を取得
     mAnimatorStateInfo = mFrontScreenAnimator.GetCurrentAnimatorStateInfo(0);
     mAnimeTimeLength = mAnimatorStateInfo.length;
     mAnimeTimeCur = 0;
     
クロ 前回、こんな風に
現在の再生位置(再生時間ー現在時間)を求めようとしていましたが
AnimatorにあるnormalizedTimeで現在の正規化された再生時間が取得できます

     // アニメーションの再生時間を取得
     if(lAnimator.normalizedTime => 1.0f)
     {
        // 再生終了した
     }
     
と、これだけでよかったのよね……
3Dオブジェクトのアニメーション登録も
別の回で書きたいと思うわ、まだ勉強することばかりね〜
霊夢

コメントを残す

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です

このサイトはスパムを低減するために Akismet を使っています。コメントデータの処理方法の詳細はこちらをご覧ください