-
Notifications
You must be signed in to change notification settings - Fork 15
Scriptable Architecture
VirtueSky edited this page Sep 4, 2024
·
21 revisions
Scriptable Objects are an immensely powerful yet often underutilized feature of Unity. Learn how to get the most out of this versatile data structure and build more extensible systems and data patterns.
Introductory video about Game Architecture with Scriptable Objects

You can create Scriptable Event by 3 option
- Option 1: via menu
Create>Sunflower>Scriptable>Event

- Option 2: menu item
Sunflower>Scriptable>Create Event

- Option 3: Open tab
Scriptable EventinMagic Panel

- Scriptable Event no parameter

- Scriptable Event has parameter (int, float, string, bool, vector3,...)

You can raise events by code or by the inspector (Enable Debug Field > button Raise Event)
public class Player : MonoBehaviour
{
public EventNoParam playerAttackEvent;
public void Attack()
{
playerAttackEvent.Raise();
}
}- Note: It helps you find errors faster when encountering bugs and only works editor playing

You can listener event by component Event Listener or by code

-
Binding-
UNTIL_DISABLE: the event is subscribed whenOnEnable()and unsubscribed whenOnDisable() -
UNTIL_DESTROY: the event is subscribed whenAwake()and unsubscribed whenOnDestroy()
-
-
Event Response Data-
Event: Drag scriptable event here -
Response(): Response() works similarly to a button'sOnClick, When the aboveEventis raised, the functions embedded inResponse()will be called
-
-
Raise&valueDebug: Similar to using raise event in inspector scriptable event, it helps you find errors faster when encountering bugs (it only works editor playing)
- Use
AddListenerto subscribe and unsubscribe
public EventNoParam playerAttackEvent;
private void OnEnable()
{
playerAttackEvent.AddListener(HandleAttack);
}
private void OnDisable()
{
playerAttackEvent.RemoveListener(HandleAttack);
}
void HandleAttack()
{
// Attack
}- Use
OnRaisedto subscribe and unsubscribe
public EventNoParam playerAttackEvent;
private void OnEnable()
{
playerAttackEvent.OnRaised += HandleAttack;
}
private void OnDisable()
{
playerAttackEvent.OnRaised -= HandleAttack;
}
void HandleAttack()
{
// Attack
}- Option 1: via menu
Create>Sunflower>Scriptable>Variables - Option 2: menu item
Sunflower>Scriptable>Create Variable - Option 3: Open tab
Scriptable VariableinSunflower Control Panel - You can create Scriptable Variable with bool, float, int, string, object, Rect, Short Double, Transform, Vector3 values ...

-
Scriptable Variablesalso has aRaise Eventcapability similar toScriptable Events. it can also have the same value as regular variables
-
Initialize Value: Initialize default value for scriptable variable -
Is Set Data: Withtruethen change the value set in the dictionary, the value will automatically be saved to the file when pausing the game or exiting the game. Otherwise, it will not be installed, now the used value ofScriptable Variableis the runtime value -
Is Save Data: Withtruethe value will be saved to the file immediately. Otherwise, it will not be saved -
Is Raise Event: Withtruethen any change to the value ofScriptable Variablewill beRaise Event - Change value by code
public StringVariable skinName;
void ChangeSkinName()
{
skinName.Value = "skin_2";
}- Listener by code
public StringVariable skinName;
private void OnEnable()
{
skinName.AddListener(HandleChangeSkin);
}
private void OnDisable()
{
skinName.RemoveListener(HandleChangeSkin);
}
void HandleChangeSkin(string skinName)
{
// handel skin
}or
public StringVariable skinName;
private void OnEnable()
{
skinName.OnRaised += HandleChangeSkin;
}
private void OnDisable()
{
skinName.OnRaised -= HandleChangeSkin;
}
void HandleChangeSkin(string skinName)
{
// handel skin
}- Listener by component
Similar to Scriptable Event

- The way to create and use is similar to Scriptable Event, however it supports returning a value when Raised
- Note: Scriptable Event-Result is only listened to by code
public StringEventBoolResult isSetupSkinSuccessEvent;
private bool isSetupSuccess;
void SetupSkin()
{
isSetupSuccess = isSetupSkinSuccessEvent.Raise("Skin_2");
}public StringEventBoolResult isSetupSkinSuccessEvent;
private bool isSetupSuccess;
private void OnEnable()
{
isSetupSkinSuccessEvent.AddListener(HandleSetupSkin);
}
private void OnDisable()
{
isSetupSkinSuccessEvent.RemoveListener(HandleSetupSkin);
}
bool HandleSetupSkin(string skinName)
{
//Handle Setup Skin
return isSetupSuccess;
}or
public StringEventBoolResult isSetupSkinSuccessEvent;
private bool isSetupSuccess;
private void OnEnable()
{
isSetupSkinSuccessEvent.OnRaised += HandleSetupSkin;
}
private void OnDisable()
{
isSetupSkinSuccessEvent.OnRaised -= HandleSetupSkin;
}
bool HandleSetupSkin(string skinName)
{
//Handle Setup Skin
return isSetupSuccess;
}