동적 생성 단순 버튼

18077 단어 UniRxUnityC#
UniRX를 사용하여 JSON 파일에서 데이터 드래그
Action 방법을 사용하여 각 버튼에 이벤트의 샘플을 추가합니다.
CODE: https://github.com/mo49/SimpleButton

ItemApi.cs


API의 패키지 클래스 정의
using System.Collections.Generic;
using UnityEngine;
using UniRx;
using System;
using System.IO;

public class ItemApi : MonoBehaviour{

    /// <summary>
    /// ローカルのJSONを返すObservableを返す
    /// </summary>
    public IObservable<List<ItemInfo>> GetItems()
    {
        var path = Application.dataPath + "/info.json";
        StreamReader reader = new StreamReader(path);
        string json = reader.ReadToEnd();

        return ListJsonAs<ItemInfo>(json);
    }

    /// <summary>
    /// JSON配列の処理
    /// https://qiita.com/akira-sasaki/items/71c13374698b821c4d73
    /// </summary>
    private IObservable<List<T>> ListJsonAs<T>(string json)
    {
        Wrapper<T> wrapper = JsonUtility.FromJson<Wrapper<T>>(json);
        return Observable.Return(wrapper.list);
    }

    class Wrapper<T>
    {
        public List<T> list;
    }
}

App.cs


API에 쉽게 액세스할 수 있는 패키지 클래스
public class App {

    public static readonly App Instance = new App();

    // App.Instance.Api でアクセスできるようにする
    public readonly ItemApi Api = new ItemApi();

    private App() {

    }

}

ItemInfo.cs


JSON 구조의 규정
using System;

/// <summary>
/// JSON構造の規定
/// </summary>
[Serializable]
public class ItemInfo {
    public string key;
    public string name;
    public int sex;
    public bool isRegistered;
}
샘플의 JSON.
info.json
{
    "list": [
        {
            "key": "1",
            "name": "Bob",
            "sex": 1,
            "isRegistered": true
        },
        {
            "key": "2",
            "name": "Steve",
            "sex": 1,
            "isRegistered": false
        },
        {
            "key": "3",
            "name": "Carol",
            "sex": 2,
            "isRegistered": false
        }
    ]
}

ItemLoader.cs


Subscribe가 JSON의 API를 획득하고 완료 후 알림
using System.Collections.Generic;
using UnityEngine;
using UniRx;
using System;

public class ItemLoader : MonoBehaviour {

    public GameObject m_Item;

    // 非同期専用のSubject
    private AsyncSubject<List<ItemInfo>> m_ItemInfos = new AsyncSubject<List<ItemInfo>>();
    // Expression-bodied
    public IObservable<List<ItemInfo>> ItemInfos => m_ItemInfos;

    public void Load()
    {
        App.Instance.Api.GetItems().Subscribe(data => {
            m_ItemInfos.OnNext(data);
            m_ItemInfos.OnCompleted();
        });
    }
}

ItemManager.cs


각 항목을 생성하고 클릭할 때 실행하는 동작 함수 방법의 내용을 정의합니다
using System.Collections.Generic;
using UnityEngine;
using UniRx;

public class ItemManager : MonoBehaviour {

    [SerializeField] GameObject m_Item;

    [SerializeField] Transform m_ItemRoot; 

    [SerializeField] ItemLoader m_ItemLoader;

    void Start () 
    {
        m_ItemLoader.Load();
        m_ItemLoader.ItemInfos.Subscribe(infos => CreateItem(infos));
    }

    void CreateItem(List<ItemInfo> infos) 
    {
        foreach (var info in infos)
        {
            GameObject obj = Instantiate(m_Item, m_ItemRoot);
            Item item = obj.GetComponent<Item>();
            item.Draw(info);
            // アクションイベントの登録(委譲元)
            item.ActionOnClick += val =>
            {
                Debug.Log("clicked: " + val.name);
            };
        }
    }
}

Item.cs


Item 아방가르드와 함께 제공되는 스크립트
Item 정보 그리기
Action 메서드 실행
using UnityEngine;
using UnityEngine.UI;
using System;

public class Item : MonoBehaviour {

    [SerializeField] Button button;
    [SerializeField] Text text;

    private ItemInfo m_ItemInfo;

    // アクションイベントを実行する(委譲先)
    public Action<ItemInfo> ActionOnClick;

    public void Draw(ItemInfo info) 
    {
        m_ItemInfo = info;
        text.text = info.name;
        button.GetComponent<RectTransform>().localPosition = new Vector3(int.Parse(info.key) * 100f, 100f, 0f);
    }

    public void OnClick() 
    {
        ActionOnClick(m_ItemInfo);
    }
}

좋은 웹페이지 즐겨찾기