Unityな日々(Unity Geek)

Unityで可視化アプリを開発するための試行錯誤の覚書

シェーダーでトグル・列挙型のプロパティを使う

MaterialPropertyDrawer Shaderlabのシェーダ・プロパティに、インスペクタでトグルや列挙型(enum)などを使うには、UnityEditorのMaterialPropertyDrawerクラスを使う。 Unityの組み込みMaterialPropertyDrawerには次がある。 Drawer 記述 機能 ToggleDraw…

UnityEventのコールバック関数に、動的に引数を渡す

unitygeek.hatenablog.com 上のブログに書いたように、UnityEventをpublic変数で定義すると、インスペクタにUnityEvent変数が表示され、インスペクタ上でコールバック関数を追加・削除できる。 コールバック関数が引数をとる場合は、インスペクタ上に引数を…

入れ子のGeneric Listをインスペクタで使う

C#では、Generic Listを要素にもつGeneric List、すなわち、入れ子(多重)のGeneric Listを定義できる。 public List<List<string>> names = new List <List<string>>(); しかし、入れ子(二重)のGeneric Listは、インスペクタに表示されない。 インスペクタで入れ子Listを使うには、</list<string></list<string>…

UnityEventコールバック関数の設定方法について

C#/.NETに限らず、いわゆるオブジェクト指向言語では、クラスの独立性を高めるため、Eventが使われる。 Eventを使うには、イベント・リスナーを設定する必要がある。 たとえば、クラスA(ClassA)の初期化が終わってから、クラスB(ClassB)のInit()メソッド…

カスタムSkyboxを設定する

Skybox画像の読み込み Skyboxとして使う、全天周画像を準備する。 これをUnityのプロジェクトビューに読み込み、Textureのインスペクタで、'Texture Shape'を'Cube'に設定する。 Skybox用Materialの作成 Materialを新規作成し、 Shaderを'Skybox/Cubemap' 'C…

XMLからDictionaryを作成する。

unitygeek.hatenablog.com XMLを読み込んで、タグ名と値からDictionaryを作っておくと便利な場合がある。この方法について。 サンプルXML <works> <title>リップヴァンウィンクルの花嫁</title> <director>岩井俊二</director> <company>ロックウェルアイズ</company> <year>2016</year> </works> XMLからDicionaryに変換するコード 下の通り。 X…

LINQ to XMLを使ったXML操作

