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


