Talos docs

Behaviour

Since 0.6

The base of a behaviour written as a class.

Plain text

P is the shape of its props (the script component's props); the fields a class declares take props of the same name. ts import { Behaviour, turnTowards, yawTo } from "@argus/gameplay" import type { EntityHandle } from "@argus/api" export default class Turret extends Behaviour { turnRate = 2 // rad/s; props.turnRate overrides it target: EntityHandle | null = null Start() { this.target = this.world.find("player") } Update(dt: number) { if (this.target) this.entity.yaw = turnTowards(this.entity.yaw, yawTo(this.entity, this.target), this.turnRate * dt) } OnTriggerEnter(other: EntityHandle) { if (other.hasTag("player")) this.events.emit("spotted") } }

Signature

export class Behaviour<P extends Record<string, any> = Record<string, any>> {
  constructor()
  Start?(): void
  Update?(dt: number): void
  OnPausedUpdate?(dt: number): void
  OnEnable?(): void
  OnDisable?(): void
  OnDestroy?(): void
  OnTriggerEnter?(other: EntityHandle): void
  OnTriggerExit?(other: EntityHandle): void
  OnCollisionEnter?(collision: Collision): void
  OnEvent?(event: GameEvent): void
  declare Awake?: "Awake is never called: use a field initialiser, or Start()"
  declare FixedUpdate?: "FixedUpdate is never called: Update(dt) runs every fixed 60 Hz tick, which is the fixed-step update other engines call FixedUpdate"
  declare LateUpdate?: "LateUpdate is never called: there is one fixed tick; do it in Update(dt)"
  declare OnTriggerStay?: "OnTriggerStay is never called: use OnTriggerEnter/OnTriggerExit and a field"
  declare OnCollisionStay?: "OnCollisionStay is never called: contacts report their start (OnCollisionEnter); keep a field"
  declare OnCollisionExit?: "OnCollisionExit is never called: contacts report their start (OnCollisionEnter); keep a field"
  declare update?: "a Behaviour class's hooks use the usual names: Update(dt), Start(), OnDestroy()"
  declare init?: "a Behaviour class's hooks use the usual names: Start(), or a field initialiser"
  get ctx(): Ctx<Record<string, any>, P>
  get entity(): EntityHandle
  get world(): WorldQuery
  get body(): RigidBody | null
  get controller(): Controller | null
  get input(): InputState | null
  get animator(): Animator | null
  get nav(): NavAgent | null
  get events(): EventBus
  get time(): TimeInfo
  get camera(): CameraHandle
  get audio(): AudioHandle
  get particles(): ParticlesHandle
  get labels(): LabelsHandle
  get render(): RenderHandle
  get ui(): UiHandle
  get hud(): HudHandle
  get session(): SessionHandle
  get save(): SaveHandle
  get files(): FilesHandle
  get props(): Readonly<P>
  log(message: string, data?: unknown): void
  get enabled(): boolean
  set enabled(on: boolean)
  static init(this: new () => Behaviour<any>, ctx: Ctx): void
  static update(ctx: Ctx, dt: number): void
  static pausedUpdate(ctx: Ctx, dt: number): void
  static dispose(ctx: Ctx, reason?: "detach" | "reload"): void
  static onTriggerEnter(ctx: Ctx, other: EntityHandle): void
  static onTriggerExit(ctx: Ctx, other: EntityHandle): void
  static onCollision(ctx: Ctx, collision: Collision): void
  static onEvent(ctx: Ctx, event: GameEvent): void
}

Import: import { Behaviour } from "@argus/gameplay"

Members

MemberSignatureDescription
constructorconstructor()
StartStart?(): voidOnce, at the top of the first tick after the behaviour attached (after every field initialiser).
UpdateUpdate?(dt: number): voidEvery fixed 60 Hz tick while enabled — the fixed-step update (FixedUpdate in some engines); dt is 1/60 s.
OnPausedUpdateOnPausedUpdate?(dt: number): voidEvery tick while the world is held (a pause menu, ctx.session.pause()), in place of Update.
OnEnableOnEnable?(): voidWhen the behaviour attaches or is re-enabled, and after a hot reload.
OnDisableOnDisable?(): voidWhen it is disabled, detached, or about to be hot-reloaded.
OnDestroyOnDestroy?(): voidWhen the entity (or the scene) is going. Not for a hot reload.
OnTriggerEnterOnTriggerEnter?(other: EntityHandle): voidSomething entered a trigger this entity takes part in; other is the other participant.
OnTriggerExitOnTriggerExit?(other: EntityHandle): voidThe other participant left.
OnCollisionEnterOnCollisionEnter?(collision: Collision): voidA contact started.
OnEventOnEvent?(event: GameEvent): voidAny emit, from any behaviour or the app.
Awakedeclare Awake?: "Awake is never called: use a field initialiser, or Start()"Names Behaviour never calls: declared so that writing one is a type error whose message is the fix.
FixedUpdatedeclare FixedUpdate?: "FixedUpdate is never called: Update(dt) runs every fixed 60 Hz tick, which is the fixed-step update other engines call FixedUpdate"
LateUpdatedeclare LateUpdate?: "LateUpdate is never called: there is one fixed tick; do it in Update(dt)"
OnTriggerStaydeclare OnTriggerStay?: "OnTriggerStay is never called: use OnTriggerEnter/OnTriggerExit and a field"
OnCollisionStaydeclare OnCollisionStay?: "OnCollisionStay is never called: contacts report their start (OnCollisionEnter); keep a field"
OnCollisionExitdeclare OnCollisionExit?: "OnCollisionExit is never called: contacts report their start (OnCollisionEnter); keep a field"
updatedeclare update?: "a Behaviour class's hooks use the usual names: Update(dt), Start(), OnDestroy()" · static update(ctx: Ctx, dt: number): void
initdeclare init?: "a Behaviour class's hooks use the usual names: Start(), or a field initialiser" · static init(this: new () => Behaviour<any>, ctx: Ctx): void
ctxget ctx(): Ctx<Record<string, any>, P>The whole Argus ctx, for what has no handle here.
entityget entity(): EntityHandleThis entity. Space is Argus's: position (local), worldPosition, yaw (radians), forward (-Z).
worldget world(): WorldQuery
bodyget body(): RigidBody | null
controllerget controller(): Controller | null
inputget input(): InputState | null
animatorget animator(): Animator | null
eventsget events(): EventBus
timeget time(): TimeInfo
cameraget camera(): CameraHandle
audioget audio(): AudioHandle
particlesget particles(): ParticlesHandle
labelsget labels(): LabelsHandle
renderget render(): RenderHandlectx.render: shader parameter writes (setShaderParam, setMaterialParam).
uiget ui(): UiHandle
hudget hud(): HudHandle
sessionget session(): SessionHandle
saveget save(): SaveHandle
filesget files(): FilesHandleThe project's files under data/, read-only (ctx.files).
propsget props(): Readonly<P>The script component's props, read-only (fields of the same name already hold them).
loglog(message: string, data?: unknown): voidA structured log line.
enabledget enabled(): boolean · set enabled(on: boolean)Whether Update runs. Setting it runs OnEnable / OnDisable, as in other engines.
pausedUpdatestatic pausedUpdate(ctx: Ctx, dt: number): void
disposestatic dispose(ctx: Ctx, reason?: "detach" | "reload"): void
onTriggerEnterstatic onTriggerEnter(ctx: Ctx, other: EntityHandle): void
onTriggerExitstatic onTriggerExit(ctx: Ctx, other: EntityHandle): void
onCollisionstatic onCollision(ctx: Ctx, collision: Collision): void
onEventstatic onEvent(ctx: Ctx, event: GameEvent): void