注意
備忘録で、記事に時間をかけたくないので
わりと適当に書いてます。
環境
Unity 2018.4.19 (64bit)
.Net 4.x
目的
・ボタンがついた表を作成する。
・削除ボタンでその行を削除する。
・選択ボタンでその行の値を取り出す。
構成
準備
Viewport内のContentを自動的にサイズ調整してもらう
ScrollView->Viewport->Contentに以下をAddComponentしましょう
・Vertical Layout Group
・Content Size Filter![ScrollView2.png]()
Script(ScrollViewRow.cs)
using System.Collections.Generic;
using UnityEngine;
using UnityEngine.UI;
//Listおよび出力先を管理
public class ScrollViewManager
{
public List<ScrollViewRow> list = new List<ScrollViewRow>();
public Text _Output;
public ScrollViewManager(Text Output)
{
_Output = Output;
}
public void SetOutput(string text)
{
_Output.text = text;
}
}
public class ScrollViewRow : MonoBehaviour
{
private int _value; //Text内で表示される値
private ScrollViewManager _manager;
public static ScrollViewRow Create(GameObject ScrollView_Content, GameObject prefab)
{
//オブジェクトの生成
GameObject obj = Instantiate(prefab, new Vector3(0, 0, 0), Quaternion.identity,ScrollView_Content.transform);
//コンポーネントをAdd
return obj.AddComponent<ScrollViewRow>();
}
public ScrollViewRow ValueSet(ScrollViewManager manager, int value)
{
_manager = manager;
_value = value;
return this;
}
void Start()
{
_manager.list.Add(this);
//テキストの設定
gameObject.transform.Find("Text").GetComponent<Text>().text = _value.ToString();
//選択ボタンイベント登録
gameObject.transform.Find("SelectButton").GetComponent<Button>().onClick.AddListener(SelectButtonOnClick);
//削除ボタンイベント登録
gameObject.transform.Find("DeleteButton").GetComponent<Button>().onClick.AddListener(DeleteButtonOnClick);
}
private void SelectButtonOnClick()
{
_manager.SetOutput(_value.ToString());
}
private void DeleteButtonOnClick()
{
_manager.list.Remove(this);
Destroy(gameObject);
}
}
Script(Sample.cs)
using UnityEngine;
using UnityEngine.UI;
public class SampleScript : MonoBehaviour
{
[SerializeField] Text Output;
[SerializeField] GameObject ScrollView_Content;
[SerializeField] GameObject RowPrefab;
void Start()
{
ScrollViewManager manager = new ScrollViewManager(Output);
for (int i = 0; i < 100; i++)
{
ScrollViewRow.Create(ScrollView_Content, RowPrefab).ValueSet(manager, i);
}
}
}
結果
あとがき
はじめて記事を書きましたが、時間が結構かかるので
つづけられる気がしません



