Unityな日々(Unity Geek)

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

script-基本

キー入力のメモ '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が開始されてからの…

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

これは基本かもしれないが、親オブジェクトを取得するには、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 : …

C#でcoroutineを使う

javascriptでcoroutineを使う際は、 処理1 yield WaitForSeconds(2); 処理2 と、yiledをはさむだけでよい。C#の場合は、StartCoroutine/IENumearatorの組になるようだ。 public void endRecording(){ if(isFile){ titleScreen.endRecording(); // StartCor…

Materialの色を変える

Materialの色は、(renderer.)material.SetColor("_Color", Color)で変更する。下の例は、materialをPublic変数として受け取り、指定したOn/Off時間で色を変えるもの using UnityEngine; using System.Collections; public class FlashingLight : MonoBehavio…

日付と時間

日付と時間の取得は、DateTimeクラスを使う。DateTime Structure (System) DateTimeは.NETクラスのため、Using System; (jsは、import System;)が必要。 using System; public class TestTime : MonoBehaviour { void Start () { DateTime thisDay = DateTi…

シーンを再スタートする

まっさらの状態から始めたい場合は、Application.LoadLeveo(0)を使う。 たとえば、ESCキーでリスタートしたい場合 if (Input.GetKeyDown(KeyCode.Escape)){ Application.LoadLevel(0); }

Public変数だがInspectorから見えないようにする

パブリック変数として他のクラスから参照したいが、Inspectorでは変更できない(=Private変数と同様に見えない)ようにしたい場合は、[HideInInspector]属性を付加する。 [HideInInspector] public float invisiblePublicVar;

特定のタグ名のGameObjectをすべて取得する

GameObject.FindGameObjectsWithTag()を使えば、同じタグ名のGameObjectを一挙に取得できる。 public GameObject[] cars; void Awake () { if (cars.Length==0) cars=GameObject.FindGameObjectsWithTag("Car"); foreach (GameObject car in cars) { //Awake…

外部データの読み込みTips

実行時に外部ファイルからデータを読み込みたい場合のTips実行環境がUnityEditor(=ローカル)か独立したアプリケーション(=オンライン)かの区別は、Application.isEditorで行う。 ローカル実行の場合は、ファイルURLの先頭に"file://"をつける。 if (Ap…

ローカルファイルに書き込む

ローカルファイルに書き込む場合は、System.IOのFileクラスを使う。基本的な手順は、 File.CreateText(filepath) で、ファイルを作成し、 WriteLine(text) で、一行ずつ書き込むと言うことになる。最後にClose()でIOを閉じることも忘れずに。 using UnityEng…

GUIのレイアウトを設定する

画面上に情報を表示するには、GUIクラスを使う。が、複数の情報を表示する場合はレイアウトも含めて一括設定できる、GUILayoutクラスが便利。各GUI要素を、GUILayout.BeginArea()~GUILayout.EndArea()で挟んで記述する。 void OnGUI(){ GUILayout.BeginArea(…

GUIにフォントを設定する

GUIの見栄えは、GUISkinで設定する。Projectビューで、Create-GUISkin フォントをプロジェクトに読み込む。 Windowsの場合、コントロールパネルーフォントをクリック。該当フォントをProjectビューにドラッグ&ドロップ Projectビューに読み込まえれたフォ…

Unityのバージョンで処理を変える

Unity Script Reference – Overview: Script compilation (Advanced) 特定のバージョンに対してのみ処理を行うことができる。例えば、Ver. p.q.r だけの処理は、 #if Use Unity_p_q_r #endif とする。p.q.x(xは任意)と、マイナーバージョンは関係なく適用…

C#の配列

UnityのライブラリやサンプルスクリプトはC#で書かれたものが多いので、C#の世界も理解しなければならない。今まではActionscript/javascript系を中心に開発してきたので、コードを眺めながら「??」となる点もいくつかあった。その覚書のひとつ。1)一般…

javascriptからC#のスクリプトを呼ぶ

まず、javascriptからjavascriptを呼ぶ場合、ひとつのGameObjectにそれぞれのjavascriptファイルをアタッチしてやる。たとえば、呼び出し側 #pragma strict var test:TestJS; test = GetComponent("TestJS"); function Start () { print(test.getNum()); }呼…

スクリプトを管理する

現在のプロジェクトにあるスクリプトファイルのリストは、Component-Scripts で見ることができる。 しかし、スクリプトの数が増えてくると長いリストになって不便。そこで、スクリプトをカテゴリー分け(および呼び出し名を設定)する方法が、@script AddCom…

変数の命名規則

Unityの変数の命名規則は次が標準。 種類 規則 例 一般の変数 ローワーキャメル deltaTime キーワード 小文字 audio, transform.position 列挙型 大文字 UPPERCASE 関数 アッパーキャメル CountTime クラス アッパーキャメル EnemyBoss

ガーベッジコレクションを最適化する

参考:Optimizing with Unity iPhone, the first three things I’ll do… | Cratesmith Gameworks

TagとLayer

gameObjectにはTagとLayerを設定できる。 Tagは、主にGameObjectを特定する(名前の代わり)に使用する。 Layerは、主にRendering設定のグループ分けに使う。例えば、あるカメラで見える/見えない、あるライトで照らす/照らさない、等)次のように設定する1)…

MonoBehaviourを理解する

参考 Unity Script Reference – MonoBehaviour Unityのスクリプトはすべて、MonoBehaviourクラスの子クラスでなければならない。 javascriptの場合は明示的に指定しなくてもMonoBehaviourの子クラスになる。例えば、testScript.jsと言うスクリプトファイルを…