Dictionaryのコピー
//
// Create and initialize Dictionary.
//
Dictionary<string, int> dictionary = new Dictionary<string, int>();
dictionary.Add("cat", 1);
dictionary.Add("dog", 3);
dictionary.Add("iguana", 5);
//
// Copy the Dictionary to a second object.
//
Dictionary<string, int> copy = new Dictionary<string, int>(dictionary);
Dictionaryの走査
foreach (KeyValuePair<string, string> pair in dic) {
Debug.Log (pair.Key + " : " + pair.Value);
}
二点間の角度
// p2からp1への角度を求める
// @param p1 自分の座標
// @param p2 相手の座標
// @return 2点の角度(Degree)
public float GetAim(Vector2 p1, Vector2 p2) {
float dx = p2.x - p1.x;
float dy = p2.y - p1.y;
float rad = Mathf.Atan2(dy, dx);
return rad * Mathf.Rad2Deg;
}
InvalidOperationException: out of sync
foreach内でDictionaryの値を変えようとすると見出しのエラーで怒られる。
List<string> keyList = new List<string>(dictionary.Keys);
foreach(string key in keyList){
dictionary [key] *= 2;
Debug.Log (key + " " + dictionary [key]);
}
KeyのみをListにして操作する。
経過時間を取得する
public float timeOut;
private float timeTrigger;
void Update() {
if(time.Time > timeTrigger) {
// Do anything
timeTrigger = Time.time + timeOut;
}
}
[Unity] 一定の時間間隔で処理を実行する方法まとめ(時間制御)
指定位置を向く
gameObjA.transform.LookAt(gameObjB.transform.position);
Unityでの「前」とは、エディター上でオブジェクトを選択した時の青い矢印の向きで現されます。
Cameraの投影設定がPerspecriveのときはZ値を設定してやる。
Unity: Transform.LookAt()の回転軸を制限する
【Unity】ScreenToWorldPointが上手く取れない?
GameObjectの複製
//オブジェクトを変数名bulletで生成
GameObject bullet = Instantiate(obj) as GameObject;
ParticleをPrefab化
prefabにParticleSystemコンポーネントを追加しといて、
private ParticleSystem particle;
// Use this for initialization
void Start ()
{
particle = this.GetComponent<ParticleSystem> ();
// ここで Particle System を停止する.
particle.Stop ();
}
void OnTriggerEnter (Collider col)
{
// ここで Particle System を開始します.
particle.Play ();
}
Unity5でのPrefabに設定したParticleSystemをスクリプトで起動する方法
Unityで使える配列
以上、Unityで扱われる広義の配列について述べた。利用指針は次のようになるだろう。
・大きさがわかっているケースは、ビルトイン配列を使う。メモリ効率も速度ももっともよい。
・ArrayListのかわりにGneric Listを、Hashtableの代わりにGeneric Dictionaryを使う。
・Javascript Arrayは使わない。
要するに、型のキャストを避けるべき。
開発時はArrayListやHashtableを使ってもよいが、リリース時はGnericに変換するとよいだろう。
List配列走査中の要素の削除
Listを走査中に要素を削除してしまうと、次の要素が繰り上がると同時に変数 i もインクリメントしてしまうので次の要素の処理を飛ばしてしまうことになる。
List<int> test = new List<int> ();
for (int i = 0; i < 5; i++) {
test.Add (i);
}
for (int i = 0; i < test.Count; i++) {
Debug.Log ("test1 : " + test[i]);
if (i == 2) {
test.RemoveAt (i);
}
}
// [output]
// test1 : 0
// test1 : 1
// test1 : 2
// test1 : 4
なので要素を消したら変数 i をデクリメントしてあげる。
List<int> test = new List<int> ();
for (int i = 0; i < 5; i++) {
test.Add (i);
}
for (int i = 0; i < test.Count; i++) {
Debug.Log ("test1 : " + test[i]);
if (i == 2) {
test.RemoveAt (i);
i--;
}
}
// [output]
// test1 : 0
// test1 : 1
// test1 : 2
// test1 : 3
// test1 : 4
floatの絶対値を返す
Debug.Log(Mathf.Abs(-10.5);
// 結果 10.5
ベクトルの加算・減算
Vector2のまま加算・減算してもちゃんと成分同士で計算してくれる。
Vector2 vec1 = new Vector2 (0.2f, 0.3f);
Vector2 vec2 = new Vector2 (0.4f, 0.5f);
Vector2 vecAdd = vec1 + vec2;
Debug.Log (vecAdd);
// [output]
// (0.6, 0.8)
DictionaryをInspectorで扱う
おいおい使いそう。
UnityのInspectorで扱えるDictionary
参照渡し
引数に ref をつけるを参照を渡すことになる。
// 参照渡しをする場合には、引数にref修飾子をつけます。
public void addSum (ref int num)
{
num = 100 + num;
Debug.LogError ("値: " + num);
}
var addSum = new outTest ();
int a = 100;
Debug.Log ("a:" + a);
addSum.addSum (ref a);
Debug.Log ("結果 a:" + a);
// a:100
// 値: 200
// 結果 a: 200
【C#】参照パラメーター(ref) と出力パラメーター (out) とは
3つの座標系
Screen
画面の解像度による座標。
例えば1280 × 800の画面の中央のScreen座標は(640, 400)。
Viewport
画面の左辺を x = 0、右辺を x = 1 に、下辺を y = 0、上辺を y = 1 とした座標。
解像度によらず、画面の中央のViewport座標は(0.5, 0.5)。
World
3D空間上における座標。
構造体
●構造体の定義
struct 構造体名 {
//変数郡
//関数郡
}
これをnewして使用します
構造体名 変数名=new 構造体名();
◇Unityでゲーム開発 -C#の構造体-
Unityメモリ管理「構造体とクラスの比較」
TouchScriptを使う
標準GUIと混在させる
EventSystemにあるStandaloneInputModuleをTouchScriptInputModuleに置き換えます。
[Unity] TouchScriptの覚え書き ~ holizonglow
TouchScript - アセットストア - Unity Asset Store
Home · TouchScript/TouchScript Wiki · GitHub
[Unity] TouchScriptの覚え書き ~ holizonglow
標準GUIの操作
Input Field
On Value Changed
入力中の文字列が変更された際に発火
On End Edit
入力中からEnterやフォーカスが外れた祭に発火
入力文字列の取得
GetComponent<InputField> ().text;
【Unity】uGUIのInputFieldで入力した文字列をプログラムに渡す
コルーチン
一定時間待つ。
void Start () {
// コルーチンを実行
StartCoroutine ("Sample");
}
private IEnumerator Sample() {
// ログ出力
Debug.Log ("1");
// 1秒待つ
yield return new WaitForSeconds (1.0f);
// ログ出力
Debug.Log ("2");
// 2秒待つ
yield return new WaitForSeconds (2.0f);
// ログ出力
Debug.Log ("3");
}
コールバック
【Unity】【C#】UnityEvent, Action, delegate, interface でのコールバック実装方法とインスペクタでの登録
キーボードからの入力
if (Input.GetKey(KeyCode.Space)) {
transform.position = new Vector3(0f, transform.position.y + 0.1f, 0f);
} else {
transform.position = new Vector3(0f, transform.position.y - 0.1f, 0f);
}
Blender からオブジェクトをインポート
Start() の走るタイミング
ヒエラルキの順番とは無関係ぽい。
Canvasは上位からレンダリングされる、んだっけかな。
イベント処理
const と static
const を指定すると自動的に static になるらしい。へー。
なので明示的に static const を並ばせるとエラー吐く。
Editor拡張
using UnityEngine;
using UnityEditor; // エディタ拡張関連はUnityEditor名前空間に定義されているのでusingしておく。
using System.Collections;
// エディタに独自のウィンドウを作成する
public class EditorExWindow : EditorWindow
{
// メニューのWindowにEditorExという項目を追加。
[MenuItem("Window/EditorEx")]
static void Open()
{
// メニューのWindow/EditorExを選択するとOpen()が呼ばれる。
// 表示させたいウィンドウは基本的にGetWindow()で表示&取得する。
EditorWindow.GetWindow<EditorExWindow>( "EditorEx" ); // タイトル名を"EditorEx"に指定(後からでも変えられるけど)
}
// Windowのクライアント領域のGUI処理を記述
void OnGUI()
{
// 試しにラベルを表示
EditorGUILayout.LabelField( "ようこそ! Unityエディタ拡張の沼へ!" );
}
}
エディタ拡張徹底解説】初級編①:ウィンドウを自作してみよう【Unity】
virtual と override
継承元スーパークラスにはメソッド名の前にvirtual
継承先サブクラスにはメソッド名の前にoverride
をつけるとサブクラスのメソッドを呼び出すことができる