Unityな日々(Unity Geek)

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

軸周りの回転の方向

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

Unityで使える広義の配列

参考:Choosing the right collection type - Unify Community WikiUnityの広義の配列―コレクション―はいくつか種類がある。それぞれ宣言や代入、値の取出しの記述が異なる。また、自由度が高い反面、使わないほうがよいものもある。 1)ビルトイン配列(Buil…

実行の順番:OnEnable, Awake, OnLevelWasLoaded, Start

Unityのスクリプト内で初期化を行う関数はいくつかある。ひとつのスクリプトの中で実行される順番は次の通りらしい。(出典はこれ) Awake OnEnable OnLevelWasLoaded Start しかし、スクリプトを無効にした場合(Script.enabled=false)は、次の通り Awake …

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

わかりにくいタイトルだが、具体的な例で説明する。下のように、メインであるクラス(下の例では、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()を停止する 具体的な事…

オブジェクトの一部をマスクする

Unityで、GameObjectの一部にマスクをかけるには、DepthMaskを使う。 参考:Unity - Manual: ShaderLab syntax: SubShader Tags 1. Maskとなるオブジェクトの設定 1-1. 新規シェーダを作成。Maskシェーダのスクリプト(下記)を記述する。 Maskオブジェクト…

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…

3Dプロジェクタを設定する

Unityから3Dモニタ/プロジェクタに出力する際の設定覚書。 ちなみにサンプルの環境は、GeForce680のHDMIポートに、SANYO PDG-DWL2500(Panasonic CT230)とMitsubishi RDT231WMがつながっている状態である。DWL2500は解像度1280X800の3Dプロジェクタ、RDT231W…

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

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

Textureの設定

オブジェクトへのTextureの貼付は 1)AssetにTexure画像を読み込み、 2) その画像をMaterialに貼り、 3) そのMaterialをObjectに適用する と言う手順になる。この時、Texture画像の設定によってレンダリング後の見え方が違う。Assetで画像データを選択した状…

KINET SDKを使う その2・スクリプト解析編

KINECT SDKを使う その1・環境設定編 - Unityな日々(Unity Geek)の続きKinectInterop.cs Kinectとのインターフェースを司どる最下層のスクリプト。public interfrace KinectInterface :Kinectとのインターフェース定義。実装はKinectSensor.csで定義され…

Meshの三角ポリゴンを反転する

http://wiki.unity3d.com/index.php?title=ReverseNormals http://forum.unity3d.com/threads/101018-How-do-I-get-the-normal-of-each-triangle-in-meshインポートした3DモデルのMeshを次のスクリプトで調べてみた。 print ("normals="+normals.Length+" t…

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

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

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

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

Static Classを使う

Static Classを使う場合は次のように記述javascript #pragma strict static class Ball { function getColor():Color{ return new Color(0.0F,1.0F,1.0F,0.3F); } } c# using UnityEngine; using System.Collections; public static class Ball { //関数名 p…

キー入力のメモ 'GetKey'と'GetKeyDown/Up'の違い

キー入力は基本だが、「あるキーが押された」「離された」というイベントと、「押されているか」「押されていないか」という状態は区別されている。1)イベント(一回限り)キーが押された if (Input.GetKeyDown("a")) { // aが押された!(押され続けは検知…

javascriptとC#の違い

Unityでスクリプトを書いていると、javascriptとC#の表記方法の違いに混乱することがある。似ているところと違うところがあるから、ややこしい。 たとえば、ゲームは初心者にやさしく: Unity C#とJavascriptの主な違いが参考になる。

C#を使う際の注意事項

Unity Script Reference – Overview: Writing Scripts in C#にまとめられている。 すべてのクラス(静的クラスを除く)はMonoBehaviourを継承し、クラス名とファイル名は一致していなければならない。 コルーチンはIEnumerator型の戻り値を持たねばならない…

覚えておくと便利なMathf関数

UnityのMathf関数には、通常のMath関数以外に3Dインタラクティブ用に特化された関数がある。次は知っておくと効率化できそう。 関数名(引数) 機能 Clamp(,min,max) 最大・最小値でカット Pow(x,y) xのy乗 Ceil(x) 小数点切り上げ(floatのまま) CeilToIn…

他のGameObject、Componentにアクセスする

現在のScriptがアタッチされているGameObject以外のGameObjectにアクセするには次の方法がある。 1)Inspectorでアサインする public変数としてGameObjectを定義し、Inspector上で該当GameObjectをアサインする方法。 簡単だが、この方法だとScriptだけで完…

同階層のComponentにアクセスする

Componentとは、GameObjectに付加する部品のようなもの。一般的には、GetComponent("Component名") で取得する。javascript GetComponent(Transform).Translate(0, 1, 0);C# using UnityEngine; using System.Collections; public class example : MonoBehav…

Timeクラスを使う

Timeクラスのプロパティ プロパティ 内容 time ゲームが始まってからの時間 (Read Only) timeSinceLevelLoad 現在のレベルがロードされてからの時間 (Read Only) deltaTime 最新のUpdateのインターバル (Read Only) fixedTime FixedUpdateが開始されてからの…

ベジェ曲線にそってオブジェクトを動かす

参考:Bezier Curve Unityは標準ではベジェ曲線を扱うクラスはない。そこで、デベロッパーネットワークの投稿にあったベジェ曲線のクラスを使ってみた。1.ベジェ曲線のクラス P0〜P3は制御点、関数GetPointAtTime( float t )で、曲線上の座標を取得できる…

親オブジェクトを取得する

これは基本かもしれないが、親オブジェクトを取得するには、childGameObject.transform.parent とする。つまり、"transform"が必要。たとえば、衝突してきたオブジェクトのコライダがあるオブジェクトの親オブジェクトにメッセージを渡す場合は次のようにな…

GUISkinを変更する

UnityのデフォルトのGUSkinは、Assetに実体がないため、カスタマイズできない。 "Built-in GUI Skin"をダウンロードし、このGUISkinをデフォルトに設定することで、カスタマイズが可能になる。なお上のパッケージのSkinにデフォルトで設定されているフォント…

書式を使って文字化する

String.format()関数を使えば、書式付きで数値を文字化できる。 String.Format メソッド (String, Object) (System)書式の中に"{"や"}"を入れたい時は、"{{", "}}"と2重化する。string.Formatの書式指定文字列に中カッコを入れる方法 - うっかりプログラミ…

Unityから連番画像を書き出す

画面のスクリーンショットはApplication.CaptureScreenshot(ファイル名)で取得する。 下の例は、スクリーンショットをループ(Update等)に入れて、動画を連番ファイルで書き出すサンプル。(出典:ScreenShotMovie - Unify Community Wiki) using UnityEng…

C#  値型・参照型、値渡し・参照渡し

次のサブクラスに対し、 using UnityEngine; using System.Collections; //Sub Class public class Sub : MonoBehaviour { public int a; }次のメインクラスがあるとする。 using UnityEngine; using System.Collections; //Main Class public class Main : …