万年素人からHackerへの道

万年素人がHackerになれるまで殴り書きするぜ。

GUIを編集中に更新? Unity

ExecuteInEditMode
http://unity3d.com/support/documentation/ScriptReference/ExecuteInEditMode.html

プラグイン作成 Unity

  • 必要になりそうなクラス一覧

http://unity3d.com/support/documentation/ScriptReference/20_class_hierarchy.Editor_Classes.html

  • ダメージ(Damage)と防御力(Armor)をGUIで調整するサンプル

これで作ります。ドキュメントはわかりにくい。
http://unity3d.com/support/documentation/ScriptReference/CustomEditor.CustomEditor.html

  • CustomEditorExample.js(プログラミング名もないしクラス名が書いてるけどJSです)

→これは"/Assets/Sctipt"へ入れます。InspectorビューでGUIで表示される元ネタになります。
→このスクリプトはどれに対してもドラッグ&ドロップ適用しません

@CustomEditor(SimpleExampleScript)
class CustomEditorExample extends Editor {

    function OnInspectorGUI() {
        // Get the place of the next available position in the script
        target.damage = EditorGUILayout.IntSlider("Damage:",target.damage,1,100);
        ProgressBar (target.damage / 100.0, "Damage");
        
        target.armor = EditorGUILayout.IntSlider("Armor:",target.armor,1,100);
        ProgressBar (target.armor / 100.0, "Armor");
        
    }
    
    // Custom GUILayout progress bar.
    function ProgressBar (value : float, label : String) {
        var size : Vector2 = GUI.skin.GetStyle("ProgressBarText").CalcSize(GUIContent(label));
        var rect : Rect = GUILayoutUtility.GetRect (size.x, Mathf.Max(size.y));
        rect = Rect(rect.x + 4, rect.y, rect.width -8, rect.height);
        EditorGUI.ProgressBar (rect, value, label);
        EditorGUILayout.Space();
    }
}

→変数”target”に対して何も代入されてないと思ったが、Editorクラスのtargetであり、Inspectorで実際適用されたObjectを示しています。
http://unity3d.cba.pl/Documentation/Documentation/ScriptReference/Editor-target.html

  • SimpleExampleScript.js

→これはInspectorビューへ表示されるエディタ用のスクリプトではない!

var armor : int = 75;
var damage : int = 25;

→これは実際のプレイヤーに適用します


Vector3のすぐ忘れるからメモ Unity

カメラからみて前(/)か上(↑)か右(→)

  • Vector3.forward

z軸ですね
(0, 0, 1)

  • Vector3.right

y軸ですね
(0, 1, 0)

  • Vector3.right

x軸ですね
(1, 1, 0)

  • 自身が30度ずつ回転(C#)

左回り

void Update () {
  transform.Rotate(Vector3.forward * 30);
}
  • ターゲットの周りを30度ずつ回転(C#)

こっちは右回り

Vector3 targetPos;
targetPos = new Vector3(2, 1, 0); // ターゲットの座標
void Update () {
  transform.RotateAround(targetPos, Vector3.forward, 30);
}

Blenderでのマウス

Logitech V470 Bluetooth Cordless Laser Mouse 英語版(ホワイト)
→これがよさげ
ロジクール MX レボリューション MX-R
→これは向いてないっぽい

だんだん小さくする C# Unity

transform.localScale -= new Vector3(0.9F, 0.9F, 1.0F);

↑これだと小さくなりすぎてマイナス値で逆転してしまう

transform.localScale = transform.localScale * 0.9F;

↑こんな感じが妥当

InvokeRepeating("Besmall", 0, 0.05F);

・呼び出し元

void Besmall () {
  transform.localScale = transform.localScale * 0.9F;
}

・呼び出し先
↑こんな感じでやる OR,

void Update () {
  transform.localScale = transform.localScale * 0.9F;
}

Updateでやったり

Unityクックブック(オライリー)とか作りたいな

回転 C# Unity

transform.Rotate(Vector3.forward * 30);
z軸が30度になるのではなく、30度回転する。

Unity メモ

TransformDirection()はローカルのTransform情報をワールド座標系に変換
JS

var forward = cameraTransform.TransformDirection(Vector3.forward);

カメラの正面方向をワールド座標でどちらを向いているかをVector3形式で取得。

var right = Vector3(forward.z, 0, -forward.x);

Xを-Zへ、ZをXへ置き換えれば、↓(手前)・↑(奥行き)を←・→にできるっぽい

SendMessageはコルーチンもコール可能 Unity

ちなみにStartCoroutineで呼んだのはStopCoroutine で止められる
SendMessageのも止められる?

  • StartCoroutine

http://unity3d.com/support/documentation/ScriptReference/MonoBehaviour.StartCoroutine.html

  • StopCoroutine

http://unity3d.com/support/documentation/ScriptReference/MonoBehaviour.StopCoroutine.html