Create Scriptable Objects with Unity

The following blog post, unless otherwise noted, was written by a member of Gamasutras community.
The thoughts and opinions expressed is those of the writer and not Gamasutra or its parent company.The blog post is written by the members of the Unity Creative Objects in Unity.This blog post is written by Gamasutras community.

目的

このブログ記事の主な目的は、UnityのScriptableObjectについてのアイデアを与えることです。

Scriptableオブジェクトとは?

ScriptableObjectとモノハビアのクラスの違いは?

このブログでScriptableObjectについて説明します。

Unity APIドキュメントによると、

“ScriptableObject is a class you can derive from if you want to create objects that are not needed to attach to game objects.”

Confused..?

ご存知のように、Unityではすべてがオブジェクトです。

Type of Object

Monobehaviours はオブジェクトの一つです。

ゲームオブジェクト:シーン内で、変形して移動することができます。

ScriptableObject はオブジェクトの一種ですが、データを格納することだけができます。

したがって、実際のゲームには関与しません。

ScriptableObjectの長所:

  1. Unityに組み込まれている
    • Unityによって非常によくメンテナンスされています。
    • Unityインスペクタで非常に簡単に操作することができます。
    • それを更新して、ゲームの要件に従って保存できます。
  2. ランタイム中に保存可能
    • ランタイム中に何かを変更すると、実際にそれを覚えています。
  3. Internal Solution
    • ゲームの実行中にデータを取得しようとする場合、より登場する外部ファイルのパースについて心配する必要はありません。
  4. Large amounts of Data
    • ScriptableObject の内部に数百万の整数を保存可能です。
  5. Structure への追加
    • スクリプト可能なオブジェクトを構築して、いくつかのインスタンスを作成し、「moveSpeed」の新しい設定が必要であるとか、必要な追加変数に気が付くと、変数を中断することがありません。

ScriptableObject の短所:

  1. スクリプトのエディターが必要
    • スクリプトからアセットを作成する場合、それについて少し知っておく必要があります。
    • しかし、チーム ベースのソリューションのように、誰かにファイルを送信して編集させたい場合、それは機能しません。
  2. 一度デプロイすると保存できない
    • ゲームを構築すると、ランタイム中に保存できないため、これはプレイヤーのデータの保存用ソリューションではないことになります。

ゲームで ScriptableObject を使用する方法を理解するために、1 つの例を挙げてみましょう。

これをどのように行うか、何かアイデアはありますか?

ああ、10種類の敵のプレハブを10個作り、それを各レベルに割り当てることを考えるかもしれません。

「1 つの敵オブジェクトに 4 つの変数と Update() 関数があり、4 MB のメモリを使用するとすると、10 レベルの敵には 40 MB のメモリ量が必要になるからです」

そこで、解決策を紹介します。 ScriptableObjectを使用して、敵オブジェクトのデータを保存します。

それでは、ScriptableObjectを使用してミニゲームを開発しましょう。 (最初に考えたように、敵ごとに異なるプレハブを作成し、各レベルに割り当てます;) )

ステップ 1

  • 空の GameObject を作成し、名前を Enemy.

ステップ 2

  • C#スクリプトを作成して名前を EnemyMove

EnemyMove に次のコードを記述する。cs

public class EnemyMove : MonoBehaviour {#region PUBLIC_VARIABLESpublic string name;public int moveSpeed;public Color color;public string colorName; public SpriteRenderer spriterendere;#endregion#region PRIVATE_VARIABLESprivate float speed;Vector3 newPosition;#endregion#region UNITY_CALLBACKSvoid Update () {ChangeSpeed();gameObject.name = name;spriterendere.color = color;newPosition=transform.position;newPosition.y = Mathf.Sin (Time.time) * speed;transform.position = newPosition;}#endregion#region PROVATE_METHODSprivate void ChangeSpeed(){speed = Mathf.MoveTowards (speed,moveSpeed,Time.deltaTime);}#endregion}

ステップ3

  • 空のGameObject(Enemy)に代入する。
  • EnemyMoveスクリプトには3つのパブリック変数があります。
  • ゲームに多くの敵GameObjectがあり、enemyMoveスクリプトがある場合、多くのメモリを使用します。

Step 4

  • Monobehaviourの代わりにScriptableObjectを継承したEnemyData.
  • という名前のC#スクリプトを作成する。
    public class EnemyData : ScriptableObject {#region PUBLIC_VERIABLEpublic string name;public int moveSpeed;public Color color;public string colorName; #endregion}

    ステップ5

    • 先に作成したEnemyMoveの内部を変更します。
    • EnemyDataの参照先であるパブリック変数dataを作成し、EnemyDataにすでにあるパブリック変数dataを削除します。
      public class EnemyMove : MonoBehaviour {#region PUBLIC_VARIABLESpublic EnemyData data;public SpriteRenderer spriterendere;#endregion#region PRIVATE_VARIABLESprivate float speed;Vector3 newPosition;#endregion#region UNITY_CALLBACKSvoid Update () {ChangeSpeed();gameObject.name = name;spriterendere.color = data.color;newPosition=transform.position;newPosition.y = Mathf.Sin (Time.time) * speed;transform.position = newPosition;}#endregion#region PROVATE_METHODSprivate void ChangeSpeed(){speed=Mathf.MoveTowards (speed,data.moveSpeed,Time.deltaTime);}#endregion}

      これで、Enemy GameObjectのインスペクタに’Data’変数が表示されるのがわかります。

      Enemymove Inspector window

      Follow me…

      Step 1

      • EnemyData.Data に1行追加する。
      public class EnemyData : ScriptableObject {#region PUBLIC_VERIABLEpublic string name;public int moveSpeed;public Color color;public string colorName; #endregion}

      Step 2

      • Create one folder Game data and do following

      Assets enemydata menu item

      Step 3

      • Name it as you like…を追加してください。
      • これで、EnemyData内のすべての変数がインスペクタウィンドウに表示され、ここで変数の値を変更することができます。

      enemy data inspector window

      ステップ4

      • これを「EnemyMove」スクリプトに代入する

      assign enemy data to enemymove inspector window

      これですべての回答はわかったのではないでしょうか?

      結論

      • ScriptableObject は、データをより大きなチャンクに分割できるという事実のために本当に良いものです。

コメントを残す

メールアドレスが公開されることはありません。