동적 생성 단순 버튼
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);
}
}
Reference
이 문제에 관하여(동적 생성 단순 버튼), 우리는 이곳에서 더 많은 자료를 발견하고 링크를 클릭하여 보았다 https://qiita.com/mczkzk/items/29b0d55922e2478d3b9a텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
우수한 개발자 콘텐츠 발견에 전념 (Collection and Share based on the CC Protocol.)