【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が提供している関数を全て定義しなおしてしまえばよさそうですね!

【Unity】Unity複数起動をメニューからできるようにしてみた

Unityを複数起動したい事が多々あり、以前はターミナルでコマンドを打って起動していましたが、面倒になったのでFileメニューに項目を追加してそこから起動できるようにしてみました。


環境

  • Unity2018.30f2
  • MacBookPro Mojave v10.14.3

準備

まず最初にFileメニューに項目を追加する為に、Editorフォルダを作りそのフォルダ内にCustomMenuFile.csスクリプトを作成しました。

ファイルの中身はこちら

Fileメニューに追加されたものがこちら



実装

使用しているEditorのパスを取得する為に、InternalEditorUtility.GetEngineAssemblyPath関数を使って取得しています。実装はこんな感じに


まとめ

メニュー追加も簡単にでき、複数起動もショートカットキーで簡単に立ち上げれるようになってとても便利になりました。普段よく使う機能をメニュー項目に追加するだけで作業効率が上がっていいですね!


参考url

【Unity】WebCamTextureを使ってみた

Unityだけでカメラアプリっぽいものが作れないかなと思って調べた所、WebCamTextureというものが用意されたいたので試しに使ってみた内容を書いていこうと思います。


環境

Unity2018.3.0f2

XCode10.1


準備

iPhoneでカメラアクセスをする為には、Info.plistにNSCameraUsageDescriptionを追記する必要があったので、下記スクリプトを用意してAssets/Scripts/Editorフォルダ内に配置しておきました。


実装1

WebCamTextureはTextureクラスを継承している為、UGUIのRawImageのtexture変数に設定すればそのまま表示されるかな?と思ったので、RawImageを使ってみました。それに加えてWebCamTextureに用意されている変数も表示してみました。

Hierarchyはこんな感じに。

スクリプトはこんな感じに。

  1. カメラ利用をユーザー確認に確認する
  2. 利用できるカメラデバイス名を取得してWebCamTextureを生成
  3. RawImageに0番目のWebCamTextureを設定しPlay関数を呼びカメラ再生を開始
  4. Update関数内でWebCamTexture情報を表示

実際にiPhoneに転送して動かしてみたのものがこちらです。

RawImageもWebCamTexture情報も表示する事ができました!


実装2

先程、実装したものはRawImageに表示された向きが意図した向きではありませんでした。調べてみるとWebCamTexture情報を使って表示向きを調整する必要がありそうという事で、表示向きを調整しつつ全画面表示にしてみました。(Textの表示は無くしています)

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

全画面表示で向きも意図した向きになりました。


まとめ

WebCamTextureを使用すればフロント、バックカメラで映ったもの簡単に表示することができました!映っているものをカメラロールに保存したい場合はネイティブコードを書かないと駄目なようですが、単に表示するだけであれば数時間でできたしまったのでとても便利だと思います。また、PostProcessingStackを使えば見た目も簡単に変えられそうな気がします!


参考url

  • https://docs.unity3d.com/ja/current/ScriptReference/WebCamTexture.html
  • https://nil-one.com/blog/article/2018/01/30/imageanalysisusingunity03/
  • https://www.urablog.xyz/entry/2017/07/06/225444

【Unity】ペイントツールもどきを作ってみた

ペイントツールみたいなものを作ってみようと思い、今回はマウスで線が描ける所まで試しに作ってみました!


環境

Unity2018.3.0f2

Xcode10.1


実装

Texture2Dを生成し、そのテクスチャに指定した色を設定すればそれっぽくなるのでは?という事で指定する座標はマウス座標をそのまま使いたかったので、UGUIのRawImageを全画面表示する形にしてみました!

スクリプトはこんな感じに!

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

点がまばらで想定したものと全然違いました・・・。塗りつぶす領域を広くしてみればいいのかな?という事で、幅と高さを設定できる形にしてみたものがこちら!

さっきより塗りつぶす領域が広くなった分、見えやすくなりましたが、線のような感じにはなっていません・・・。点と点を繋ぐ形で塗りつぶせばそれっぽくなるだろう!という事で、マウス座標を保存しておき、塗りつぶす領域を前回のマウス座標から今回のマウス座標までを塗っていく形にしてみました。

今度は、思っていた通りになりました!!


まとめ

実際にやってみると、想定と違った結果になったりもしましたが、最終的には線を描く事ができて、自分でやってみる事の大切に改めてきづけました!今回は指定した色を塗っていく形でしたが、テクスチャを元に色を塗っていく形にすればペイントツールのブラシ機能みたいなものも作れるかなと思うので、別の機会にチャレンジしてみたいと思います。

【Unity】コンパスを作ってみた

コンパスアプリを作ってみようと思って調べてみると、UnityにCompassインターフェースというもがあったので、今回はそれを使った内容を書いてみました。


環境

Unity2018.3.0f2

Xcode10.1


Compassインターフェース

enabled コンパスを有効または無効にするために使用します。Input.compass.trueHeadingプロパティーに有効な値を含ませたい場合、Input.location.Start()を呼び出してロケーションの更新を有効にする必要があります。
headingAccuracy 度単位の方向読み取りの精度
magneticHeading 磁北極に基づく度単位の進行方向 (読み取り専用)
rawVector マイクロテスラ単位の raw 地磁気データ (読み取り専用)
timestamp 進行方向が最後に更新されたときのタイムスタンプ (1970 以来の秒数)。(読み取り専用)
trueHeading 地理的北極に基づく度単位の進行方向 (読み取り専用)
スクリプトリファレンスから引用

実装

色々変数があるので、とりあえず画面に情報を出すだけのプログラムを書いてみました。

iPhoneに転送した画面がこちらです。端末を傾けると数字が変化していました。正しく動作してそうです!

次にUGUIのTextを使って東西南北と角度を表示してみました。階層はこんな形です。

※角度表示は回転してほしくない為、Rootオブジェクトには含めない

trueHeadingの値を使って、Rootオブジェクトを回転させる処理がこちらです。

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

実際に動かしてみると表示がカクついていたので、targetFrameRateを60に設定し、見た目も調整して最終的にはこんな感じにしてみました。


まとめ

既にUnityで提供されているインターフェースがあり、ネイティブコードを書かなくても作ることができました。素材もUGUIのデフォルト素材を使うことで時間短縮もできあっという間にコンパスアプリが作れました!!


参考url