Files
pelpanagiotis a7c53a08a0 Initial commit: Unity Needle AR Menu project with MenuScene and SampleScene web apps
Add root .gitignore for Unity Library/Temp/Logs, IDE folders, and node_modules.
Include Assets, Needle TypeScript (MenuController, asset picker, WebXR), and project configuration.

Made-with: Cursor
2026-04-19 22:41:05 +03:00

88 lines
3.0 KiB
TypeScript

/**
* Needle Engine — Annotated Component Template
*
* Copy this file and rename the class to get started.
* Remove any lifecycle methods you don't need.
*/
import { Behaviour, serializable, registerType, WaitForSeconds } from "@needle-tools/engine";
import { Object3D } from "three";
// @registerType — required for GLB deserialization.
// Without this, the component won't be instantiated from GLB.
@registerType
export class MyComponent extends Behaviour {
// ---------------------------------------------------------------------------
// Serialized Fields
// These values are set in the Unity Inspector and baked into the GLB.
// ---------------------------------------------------------------------------
/** A simple number field — set in Unity Inspector */
@serializable()
speed: number = 1;
/** A reference to another object in the scene */
@serializable(Object3D)
target?: Object3D;
// ---------------------------------------------------------------------------
// Private State
// ---------------------------------------------------------------------------
private _elapsed: number = 0;
// ---------------------------------------------------------------------------
// Lifecycle
// ---------------------------------------------------------------------------
awake() {
// Called once when the component is instantiated (even if disabled).
// Use for initialization that doesn't depend on other components being ready.
}
start() {
// Called once on the first frame the component is active.
// Other components are initialized by now — safe to call getComponent() etc.
console.log(`${this.name} started on ${this.gameObject.name}`);
}
update() {
// Called every frame. Use this.context.time.deltaTime for frame-rate independence.
this._elapsed += this.context.time.deltaTime;
// Example: rotate this object
this.gameObject.rotation.y += this.speed * this.context.time.deltaTime;
}
onEnable() {
// Called each time this component becomes active.
}
onDisable() {
// Called each time this component becomes inactive.
}
onDestroy() {
// Called when this component/object is destroyed (via destroy(obj)).
// Note: NOT called by removeComponent() — only by the standalone destroy() function.
// Clean up event listeners, timers, or external references here.
}
// ---------------------------------------------------------------------------
// Physics callbacks (require a Rapier Collider on this GameObject)
// ---------------------------------------------------------------------------
// onCollisionEnter(col: Collision) { }
// onTriggerEnter(col: Collision) { }
// ---------------------------------------------------------------------------
// Example: coroutine
// ---------------------------------------------------------------------------
private *exampleCoroutine() {
// yield; // wait one frame
// yield WaitForSeconds(1); // wait 1 second
}
}