Unity3DでuGUIをスクリプトで操作するUIUtil

ボタン機能追加

引き続き、一切エディタで操作せずにスクリプトだけで uGUI 構築する続きを。

今回は、ボタンのイベント登録をやってみました。参考にしたのは How do I add a listener to OnPointerEnter (uGui)?のページです。ありがたやありがたや。

そして、クリックイベントで UniRx の Subject を使って OnNext してます。
Dispose 処理はというと本来は OnDestroy でやっとくべきだったかと。

あと、uGUI の EventTrigger を解除するのもいるんじゃないのかと思ったんですが、よくわからなかったのでここは引き続き調査中です。まるごと Destroy したら Warning が出るので各コンポーネントを綺麗にリセットしてから消さないとだめなんかね。

ss20150204_0329_01

というわけで、実行するとログが出力されるだけです。

using UnityEngine;
using UnityEngine.UI;
using UnityEngine.EventSystems;
using Unity.Linq;
using System.Collections;
using System.Collections.Generic;
using System.Linq;
using Mera.UI;
using UniRx;

public class TestScript2 : MonoBehaviour {

    void Start() {

        // Subject
        var s = new Subject();

        // Resources
        var dcUI = Resources.LoadAll("UI001").ToDictionary<Sprite, string>(sprite => sprite.name);

        var button = dcUI["Button001"];
        var grid_head = dcUI["GridHead001"];
        var grid_cell = dcUI["GridCell001"];

        // Vector2
        var top_left = new Vector2(0f, 1f);
        var middle_left = new Vector2(0f, 0.5f);
        var bottom_left = new Vector2(0f, 0f);
        var top_center = new Vector2(0.5f, 1f);
        var middle_center = new Vector2(0.5f, 0.5f);
        var bottom_center = new Vector2(0.5f, 0f);
        var top_right = new Vector2(1f, 1f);
        var middle_right = new Vector2(1f, 0.5f);
        var bottom_right = new Vector2(1f, 0f);

        var event_system = gameObject.UIGetEventSystem();
        var canvas_object = gameObject.UIGetCanvas();
        canvas_object
            .UIAddNode(name: "Button", layoutType: LayoutType.ParentFit, sizeDelta: new Vector2(-40, -40))
                .UISetCanvasRender()
                .UISetImage(sprite: button, type: Image.Type.Sliced)
                .UISetButton()
                .UISetEventTrigger(new List() { new EventSet(d => s.OnNext(d) , EventTriggerType.PointerClick) })
            .UIAddNode(name: "Text", layoutType: LayoutType.ParentFit, sizeDelta: new Vector2(-40, -40))
                .UISetCanvasRender()
                .UISetText(Text: "Button", color: Color.white, alignment: TextAnchor.UpperLeft);

        s.Subscribe(x => Debug.Log(x.selectedObject.name));

    }

    private void Test(BaseEventData data) {
        UnityEngine.Debug.Log(data.selectedObject.name);
    }

}

ダウンロード

今回実行に必要なファイルをパッケージしてみました。
UIUtil_20150204_0333

あと、実行には neuecc さんの UniRx – Reactive Extensions for Unity と、LINQ to GameObject が必要なので、AssetStore からゲッツしてください。
あと、UniRx は面白いのでこれも是非マスターしましょう。

さて、もう眠い寝る。

ツイートツイート