-
Notifications
You must be signed in to change notification settings - Fork 12
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 Event
inMagic 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 aboveEvent
is 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
AddListener
to subscribe and unsubscribe
public EventNoParam playerAttackEvent;
private void OnEnable()
{
playerAttackEvent.AddListener(HandleAttack);
}
private void OnDisable()
{
playerAttackEvent.RemoveListener(HandleAttack);
}
void HandleAttack()
{
// Attack
}
- Use
OnRaised
to 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 Variable
inSunflower Control Panel
- You can create Scriptable Variable with bool, float, int, string, object, Rect, Short Double, Transform, Vector3 values ...
-
Scriptable Variables
also has aRaise Event
capability similar toScriptable Events
. it can also have the same value as regular variables
-
Initialize Value
: Initialize default value for scriptable variable -
Is Set Data
: Withtrue
then 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 Variable
is the runtime value -
Is Save Data
: Withtrue
the value will be saved to the file immediately. Otherwise, it will not be saved -
Is Raise Event
: Withtrue
then any change to the value ofScriptable Variable
will 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;
}