【Unity】インスペクタに編集不可のパラメータを表示してみた

編集不可のパラメータをインスペクターに表示したいという機会があり、PropertyAttribute、PropertyDrawerを継承して処理を書くやり方があったので試しにやってみました。


環境

  • Unity2018.3.7f1
  • MacBookPro Mojave v10.14.3

実装

NonEditableAttribute.csというスクリプトを作成して、PropertyAttributeとPropertyDrawerクラスを継承したクラスを定義しました。(ReadOnlyAttributeという名前にしたかったのですが、Unity側に既にあった為、被らない名前にしました。)

他サイトでは、PropertyDrawerクラスを継承しているクラスはEditorフォルダ内に入れていましたが、#if UNITY_EDITORで囲う形にするとEditorフォルダにいれなくても使えた為、こういう形にしてみました。

使い方はこちら

インスペクタ表示はこんな感じに!

ListのSizeは編集できてしまうようで、ここも編集出来ない形にできると良かったのですが・・・。


まとめ

値を確認したいだけの時に、編集不可にして表示するととても便利でした。他にも色々できそうなのでインスペクタ表示についても色々調べていこうと思います。


参考url

【Unity】Animatorに設定されているlayerとstateを実行時に取得してみた

アニメーションビューワーの用なものを作ろうと思った時に、実行時にlayerやstate名が取得できると便利だなと思って調べてみると、UnityEditor.Animations.AnimatorControllerというものがあったので使ってみました!


環境

  • Unity2018.3.7f1
  • MacBookPro Mojave v10.14.3

実装

AnimatorのruntimeAnimatorControllerをUnityEditor.Animations.AnimatorControllerでキャストしてやると、情報が取れるようです。

デバッグ出力した内容を確認してみると、意図した情報が取れていました。この処理とUnityちゃんを使ってUIからlayerとstateを選択できるものを作ってみました。

実行したものがこちらです。


まとめ

今回使った、UnityEditor.Animations.AnimatorControllerはエディタでしか使えませんが、layer、state名を調べたり手動で書いてアニメーション切り替えをしたりしなくてもいいのはとても便利でした。他にも機能があるようなので別の機会に試してみたいと思います!


参考url

【Unity】Handheld.Vibrateを使ってみた

スマホのバイブレーション機能がUnityに用意されていたので、試しに使ってみました。


環境

  • Unity2018.3.7f1
  • MacBookPro Mojave v10.14.3
  • iPhone SE OS11.4.1

実装

調べてみると呼び出し自体はすごくシンプルで、Handheld.Vibrate関数を呼び出すだけでした。ソースはこんな感じに

とてもシンプルですね!ただ、用意されている関数はこれだけの為、強弱や回数、振動しているかどうかというのは取得できないようです。他サイトで調べてみると、自分でネイティブ実装すればできるようですね。

これだけだと面白くないので、再生回数、再生秒数、終了コールバック受け取りできるような形にしたクラスを作ってみました!Vibrationのstatic関数にアクセスしたタイミングで破棄されないGameObjectを生成し振動処理を行う形になっています。

1回の振動を計測したら、約0.5秒くらいだったので、再生時間を0.5秒として扱ってみました。使い方はこちらです。


まとめ

凝ったことをしなければ、数分で実装する事ができました!振動の強弱や振動終わりを感知するというのもやってみたいので、別の機会で試しみて記事に書こうと思います!


参考url

  • https://docs.unity3d.com/jp/460/ScriptReference/Handheld.Vibrate.html
  • https://qiita.com/DURIAN_JADE/items/3fdddb4ad19658f50539

【Unity】logEnabledを使ってLog出力を無効化してみた

開発をしている時だけ、ログ出力をさせたい!という事は多々あるかなと思いますが、その際に手軽にできるものとして、logEnabledをfalseにする方法があります。ただ、これはランタイムで設定できる為、ログ出力がされないだけで、関数に書いている処理は残っているのではないかな?と思ったので今回はそれを検証してみました。


環境

  • Unity2018.3.0f2
  • MacBookPro Mojave v10.14.3

実装

ボタンを押すと、Log関数内で変数をインクリメントする関数を呼ぶという処理を作ってみました。スクリプトはこんな感じに。

実行して、ボタンを押した際のキャプチャがこちら

ボタンを押すたびに、Countが増えログにも出力がされています。

次にStart関数内でlogEnabledをfalse設定にして試したものがこちらです。

実行して、ボタンを押してみたキャプチャがこちらです。

ログ出力はされなくなりましたが、Count表示の数は増えていきました。Debug.Log関数内に記載している処理は実行されてしまうというのがわかります。ログ出力にこういう形で処理を書く人は少ないと思いますが、処理自体が実行される為、ボトルネックになる可能性はあります。そこでConditionalを使ってみたらどうかなと思い、下記スクリプトを追加してみました。

※PlayerSettingsのScripting Defines SymbolsにENABLE_LOGGINGを記述するとLog出力されます。

実行して、ボタンを押してみたキャプチャがこちらです。

ログ出力もCountUp関数も実行されていないことがわかります。

まとめ

ログ出力を手っ取り早く無くしたい場合は、logEnabledをfalseにすれば簡単にできてしまうのでとても便利ですね。Log関数内の処理もなくしたい場合は、少し手間ですがConditionalを使ってUnityが提供している関数を全て定義しなおしてしまえばよさそうですね!