Quantcast
Channel: C#タグが付けられた新着記事 - Qiita
Viewing all articles
Browse latest Browse all 9707

【Unity】ScrollViewでボタン付きのリストを作成する

$
0
0

注意

備忘録で、記事に時間をかけたくないので
わりと適当に書いてます。

環境

Unity 2018.4.19 (64bit)
.Net 4.x

目的

・ボタンがついた表を作成する。
・削除ボタンでその行を削除する。
・選択ボタンでその行の値を取り出す。

構成

ScrollView.png

準備

  1. Viewport内のContentを自動的にサイズ調整してもらう
     ScrollView->Viewport->Contentに以下をAddComponentしましょう
    ・Vertical Layout Group
    ・Content Size Filter
    ScrollView2.png

  2. RowのPrefabを作成
    構成を下図に示します.
    ScrollView1.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);
        }
    }

}

結果

ScrollView3.png

あとがき

はじめて記事を書きましたが、時間が結構かかるので
つづけられる気がしません


Viewing all articles
Browse latest Browse all 9707

Trending Articles