.NET(C#)でXMLを扱うにはいくつかの方法があるが、'LINQ to XML'を使うと簡潔に書けそうだ。 今回、Unity上で'LINK to XML'を動かしてみた。Unityバージョンは、2017.2。 XMLサンプルファイル XMLのサンプルは、次を使う。 <persons> <person> <name yomi="はりそんふぉーど">Harrison Ford</name> <birth>1942-07-13</birth> <works> <title>Sta</title></works></person></persons>…

非MonoBehaviourクラスでコルーチンを使う

参考: unitygeek.hatenablog.com コルーチンを使うには、 StartCoroutine(戻り値IENumeratorのメソッド) と記述する。 StartCoroutine()はMonoBehaviourクラスのメソッドである(Unity - Scripting API: MonoBehaviour.StartCoroutine)。 MonoBehaviour継…

標準リテラルと逐語リテラル

「リテラル」とは「文字通り」という意味。プログラミングにおける「リテラル」は、値や文字をそのまま書き下したものを指す。 リテラル文字列には、「標準リテラル」と「逐語リテラル」の2種類があり、特殊文字の記述方法が異なる。(2.4.4.5 リテラル文字…

Oculus Rift使用時に、スピーカーから(も)音声を出力する

Oculusアプリの設定(歯車アイコン)で、'Settings'を選択。 Devicesメニューで、'Rift'(ヘッドセット)を選択。 ‘Audio Output in VR'のドロップダウンメニューで、 Windows Default: OS側出力のみ Both (audio mirroring):OculusとOSの両方に出力 を選択…

ウェブカメラの映像を表示する

ウェブカメラの映像をテクスチャとして貼り付ける ウェブカメラの動画を取得するには、WebCamTextureクラスを使う。 docs.unity3d.com 次は、ウェブカメラからの映像をメインテクスチャとして適用するスクリプト。このスクリプトを、たとえばPlaneオブジェク…

プロパティ(getter/setter)について

通常、C#のクラスは「フィールド」と「メソッド」で構成される。フィールドは「メンバ変数」とも言い、変数(データ)の定義箇所。メソッドはそのままメソッドの定義。 //フィールド public bool isRunning; private float age; //メソッド public void Chec…

?と??ーNull許容型・Null条件演算子

C#のコードの中に、たまに'?‘が出てくる。たとえば次のように。 int? length = customers?.Length; Customer first = customers?[0]; int? count = customers?[0]?.Orders?.Count(); なんじゃこれは??・・・コードを見てまさに「?」と思っていたところ、…

C# (.NET Framework)の名前の付け方

UnityでC#のコードを作成するとき、変数やメソッドなどの名前の付け方に迷うことが多々ある。「何が正しいか」は一意に決められないとは思うが、基本的には本家Microsoftの考える「名前の付け方ガイドライン」に従うのがいい。そうすれば、他のメンバーや、…

コルーチンについての覚書

たまに使いたくなるが、いまいち理解できていないもののひとつが、コルーチン(Coroutine)。 ということで、いくつかメモ書きを。 コルーチン(Coroutine)とは何か? Coroutineとは何だろうか? Wikipediaには次のようにある。 「コルーチン(英: co-routi…

Unityエディタをバッチで起動し、プロジェクトにコマンドライン引数を渡す

Unityエディタをバッチファイルから起動するには、 "C:\Program Files\Unity543\Editor\Unity.exe" と書いたバッチファイルを作って、ダブルクリックすればよい。"“でくくっているのは、フォルダ名Program Filesがスペースを含んでいるため。 ちなみに、Unit…

オブジェクトをきれいに配置する

等間隔スナップ オブジェクトを等間隔で並べたり、スケーリングしたりする方法。 設定 Edit => Snap Settings... で各軸のPositionおよびScaleのスナップ幅を設定する 移動 Control(MacはCommand)キーを押しながら、Sceneビューでオブジェクトをドラッグす…

オブジェクトのフェードイン・フェードアウト

Standard Shaderを適用したモデルのフェードイン・フェードアウトは、Colorのアルファ値を変更することによって、行う。 Color値を変えるメソッドは、 Material.SetColor(string propertyName, Color color) で、第1引数はどのColorを変えるかを指定するもの…

モデルデータの書き出しサイズを小さくする Mesh Compression

ビルドサイズを小さくする手段の一つに、モデルデータのメッシュサイズ圧縮がある。 これは、モデルデータのインスペクタ:Mesh Compressionで行う。 選択肢は、Off/Low/Medium/Highの4種類ある。 オリジナルのサイズが約38MBのFBXデータをAssetに読み込み…

プロジェクトのUnityバージョンを確認する

過去のプロジェクトが、どのUnityバージョンで作ったのかを確認する(裏)ワザ。 ProjectSettings/ProjectSetting.assetを、VisualStudioなどのエディターで開く。 バイナリファイルなので、基本、意味不明の文字列が表示されるが、最初のほうにUnityバージ…

Colorの補間

たとえば、点滅するインジケータなど、2つのカラー値を補間して表示したい場合に便利なのが、Color.Lerp()。 public static Color Lerp(Color a, Color b, float t); という形式で、t=0の時 Color a、t=1の時 Color b、t=0~1でaとbの間を線形補完する。 点…

スクリプトからShaderパラメータを変更する(例:_EmissionColorについて)

Shaderのプロパティを変更するには、materialのメソッド、SetColor(), SetFloat(), SetInt(), SetTexture()を使う。( Unity - マニュアル: スクリプトを使用したマテリアルパラメーターへのアクセスと変更) それぞれのメソッドは、たとえば、SetFloat(シェ…

スクリプトからシーンをロードする (Unity5.3~)

別なシーンのロードは従来、 Application.LoadLevel ("SceneNew"); としていたが、Unity5.3以降では使えなくなった(Obsolete). Unity5.3以降でシーンをロードする際は SceneManager.LoadScene ("SceneNew"); とする。あるいは、シーン番号を使って、 SceneMa…

XMLファイル読み込みのサンプルスクリプト

以前、XmlDocumentクラスを使ってXMLを読み込み、パースする方法について書いた。 XmlDocument()でXMLをパースする その1 - Unityな日々(Unity Geek) XmlDocument()でXMLをパースする その2 - Unityな日々(Unity Geek) が、XMLファイルの読み込み&パ…

Unity-C#で数値を扱うクラス

Unity-C#で数値を扱う場合、あまり考えることなく整数だとint、浮動小数点だとfloatをつい使ってしまうが、扱える範囲やサイズに応じていくつかの変数型がある。メモリサイズや速度をギリギリとつめたいときや、逆に大きな数値を扱う場合は、型の最適化を忘…

Event使用時のエラー"... can only be called from the main thread"

次のようなエラーがでた。 状況は次のとおり。 オリジナルの'subClass'のスクリプトで、別クラスであるmainClassのイベントReadに、('subClass'のスクリプト内の)Actionメソッドを登録していた。イベントが発行されるとsubClassのAction()メソッドが呼ばれ…

InputFieldにテキストを設定する際の注意点

Create-UI-InputFieldでInputFieldを作成すると、'InputField'オブジェクトの下に、PlaceholderとTextという名前の2つの'Text'オブジェクトが生成される。 Placeholder, Textの2つの'Text'オブジェクトは、作成時点で親のInputFieldオブジェクトにひもづけ…

iTweenの参考資料

スクリプトでアニメーションを行う定番ライブラリが、iTween。Flash(Action Script)ライク名表記で多彩なアニメーションを実装できる。 iTween for Unity by Bob Berkebile (pixelplacement)itween.pixelplacement.com ただ、iTweenの表記方法は結構忘れや…

Unity5のプロジェクトをUnity4.6で開く

Unity5で作成したプロジェクトを4.6で開きたい場合、次のように設定する。 UnityメニューのEdit/Project Settings/Editorを開き、 vertion controlのmodeを「Visible Meta Files」にする Asset Serializationのmodeを「Force Text」にする をおこなってプロ…

iOS用のレスポンシブなUIをつくる

iOSデバイスにはさまざまな解像度、アスペクト比があり、それぞれに適切なUIとなるような工夫がいる。 参考: Canvas(uGUI)の基本レイアウト - Unityな日々(Unity Geek)unitygeek.hatenablog.com 実現したいUI:トリミングとストレッチ たとえば、次のよう…