| name | f8-features-module-workflow |
| description | Use when implementing or troubleshooting Module feature workflows — ModuleCenter lifecycle, module creation, StaticModule, ActivityModule, update attributes in F8Framework. |
Module Feature Workflow
⚠️ IMPORTANT: Before using this feature, you MUST formally initialize F8Framework in the launch sequence. Ensure ModuleCenter.Initialize(this); has run first before any ModuleCenter.CreateModule<T>() call.
Use this skill when
- The task is about creating custom modules, managing module lifecycle, or using StaticModule / ActivityModule.
- The user asks about ModuleCenter, module initialization order, or update loops.
Path resolution
- Prefer project source at Assets/F8Framework.
- For usage docs, read: Assets/F8Framework/Tests/Module/README.md
Sources of truth
- Runtime module: Assets/F8Framework/Runtime/Module
- Editor module: Assets/F8Framework/Editor/Module
- Test docs: Assets/F8Framework/Tests/Module
Key classes and interfaces
| Class | Role |
|---|
ModuleCenter | Core lifecycle management. Initialize, Create, Get, Destroy modules. |
ModuleSingleton<T> | Non-MonoBehaviour module base with singleton. |
ModuleSingletonMono<T> | MonoBehaviour module base with singleton. |
IModule | Module interface: OnInit, OnUpdate, OnLateUpdate, OnFixedUpdate, OnTermination. |
StaticModule | Auto-initialized static modules with OnEnterGame/OnQuitGame. |
ActivityModule | Auto-discovered activity modules with unlock/visible/open state evaluation and state change callbacks. |
API quick reference
ModuleCenter usage
ModuleCenter.Initialize(this);
ModuleCenter.CreateModule<TimerManager>(100);
ModuleCenter.GetModule<TimerManager>().GetServerTime();
TimerManager.Instance.GetServerTime();
Custom module template
[UpdateRefresh]
[LateUpdateRefresh]
[FixedUpdateRefresh]
public class MyModule : ModuleSingleton<MyModule>, IModule
{
public void OnInit(object createParam)
{
}
public void OnUpdate() { }
public void OnLateUpdate() { }
public void OnFixedUpdate() { }
public void OnTermination()
{
Destroy(gameObject);
}
}
StaticModule template
public class MyStaticModule : StaticModule
{
public static MyStaticModule Instance => GetInstance<MyStaticModule>();
protected override void Init() { }
public override void OnEnterGame() { }
public override void OnQuitGame() { }
}
StaticModule.GetStaticModule();
StaticModule.GetStaticModuleByType(typeof(MyStaticModule));
MyStaticModule.Instance.OnEnterGame();
foreach (var center in StaticModule.GetStaticModule())
{
center.Value.OnEnterGame();
}
ActivityModule template
public class MyActivityModule : ActivityModule
{
public static MyActivityModule Instance => GetInstance<MyActivityModule>();
protected override void Init() { }
public override void OnEnterGame() { }
public override void OnQuitGame() { }
protected override bool EvaluateUnlockedCore() => true;
protected override bool EvaluateVisibleCore(bool isUnlocked) => isUnlocked;
protected override bool EvaluateOpenCore(bool isUnlocked) => isUnlocked;
protected override void OnStateChanged(ActivityModuleState previousState, ActivityModuleState currentState) { }
}
ActivityModule.GetActivityModule<MyActivityModule>();
ActivityModule.GetActivityModules();
ActivityModule.GetActivityModuleTypes();
ActivityModule.RefreshAllModules();
Update attributes
[UpdateRefresh] — Enable OnUpdate loop
[LateUpdateRefresh] — Enable OnLateUpdate loop
[FixedUpdateRefresh] — Enable OnFixedUpdate loop
Module creation (right-click menu)
Right-click in Project → F8 Module Center → Create Module / ModuleMono / StaticModule / ActivityModule template.
Workflow
- Decide module type:
ModuleSingleton<T> (pure C#) or ModuleSingletonMono<T> (MonoBehaviour).
- Implement
IModule interface.
- Add update attributes as needed.
- Create module via
ModuleCenter.CreateModule<T>() with priority.
- For auto-initialized global modules, use
StaticModule pattern.
- For activity gating and state-driven modules, use
ActivityModule pattern.
- Use right-click context menu to generate template files.
Module types comparison
| Type | Base Class | MonoBehaviour | Init | Update | Usage |
|---|
| Game Module | ModuleSingleton<T> | No | Lazy via CreateModule | Via attributes | Most modules |
| Game Module Mono | ModuleSingletonMono<T> | Yes | Lazy via CreateModule | Via attributes | Needs coroutines |
| Static Module | StaticModule | No | Auto on game start | Manual | Global utilities |
| Activity Module | ActivityModule | No | Auto-discovered and initialized | State refresh via RefreshAllModules | Unlock/show/open activity logic |
Common error handling
| Error | Cause | Solution |
|---|
| Module is null | Not created via CreateModule | Create before accessing |
| Update not running | Missing [UpdateRefresh] attribute | Add appropriate attribute |
| Module init order issue | Dependency module not yet created | Adjust priority or creation order |
Cross-module dependencies
- Foundation: GameLauncher uses ModuleCenter to create all framework modules.
Output checklist
- Module type selected (Singleton / SingletonMono / StaticModule / ActivityModule).
- Lifecycle methods implemented.
- Update attributes applied.
- Validation status and remaining risks.