テラシュールブログ

旧テラシュールウェアブログUnity記事。主にUnityのTipsやAR・VR、ニコニコ動画についてのメモを残します。

【Unity】CPUプロファイラに表示されるの項目をスクリプトで取得する

プロファイラーに表示されるようなCPUの処理時間をスクリプトで取得する方法についてです。

プロファイラーは負荷の高い部分を観測する

処理負荷はゲーム画面のプロファイラやInstrumentsといったツールを使って確認するのがベストなアイディアです。

例えば「ゲームが重い」原因は何か? GC? ロード? 物理演算? それともアニメーション? 軽い部分をいくら調整しても、ボトルネックとなる重い部分を取り除かなければ大抵の場合は余り効果が見込めません。
(むしろ、この世の全てはトレードオフ…悪い結果を呼び出す事もあるかもしれません)

 

何を削れば良いのかはプロファイリングの結果である程度は目星が付けられるので、上手く活用します。

www.slideshare.net

プロファイリングの結果をスクリプトで云々する

プロファイリングは大抵は手動の項目で、実際にゲームをプレイし目で重い所を観測する必要が出てきます。

プロファイラとにらめっこするのもソレはソレで楽しい事ではありますが、スクリプトからある程度取得出来るならば色々と便利そう…と思ったら、する方法がありました。

f:id:tsubaki_t1:20171104232446j:plain

RecorderでProfiler(CPU)の項目を取得

Recorderはプロファイラ(CPU)の項目から、前フレームの処理時間を取得出来るみたいです。例えばBehaviourUpdateを取得する場合は以下のようなコードです。

gist.github.com

取得できる条件はEditorとDevelopment Playersとありますが、Development Playersと言う割にDevelopment Buildで取得できませんでした。何か条件が?

バグだったみたいです。現在はDevelopment Buildでないと取得できません

docs.unity3d.com

処理時間がやたら長くなったら止める

この機能で思いついた使い方は、処理を観測して負荷が一定以上になったら止める…という物です。

gist.github.com

またsampleBlockCountで累計の処理呼出カウントも取れるので、余りにも集中的に処理を呼び出している項目を見つけ出す事も出来るかもしれません。

画面に出す

処理時間の結果を画面に出す事も出来ます。

ただグラフ表示されないので、「突出して負荷が上がる瞬間」を観測するのはグラフ表示できるProfilerで見るほうが良いです。

また「だんだんと上がっている」ようなケースでもProfilerで見たほうが、客観的に見れる感じがします。

f:id:tsubaki_t1:20171104224918j:plain

プロファイリングにはCustomSamplerが必要

なお、Recorderの使用には Profiler.BeginSampleではなく CustomSamplerの CustomSampler.Beginを使用します。

自分でスクリプトを記述する場合には、CustomSamplerをいうお話です。

docs.unity3d.com

ちなみに、Profiler.BeginSampleよりもCustomSampler.Beginの方がオーバーヘッドが低いみたいです。

関連

tsubakit1.hateblo.jp

tsubakit1.hateblo.jp

【Unity】ユニティちゃん等で、ジャンプ中に追加で上下してしまう問題の解決方法

f:id:tsubaki_t1:20171103225451j:plain

今回は上下の動きが最初から含まれているジャンプモーションをアクションゲーム等で使用する方法についてです。

ジャンプ中にジャンプモーションがジャンプする

ユニティちゃんのようなキャラクターをアクションゲーム等で使用していると、キャラクターのジャンプ中にもう一度ジャンプしてしまう…という事があります。

f:id:tsubaki_t1:20171103224802g:plain

例えば上のGifアニメのケースです。

 

右が通常のジャンプ、中央がジャンプモーションです。各々はそれ程問題が無いのですが、二つ合わせてしようすると左のジャンプモーションのように、ジャンプ中にもう一段ジャンプする問題が発生します。

 

ジャンプアニメーションから上下移動を取り除く

この問題は、ジャンプモーション中に「ジャンプの上下」が含まれている事が問題です。その為、カプセルのジャンプに追加してジャンプモーションの上下も入ってしまう為、追加で上下してしまう訳です。

f:id:tsubaki_t1:20171103235623g:plain

これはアドベンチャーゲームRPGといったジャンルのゲームでMatch Targetを駆使して移動するならば非常に綺麗に動いてくれて良いのですが、プラットフォーマー(横スクロールアクション)や3Dアクションではジャンプの位置をズラす要因になります。

tsubakit1.hateblo.jp

この問題を手っ取り早く解決する方法は、ジャンプアニメーションから上下移動しなくする事です。

手順

