Unityな日々(Unity Geek)

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

script-基本

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

「リテラル」とは「文字通り」という意味。プログラミングにおける「リテラル」は、値や文字をそのまま書き下したものを指す。 リテラル文字列には、「標準リテラル」と「逐語リテラル」の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で使える広義の配列

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

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

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

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が開始されてからの…

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

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