おもったより 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オブジェクトのアニメーション登録も 別の回で書きたいと思うわ、まだ勉強することばかりね〜 |