この操作はアニメーションのImporter設定を操作して、キャラクターの移動部分を無効化することで実現します。

 

やることは概ね4つ。

  • AnimatorのApply Root Motoinのチェックを外す
  • アニメーションのImporterの、Bake Transform Position(Y)を外す
  • Based UponをCenter Of Massに設定して、モーションの中心位置をモデル中央に設定。
  • Offsetでモデルの位置を調整

f:id:tsubaki_t1:20171103233812j:plain

これでアニメーションを再生した時、キャラクターが上下せずアニメーションが再生されたら成功です。

f:id:tsubaki_t1:20171103233739g:plain

実際の動作

このモーションをジャンプの動きに合わせて動かすと、カプセルにジャンプをさせた場合でも綺麗にジャンプモーションを再生してくれます。

f:id:tsubaki_t1:20171103235116g:plain

着地時に足がめり込む

もし「踏み込み」と「着地」のモーションをジャンプモーションの流れに組み込みたい場合、そういった「足が付いている」部分は別モーションとして切り出して制御するのが良いかもしれません。

Based UponがFootの場合は、モーションの中心点が足になります。

ジャンプ動作が分割されていない場合

分割します。

tsubakit1.hateblo.jp

【Unity】UnityScriptをC#に変換する unityscript2csharp

f:id:tsubaki_t1:20171031221526j:plain

2017系でレガシー判定のUnity Script(Java Script)をC#に変換するプロジェクトについてです。

Unity Scriptは死んだ!何故だ!

かつてUnityのチュートリアルやサンプルプロジェクトで使用していたUnity Script(通称Java Script)ですが、Unity 2017.1系にてついにリストラとなりました。

現在も一応使用することが出来ますが、Legacy扱いになっています。

tsubakit1.hateblo.jp

Unity ScriptをC#に変換する

Unity Scriptは死にましたが、ソースコードを活用するアセットが同時に公開されていました。このプロジェクトを使用すると、Unity Scriptで作成したソースコードC#に変換する事が出来ます。

github.com

これは現状コマンドラインで実行するタイプの物みたいです。

コマンドラインはこんな感じです。

-u エディター(フォルダ)のパス

-p プロジェクトへのパス

-r スクリプトが参照するアセンブリ

-s カスタムシンボル

UnityScript2CSharp.exe -p m:\Work\Repo\4-0_AngryBots -u M:\Work\Repo\unity\build -r "m:\AngryBot Assemblies\Assembly-CSharp.dll" "m:\AngryBot Assemblies\Assembly-UnityScript.dll" -s UNITY_ANDROID,UNITY_EDITOR

f:id:tsubaki_t1:20171031222830j:plain

コマンドラインの無いエディター拡張版も準備しているみたいですが…

関連

tsubakit1.hateblo.jp

tsubakit1.hateblo.jp

【Unity】ProBuilder Basicでコーネルボックスを作ってみる

f:id:tsubaki_t1:20171025214853j:plain

ProBuilder

f:id:tsubaki_t1:20171025215316j:plain

旧Prototype、現ProBuilderという無料のアセットを使用すると、簡単なモデリングが出来るみたいです。

www.youtube.com
この機能で簡単なレベルを作成する練習がてら、コーネルボックスを作成してみます。

コーネルボックスを作ろう

コーネルボックスを作ってみます。

 

tsubakit1.hateblo.jp

Cubeを作成する

とりあえず10x10x10のCubeを作成します。

f:id:tsubaki_t1:20171025215618j:plain

f:id:tsubaki_t1:20171025215358g:plain

Cubeの色を変えよう

Cubeの色を変更します。Pro Builderは頂点カラーで色が指定出来るので、面を選択、色を指定します。

f:id:tsubaki_t1:20171025215723g:plain

ノーマルを反転しよう

ノーマル反転して、面を内面に向けます。

f:id:tsubaki_t1:20171025215937j:plain

f:id:tsubaki_t1:20171025215821g:plain

ライトを配置しよう

右下のライトベイクが完了したら、ライトをCubeの中に配置します。

Indirect Multipleを高めに設定すると、コーネルボックスらしい間接光溢れる感じになります。

f:id:tsubaki_t1:20171025220020g:plain

内側のCubeを配置しよう

例通り、内側のCubeを二つ配置してみます。

新しくモデルを作っても良いのですが、今回はメッシュを押し出してCubeを配置してみます。

f:id:tsubaki_t1:20171025220159g:plain

完成

後は色々と調整したら完成です。(作り直した)

f:id:tsubaki_t1:20171025220433j:plain

f:id:tsubaki_t1:20171025220541j:plain

中々に面白いです。

参考

gomafrontier.com

qiita.com