トマシープが学ぶ

Unity/VR好きのミーハー初心者 記事内容は自分用のメモ。何も求めないで

Listと自作クラスリストとTextArea【Unity】

なんとなくわかるし、ほかの人が書いたコードは見たことあるけど自分で実践で使ったことがないのでやってみる。

 あと別件でインスペクタで改行できるTextAreaと言うのも使う

TextArea

stringの前に[TextArea]と付けると改行できる

[SerializeField] private string Title;
[SerializeField, TextArea] private string Contents;

f:id:bibinbaleo:20191117140111p:plain

デフォルトだと3行分ぐらいしかエリアがなくて長い文章だと見ずらい

[SerializeField, TextArea(1,10)] private string Contents;

数字を付けるとその行数分エリアができる

f:id:bibinbaleo:20191117140228p:plain

zenigane138.hateblo.jp

List

[SerializeField] private List<string> TitleList = new List<string>();
[SerializeField, TextArea(1, 10)] private List<string> CotentsList = new List<string>();

TextAreaを使ったリストもできた。入力したら広がった

f:id:bibinbaleo:20191117140929p:plain

techacademy.jp

これでuGUIのtextに入れる

private void Start()
{
Text_Title.text = TitleList[0];
Text_Contents.text = CotentsList[0];
}

できた!!!

f:id:bibinbaleo:20191117141746p:plain

自作クラスの型をリストにする

クラスを作るのはこんな感じ

public class Blog
{
public string Title;
public string Contents;
}

www.physif.net

初めてクラスを作った気がする。本ではやった気がする

そしてこうやって宣言

[SerializeField] private List<Blog> BlogList = new List<Blog>();

インスペクタに出す

インスペクタに出てこない・・・

自作クラスの前に [System.Serializable]を書いたら出てきた!

f:id:bibinbaleo:20191117150640p:plain

ftvoid.com

Elementsの表記を変える

そういえば、Titleのところに文字を入れたらElement1のところがTitleで入れた文字になった。

表示している変数の中にstring型の変数があれば、Elementの文字がstring型と同じになる、という仕様になっているようです。

しかし、見出しを変えるには条件があります。

それは…string型がクラスの変数の中で一番上に表示されていること です。

Unityのちょっとした機能(Inspectorのクラス配列編) - SAT-BOX BLOG

 ですって!たまたまの発見!

 

意図的にする方法はこのスレッドでいっぱい書かれている

https://forum.unity.com/threads/how-to-change-the-name-of-list-elements-in-the-inspector.448910/

エディタ拡張を使う方法をみゅみゅさんが書いてる。

qiita.com

スクリプトで要素を加える

今回はインスペクタから要素を加えるけど、スクリプトから加える場合

 

まずリストの中にコンストラクタを作る。

    public class Blog
    {
        public string Title;
        [TextArea(1, 10)] public string Contents;

        public Blog(string title ,string contents)
        {
            Title = title;
            Contents = contents;
        }
     }

やっぱりなんかやったことある気がする

Javaでやったのか!すっきりした

bibinbaleo.hatenablog.com

 

そして追加

BlogList.Add(new Blog("a", "aaa"));

ja.stackoverflow.com

たぶんこれでいい・・・よく分からない

番号指定してtextに入れる

自作クラスの要素それぞれを別のテキストに入れたい。

Text_Title.text = BlogList.Title[0];

これだとダメって言われる

下みたいにforeachでやったら回って最後のものが入るけど、リストの番号を指定して入れたいんだよな~

    foreach(Blog item in BlogList)
        {
            Text_Title.text = item.Title;
            Text_Contents.text = item.Contents;
        }

というかもう、自作クラス作らずに最初にやったようにタイトルとコンテンツそれぞれリストにしたほうがいいのか?

いやでもまとめたい・・・

 

・・・あ

Text_Title.text = BlogList[0].Title;
Text_Contents.text = BlogList[0].Contents;

こうか~~~

一時間ぐらい失った~~

f:id:bibinbaleo:20191117154415p:plain

www.atmarkit.co.jp

www.sejuku.net

今日の成果

がんばりました!はなまるぴっぴだね。

dictionaryもしようかと思ったけどめんどくさいからいいや。

using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using UnityEngine.UI;

public class dictionary : MonoBehaviour
{
    //[SerializeField] private string Title;
    //[SerializeField, TextArea(1,10)] private string Contents;
    //[SerializeField] private List<string> TitleList = new List<string>();
    //[SerializeField, TextArea(1, 10)] private List<string> CotentsList = new List<string>();
    [SerializeField] private Text Text_Title;
    [SerializeField] private Text Text_Contents;
    public List<Blog> BlogList = new List<Blog>();

    [System.Serializable]
    public class Blog
    {
        public string Title;
        [TextArea(1, 10)] public string Contents;


        public Blog(string title ,string contents)
        {
            Title = title;
            Contents = contents;
        }
     }

    private void Start()
    {
       // Blog test = new Blog();
       //foreach(Blog item in BlogList)
       // {
       //     Text_Title.text = item.Title;
       //     Text_Contents.text = item.Contents;
       // }

       Text_Title.text = BlogList[0].Title;
       Text_Contents.text = BlogList[0].Contents;
        //BlogList.Add(new Blog("a", "aaa"));
    }
}