Easy Chapter Generator
EnglishEspañol

Aggregate independent named signals

MultiActionObjective tracks a list of named branches and evaluates them as one condition. Use it when several independent systems must all report readiness, or when any configured minimum is sufficient. Typical branches are POWER, NAVIGATION, and COMMS, each activated from its own UnityEvent or project callback.

Do not use branches to represent ordered tasks that deserve their own start and completion actions. A branch has active/inactive state, not the full lifecycle of an Ordered Objective.

Completion and branch fields

FieldMeaningConstraint
Completion ModeAllBranchesActive or MinimumBranchesActiveAll requires every non-null branch; Minimum uses a clamped count
Required Branch CountMinimum active branchesRuntime clamps from 1 to total count
Complete AutomaticallyRequests Ordered Objective completion when satisfiedDisable for signal-only use
IdentifierStable branch key for string APIMust be unique and non-empty for reliable lookup
Display Name / DescriptionAuthoring contextNot used for lookup
Deactivate Automatically / DelaySchedules branch deactivation after activationUses scaled WaitForSeconds
On Activated / On DeactivatedRuns only when state actually changesRepeated activation does not replay On Activated

Automatic completion versus signal-only

With Complete Automatically enabled, satisfying the branch rule calls TryComplete(). The internal condition is marked met and On Condition Met fires only if the active Chapter accepts that request. An early condition therefore remains eligible to be evaluated again after the link becomes active.

With automation disabled, the first satisfied evaluation marks IsConditionMet and invokes On Condition Met without completing progression. Connect that event to project behavior or call completion explicitly. Once marked, further branch changes do not invoke it again until Reset.

Branch API and invalid calls

Index and string overloads exist for ActivateBranch, DeactivateBranch, ToggleBranch, ScheduleBranchDeactivation, and ResetBranch. ActivateBranchTemporarily accepts a custom delay. The TryActivateBranch and TryDeactivateBranch variants report a real state change. FindBranchIndex returns -1 for an empty or missing ID; invalid indices and IDs are safe no-ops or false results.

CountActiveBranches, ActiveBranchCount, TotalBranchCount, and IsCompletionConditionMet() support diagnostics. Prefer stable string IDs in integrations; indices change when an author reorders the list.

Timers, reset, and a complete example

Activating a branch cancels its previous deactivation coroutine, applies active state, invokes On Activated only on change, optionally schedules automatic deactivation, then evaluates completion. Accepted state changes and completion are idempotent: repeating the same signal does not replay its event or complete twice. Reset stops every pending timer, clears every branch, clears the condition flag, and resets the base completion flag. Resetting one active branch invokes its deactivation event; resetting the whole Objective clears branches without replaying those events.

  1. 1
    Create POWER, NAVIGATION, and COMMS with unique identifiers.
  2. 2
    Choose Minimum Branches Active, set count to 2, and keep automatic completion enabled.
  3. 3
    Bind each subsystem's confirmed-ready event to ActivateBranch(string) with its exact ID.
  4. 4
    Activate one branch twice: the second call must not replay its activation event. Activate a second branch: the linked Objective should complete once.
  5. 5
    Reset and confirm counts return to zero and all pending timers are cancelled.

Validation and troubleshooting

Condition is true but progression does not advance

Check Complete Automatically, Objective Link, and whether the linked row is currently Active.

A temporary branch never turns off

Time scale may be zero because branch timers use scaled time. Also confirm another call did not replace the timer.

String calls do nothing

Use the branch Identifier, not Display Name, and match case exactly.

Minimum behaves unexpectedly

Runtime clamps the requested count to 1..TotalBranchCount; an empty list can never satisfy the condition.