Unity(C#)初心者・入門者向けチュートリアル ひよこのたまご

AndroidやiOS向けアプリを簡単に作れるゲーム開発環境Unity(ユニティ)の使い方を、チュートリアル方式で一緒に学びましょう!

【Unity】LINEっぽいチャットでScroll View チュートリアル④ChatNode

Unity 2019.2.0f1 Personal(2019年8月)
f:id:hiyotama:20190822150931p:plain
LINEっぽいチャットでScroll Viewチュートリアル、
ラストはChatNodeスクリプトを作成していきます〜


ChatNodeスクリプト作成

まずはChatNode.csを作成し、
以前Prefab化したChatNodeオブジェクトにつけていきます〜

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


public class ChatNode : MonoBehaviour
{
    private ChatData chatData;

    [SerializeField] LayoutGroup layoutGroup;
    [SerializeField] Image chatBoard;
    [SerializeField] Text chatText;
    [SerializeField] Image chatIcon;
    [SerializeField] Sprite mineSprite;
    [SerializeField] Sprite othersSprite;


    public void Init(ChatData data)
    {
        chatData = data;
        chatText.text = chatData.body;

        if (chatData.roll == ChatRoll.MINE)
        {
            chatIcon.sprite = mineSprite;
            layoutGroup.childAlignment = TextAnchor.MiddleRight;
            chatBoard.color = new Color(0f, 1f, 0.1f);
            chatIcon.transform.SetSiblingIndex(1);
        }
        else if (chatData.roll == ChatRoll.OTHERS)
        {
            chatIcon.sprite = othersSprite;
            layoutGroup.childAlignment = TextAnchor.MiddleLeft;
            chatBoard.color = new Color(1f, 1f, 1f);
            chatIcon.transform.SetSiblingIndex(0);
        }
    }

ChatNode.cs

メソッドはInitのみです。
ChatDataを受け取り、rollによってChatNodeの内容を変更します。
sprite変更、childAlignmentで左右のポジション決め、カラー変更。
SetSiblingIndexはHierarchy上でのオブジェクトの並び順をスクリプトから変更します。

ChatSystemスクリプト修正

前回作成したChatSystemスクリプトを修正していきます〜

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

public class ChatSystem : MonoBehaviour
{
    private int id = 0;
    [SerializeField] InputField chatInputField;
    [SerializeField] GameObject chatNodePrefab;
    [SerializeField] GameObject content;


    void Start()
    {
    }

    public void OnClickMineButton()
    {
        CreateChatNode(ChatRoll.MINE);
    }

    public void OnClickOthersButton()
    {
        CreateChatNode(ChatRoll.OTHERS);
    }

    private void CreateChatNode(ChatRoll roll)
    {
        id++;
        string str = chatInputField.text;
        chatInputField.text = "";
        ChatData data = new ChatData(id, roll, str);
// ***** 開始 *****
        var chatNode = Instantiate<GameObject>(chatNodePrefab, content.transform, false);
        chatNode.GetComponent<ChatNode>().Init(data);
// ***** 終了 *****
    }
}


public enum ChatRoll
{
    MINE,
    OTHERS,
}

public class ChatData
{
    public int id;
    public ChatRoll roll;
    public string body;

    public ChatData(int id, ChatRoll roll, string body)
    {
        this.id = id;
        this.roll = roll;
        this.body = body;
    }
}

ChatSystem.cs
InstantiateでChatNodePrefabを作成します。
Instantiate第2引数は親オブジェクトであるContentを指定。
Instantiate第3引数()をfalseにすると親オブジェクトの位置に生成されます。

その後、ChatNodeのInitメソッドを呼び出します。

実際に再生して試してみましょう。

f:id:hiyotama:20190822152802p:plain
文字入力しMINEボタンを押すと猫が喋る。
f:id:hiyotama:20190822152827p:plain
OTHERSボタンを押すと犬が喋る。

ChatBoardのMAX Widthを制限する

最後にChatBoardのMAX Widthを制限する方法を書いておきます。
画面幅の50%を超えたら50%に制限します。

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


public class ChatNode : MonoBehaviour
{
    private ChatData chatData;

    [SerializeField] LayoutGroup layoutGroup;
    [SerializeField] Image chatBoard;
    [SerializeField] Text chatText;
    [SerializeField] Image chatIcon;
    [SerializeField] Sprite mineSprite;
    [SerializeField] Sprite othersSprite;


    public void Init(ChatData data)
    {
        chatData = data;
        chatText.text = chatData.body;

        if (chatData.roll == ChatRoll.MINE)
        {
            chatIcon.sprite = mineSprite;
            layoutGroup.childAlignment = TextAnchor.MiddleRight;
            chatBoard.color = new Color(0f, 1f, 0.1f);
            chatIcon.transform.SetSiblingIndex(1);
        }
        else if (chatData.roll == ChatRoll.OTHERS)
        {
            chatIcon.sprite = othersSprite;
            layoutGroup.childAlignment = TextAnchor.MiddleLeft;
            chatBoard.color = new Color(1f, 1f, 1f);
            chatIcon.transform.SetSiblingIndex(0);
        }
// ***** 開始 *****
        StartCoroutine(CheckTextSize());
// ***** 終了 *****
    }

// ***** 開始 *****
    private IEnumerator CheckTextSize()
    {
        yield return new WaitForEndOfFrame();
        if (chatBoard.rectTransform.sizeDelta.x > this.GetComponent<RectTransform>().sizeDelta.x * 0.5f)
        {
            chatBoard.GetComponent<LayoutElement>().preferredWidth = this.GetComponent<RectTransform>().sizeDelta.x * 0.5f;
        }
    }
// ***** 終了 *****
}

ChatSystem.cs

UnityのAuto Layoutシステムによる UIパーツのサイズ変更は
フレームの最後に実行されます。
なのでWaitForEndOfFrameの後でChatBoardのpreferredWidthを変更します。

以上でLINEっぽいチャットのチュートリアル終了です。
ありがとうございました〜