Unityな日々(Unity Geek)

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

script-基本

入れ子の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>…

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

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

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

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

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

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

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

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

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

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

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の間を線形補完する。 点…

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

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

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

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

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でCharacterControllerを使う

方法1:CharacterControllerクラス(コンポーネント)を使う キャラクターとして動かすGameObjectを作る MainCameraを同GameObjectの子にする 同GameObjectに、Physics-CharacterControllerをアタッチする キャラクター移動のUIクラスを作る。参考:Unity-A…

C#からJavascriptのクラスを呼びだせない時

C#からJavascriptのクラスは、通常のC#クラスと同じように呼び出せる。たとえば、 [SerializeField]protected FPSInputControllerREI fpsInputController; //Javascript Class ところが、これでは「該当クラスがない」というエラーが出る。 Assets/Scripts/R…

角度指定と外部呼出しに関するベンチマーク

Unityでは、角度は、オイラー角とクォータニオンの2つの方法で扱える。また、回転を設定する際、角度の絶対値と、Rotate()で相対角変化を与える方法がある。いったいどれがもっとも効率的、すなわち高速なのだろうか? また、あるオブジェクトのクラスから…

uGUI: スクリプトからUIのパラメータを変更する

uGUIへユーザが操作した際にメソッドを呼び出すのとは逆に、スクリプトからUIの状態やパラメータを変更したい場合もある。代表的な例を下にあげる。 テキスト uGUIのテキストを変更するには、テキストGameObjectのTextコンポーネントを取得し、このText.text…

スクリプトのテンプレートを追加する

スクリプトを新規作成する際に、独自のテンプレートを使いたいことがあるとおもう。 その場合は、Unityのインスールフォルダ/Editor/Data/Resources/ScriptTemplates/の下にある、 80-Javascript-NewBehaviourScript.js.txt 81-C# Script-NewBehaviourScript…

Materialを比較する

あるオブジェクトにアサインされている特定のマテリアルを別のマテリアルに置き換えたかったので、次のようなコードを書いた。 [SerializeField]protected Renderer rend; //Target Renderer [SerializeField]protected Material matFrom; //Change from thi…

Canvas UI(uGUI)のイベント処理

CanvasUI(uGUI)システムでは、ユーザの操作をEventで授受する。たとえばButton要素の場合、インスペクタのButtonスクリプト・ブロックの一番下に、OnClick()という項目がある。ここにOnClick()イベントを受け取る関数と渡す引数を設定する。 タブの"+"をクリ…

C#のプロパティを理解する

プロパティの使用 (C# プログラミング ガイド) C#にかぎらずオブジェクト指向言語のクラス内の変数を外部から読み出したり、変数に値を設定する場合は、get/setメソッドを使うのが基本。しかし、変数ごとにいちいちget/setメソッドを設定するのは煩雑になっ…

Inputの種類

Unityにはさまざまな入力APIが準備されている。 Unity - Scripting API: Input Static関数としては次がある。Down/Up=Yesは、たとえばGetKeyに対して、GetKeyDown/GetKeyUpというメソッドもあるということ。 入力機器 メソッド 引数 戻り値 Down/Up キー Get…

軸周りの回転の方向

回転は一見単純な操作だが、すぐ忘れるので備忘録代わりに書いておく。 プリミティブをの円柱(Cylinder)を新規作成した場合、 transform.right :グローバルX方向&ローカルX方向=半径方向1 transform.up :グローバルY方向&ローカルY方向=円柱の軸方向 …

Unityで使える広義の配列

参考:http://wiki.unity3d.com/index.php?title=Which_Kind_Of_Array_Or_Collection_Should_I_Use%3FUnityの広義の配列―コレクション―はいくつか種類がある。それぞれ宣言や代入、値の取出しの記述が異なる。また、自由度が高い反面、使わないほうがよいも…

インスペクタで、カスタムクラスの中にある変数にアクセスする

わかりにくいタイトルだが、具体的な例で説明する。下のように、メインであるクラス(下の例では、Physics)のPublic変数にカスタム・クラス(SubData) を指定しているとする。、 using UnityEngine; using System.Collections; public class SubData { publi…

コンポーネントが存在するかどうかを見る

GameObjectに対し、あるコンポーネントを持っているかを調べ、なければ足す(あるいは、処理を変える)場合の手順例えば、あるGameObjectに対し、rigidbodyコンポーネントがなければ新たに加え、rigidbodyコンポーネントを返す例。 if(rigidbody == null){ r…

timeScaleでアニメーション速度を変更する

Time.timeScaleでFixedUpdate()の時間間隔を調整できる。Time.timeScale=1.0 で、デフォルトの速度(時間間隔) Time.timeScale=0.5で、速度を半分(時間間隔を2倍)にする Time.timeScale=0.0は、速度ゼロ、すなわち、FixedUpdate()を停止する 具体的な事…

Mouse入力 Event, OnMouse, Input

Mouse入力(および、タッチセンサー入力)を受け取るには、次の3つの方法がある。1)Event キー入力とMouse操作が発生した時に発信されるEventを受け取る。 ただし、Eventは、OnGUIの中のみで受け取れる(ようだ) using UnityEngine; using System.Collec…

LineRendererを使う

例えば、空間上に引出線を描画する場合、線に相当するオブジェクトを置くよりも、LineRendererを使ったほうがスマート。1)Scriptの例 下の例は、Transformの配列(transforms)に格納した座標間にラインを描画するもの。 using UnityEngine; using System.Co…

Prefabのインスタンスを生成する

Project内に次のPrefab (BallPrefab)があるとする。 このPrefabをシーン内に生成するには、Instantiate()を使う。 たとえば次のScriptを作り、シーン内のGameObjectにアタッチ。 using UnityEngine; using System.Collections; public class MainScript : Mo…

書式付で数値を文字に変換する

数値を文字に変換するのは、toString()関数だが、同時に書式も指定できる。 たとえば、小数点以下第一位まで表示した文字は、数値変数.toString("#.0")とする。他にも多くの書式設定がある。 カスタム数値書式指定文字列 なお、toString()は、日付時刻の書式…

GUIがエラーになる時(クラス名のコンフリクト)

GUIのメソッドがない、というエラーで悩まされた。 スクリプトは間違いがないので、システムがおかしくなったかとも疑ったが、理由は簡単だった。 別途、'GUI'という名前のC#クラスを作ったため、コンフリクトを起こしていたのだ。 GUIファイルを削除(リネ…