FC2ブログ
    02 «1.2.3.4.5.6.7.8.9.10.11.12.13.14.15.16.17.18.19.20.21.22.23.24.25.26.27.28.29.30.31.» 04

    ハルシオンシステムの気ままBlog

    株式会社ハルシオンシステムのメンバーが送る、UnityやらJavaやらの技術的話題から、自社開発のアプリの宣伝とかとかのブログです。ほんと気ままにいきたいと思います。更新日は毎週 月 木でっす!

     

    【ハルシオンブログ】Unityでオブジェクトの一覧を作成し、アイテムをタップすると選択中的なオブジェクトを表示する方法 

    少し暖かくなってきました。
    その代わり花粉が暴れてきた今日この頃。
    目がかゆい坂内です。

    ポケットガール好評リリース中。
    是非遊んでやってください。

    URL(Android):https://play.google.com/store/apps/details?id=com.halcyon.pocketgirl3
    URL(iOS):https://itunes.apple.com/jp/app/id1539553611

    宣伝から入りました。


    さて、Unityのお話。
    Unityでアイテムのリストを作成し、タップで選択中というオブジェクトをそのリストアイテムに出す。

    こんな感じのことをしたい時。




    こんな感じで作ってますよという紹介です。
    (もっと簡単な方法あると思います)

    アイテムを並べるためのスクロールビューを作成。
    スクロールの必要もないんだけど、いっぱい並べた時用にスクロールにしてみた。



    そしてCanvasに以下コードをくっつける。
    [Blog0313.cs]

    using System.Collections.Generic;
    using UnityEngine;

    public class Blog0313 : MonoBehaviour
    {
    [SerializeField] ListItem listItemPref;

    [System.Serializable]
    public class Item {
    public int itemCd;
    public string itemName;
    }
    List<Item> items = new List<Item>();
    List<ListItem> listItems = new List<ListItem>();

    [SerializeField] Transform trnItemPlace;

    int currentItemIndex;

    private void Start() {
    // アイテムのデータを10個生成
    for (int i = 0; i < 10; i++) {
    Item item = new Item();
    item.itemCd = i;
    item.itemName = "Item" + i;
    items.Add(item);
    }

    // アイテムを生成
    foreach (Item item in items) {
    ListItem listItem = Instantiate(listItemPref, trnItemPlace, false);
    listItem.Setup(item, SelectItem);
    listItems.Add(listItem);
    }
    }

    ///

    /// アイテムを選択する処理
    /// </summary>
    /// <param name="i"></param>
    void SelectItem(int i) {
    currentItemIndex = i;
    // リスト更新
    foreach (ListItem listItem in listItems) {
    listItem.CheckSelect(currentItemIndex);
    }
    }
    }




    次に、リストのアイテムPrefabを作成。



    このItemには以下のコードを張り付けます。

    [ListItem.cs]

    using UnityEngine;
    using UnityEngine.UI;
    using TMPro;
    using System;

    public class ListItem : MonoBehaviour
    {
    [SerializeField] TextMeshProUGUI lblItemName;
    [SerializeField] Button btnSelect;
    [SerializeField] GameObject objSelector;

    int itemCd;

    public void Setup(Blog0313.Item itemData, Action<int> SelectItem) {
    objSelector.SetActive(false);

    lblItemName.text = itemData.itemName;
    this.itemCd = itemData.itemCd;

    btnSelect.onClick.AddListener(() => SelectItem(itemData.itemCd));
    }

    ///

    /// 選択中マーク更新処理
    /// </summary>
    /// <param name="index"></param>
    public void CheckSelect(int index) {
    if (itemCd == index) {
    objSelector.SetActive(true);
    } else {
    objSelector.SetActive(false);
    }
    }
    }



    こんな感じの処理をしてみる。

    実行するとこんな感じ。



    選択した際に、選択されてるindexを各リストのオブジェクトに渡して、自分のindexと同じやつだけ選択中のオブジェクトを表示、違う場合は選択中のオブジェクトを非表示しているだけ。
    特に何も考えないで作るとこんな感じでできます。

    ということで、メモ的な感じでした。

    では、あでゅ~ノシ

    Category: 開発日記(Unity)

    tb 0 : cm 0