気軽に遊べるミニゲームを制作しています

ブラウザゲームまとめ

【Unity】ScriptableObjectを使ってみた

Unity2D

ScriptableObjectって何

ScriptableObjectはデータを一括管理に便利なものらしいです。

Unityに搭載されている機能でせっかくなので、使ってみました。

調べたところによると以下のようなメリットがあるそうです。

・カテゴライズされたデータ(食べ物とか、武器とか)のデータが一括管理できるからレベル調整が簡単

・ゲーム実行時にメモリを節約できる

・ゲーム実行中もパラメータの保存結果が保存される

ただ、使用上の注意として、基本的にゲーム進行中に変化するものには使えないそうです。

1. ScriptableObjectを作成する

早速やっていきます。

まず、このScriptableObjectを使うためにはそれを作るためのプログラムが必要なので、作っていきます。

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

[Serializable]
public class DataBase
{
    public string itemName;
    public int atk;
    public Sprite icon;
}

[CreateAssetMenu(fileName = "Sword", menuName = "SwordData", order = 1)]
public class SwordData : ScriptableObject
{
    public List<DataBase> dataList;
}

スクリプト内のSerializableって何って方は以下の記事を参照してください。

いつも作成するスクリプトと違う点がいくつかあります。

まず、最初にclass名の前にCreateAssetMenuという記載を追加しています。

これは何かというとAssetフォルダ内で右クリックからオブジェクトを作成したり、スクリプトを作成したりすると思いますが、これを書くことでその中にScriptableObjectsを作成するメニューを追加することができます。

詳しくは以下のUnity リファレンスを参照ください。
https://docs.unity3d.com/ja/2018.4/ScriptReference/CreateAssetMenuAttribute.html

もう一つ違う点としては、public class SwordData: ScriptableObject

通常Monobehaviorを継承していますが、ScriptableObjectを継承する必要があります。

それでは実際にオブジェクトを作成して、アイテムデータを作成していきます。

作成したScriptableObjectメニューからオブジェクトを作成します。

変数部分にアイテムデータを入力します。

2. 作成したScriptableObjectのデータを使う

前準備:シーン上にテキストとボタンを配置しました

ゲームスタート時にインベントリ内のデータをとってくるような処理を作りたいと思います。

GameManagerという名のオブジェクトをゲームシーン内に作成します。

つづいて、スタート時にデータを取得するスクリプトを作成

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

public class GameManager : MonoBehaviour
{
    public SwordData swordData;

    public Text itemName;
    public Text atk;
    public Button itemBtn;
    private Sprite btnImage;

    private void Start()
    {
        itemName.text = swordData.dataList[0].itemName;
        atk.text = swordData.dataList[0].atk.ToString();
        GetBtnIcon();
        itemBtn.GetComponent<Image>().sprite = btnImage;
    }

    private void GetBtnIcon()
    {
        btnImage = swordData.dataList[0].icon;
    }
}

オブジェクトをアタッチします。

ScriptableObjectのデータを読み出すことができました。

コメント

タイトルとURLをコピーしました