Scriptable Architecture - VirtueSky/sunflower GitHub Wiki
What
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
Use
Scriptable Event
Create Scriptable Event
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,...)
Raise Events
You can raise events by code or by the inspector (Enable Debug Field > button Raise Event)
Raise by code
public class Player : MonoBehaviour
{
public EventNoParam playerAttackEvent;
public void Attack()
{
playerAttackEvent.Raise();
}
}
Raise by inspector (button Raise Event)
- Note: It helps you find errors faster when encountering bugs and only works editor playing
Listener Events
You can listener event by component Event Listener or by code
Listener by component
BindingUNTIL_DISABLE: the event is subscribed whenOnEnable()and unsubscribed whenOnDisable()UNTIL_DESTROY: the event is subscribed whenAwake()and unsubscribed whenOnDestroy()
Event Response DataEvent: Drag scriptable event hereResponse(): 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)
Listener by code
- 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
}
Scriptable Variable
Create Scriptable Variable
- 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
Change value - Raise Event
Initialize Value: Initialize default value for scriptable variableIs 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 valueIs Save Data: Withtruethe value will be saved to the file immediately. Otherwise, it will not be savedIs 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 Variable
- 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
Scriptable Event-Result
- 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
Raise Event
public StringEventBoolResult isSetupSkinSuccessEvent;
private bool isSetupSuccess;
void SetupSkin()
{
isSetupSuccess = isSetupSkinSuccessEvent.Raise("Skin_2");
}
Listener Event
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;
}