Conversation Scriptable Objects

Conversation Scriptable Objects

Scriptable Objects provide an easy way to create and populate custom data elements. In this course, will use scriptable objects to store dialog data and inventory items.

In the image below, we've created a ConversationList scriptableObject, to permanently store the data associated with a Conversation. ScriptableObjects are stored as project assets. The DialogManager class can be re-used within and across scenes with different instances of ConversationList data.

There are several steps required when creating a new type of scriptable object. Detailed example provided below using our Dialog Manager example:

Overview of Conversation ScriptableObject

  • Define a custom class (or struct) that has variables for each of the items you'll have associated with each scriptable object. This class must be defined using the [System.Serializable]attribute: See details in full code below. We used this with the SimpleDialog.cs script

  • Define a custom class that inherits from the Scriptable Object class. See details in full code below.

  • Define a collection data-structure, within this class the to hold a collection of the above defined composite elements. This is code within ConversationList class.

    • public List<ConversationEntry> Conversation

Any class that inherits from ScriptableObject will now show up as an option in the Project Assets Menu:

Class ConversationEntry ( review )

We will use the same ConversationEntry class that was used with the SimpleDialog.cs.

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

[System.Serializable]
public class ConversationEntry
{
    public string speakerName;

    [TextArea]
    public string dialogTxt;

    public Sprite speakerImg;
}

Class ConversationList - ScriptableObject

Create an instance of this C# script in your Unity project, paste the code below into the script within Visual Studio. Notice this class inherits from ScriptableObject, it does not inherit from Monobehaviour, so it can not be added directly to a gameObject within a scene. To use: A ConversationList variable must be created within a custom script like DialogManager, then it can be populated within the inspector with a pre-created instance of a ConversationList scriptable object.

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

public class ConversationList : ScriptableObject
{
    public List<ConversationEntry> Conversation;
    public string nextPanelName;   //can specify a next panel to open
}

Using the ConversationList

Use in DialogManager Class

Use as a public object-reference variable in a custom class, like DialogManager, that inherits from MonoBehaviour: The scriptable object instance will be connected in the inspector panel.

public class DialogManager : MonoBehaviour {

     public ConversationList convList; //attach scriptable object in Inspector

     //more class definition code below

Create a ConversationList Asset

To create an instance of a Conversation asset, we right click in the project panel, or right click on the assets folder and select the bottom-most menu option: create -> ScriptableObject, where our custom asset: Conversation, now shows up as an option at the bottom of the menu. After clicking on Conversation, we now have a new item in our Assets panel, we should give it a unique name so we can reference it in our code. I've named the example one: ConversationList_CatScene1.

Select ScriptableObject Instance in Inspector

The image below shows that the public ConversationList variable: convList has been set in the inspector by selecting the circle-icon to the right of the ConvList item

Last updated