Events

Handle user interactions with React-style event props.

Click Events

<Button
    text="Click me"
    onClick={(e) => {
        console.log("Button clicked!")
        console.log("Position:", e.x, e.y)
    }}
/>

Pointer Events

Track pointer (mouse/touch) interactions:

<View
    style={{ width: 200, height: 200, backgroundColor: "#333" }}
    onPointerDown={(e) => console.log("Pointer down", e.x, e.y)}
    onPointerUp={(e) => console.log("Pointer up")}
    onPointerMove={(e) => console.log("Pointer move", e.x, e.y)}
    onPointerEnter={(e) => console.log("Pointer entered")}
    onPointerLeave={(e) => console.log("Pointer left")}
>
    <Label text="Hover and click me" />
</View>

Focus Events

<TextField
    placeholder="Type here..."
    onFocus={(e) => console.log("Focused")}
    onBlur={(e) => console.log("Lost focus")}
/>

Change Events

For input elements:

function TextInput() {
    const [value, setValue] = useState("")

    return (
        <TextField
            value={value}
            onChange={(e) => setValue(e.value)}
            placeholder="Enter text..."
        />
    )
}
function ToggleSwitch() {
    const [enabled, setEnabled] = useState(false)

    return (
        <Toggle
            value={enabled}
            onChange={(e) => setEnabled(e.value)}
            label="Enable feature"
        />
    )
}
function VolumeSlider() {
    const [volume, setVolume] = useState(50)

    return (
        <Slider
            value={volume}
            lowValue={0}
            highValue={100}
            onChange={(e) => setVolume(e.value)}
        />
    )
}

Event Object Properties

Pointer Event

PropertyTypeDescription
typestringEvent type name
xnumberPointer X position
ynumberPointer Y position
buttonnumberMouse button (0=left, 1=middle, 2=right)
pointerIdnumberUnique pointer identifier
modifiersnumberKeyboard modifiers (optional)

Mouse Event

PropertyTypeDescription
typestringEvent type name
xnumberMouse X position
ynumberMouse Y position
buttonnumberMouse button
modifiersnumberKeyboard modifiers (optional)

Change Event

PropertyTypeDescription
typestringEvent type name
valueTThe new value (type depends on control)

Keyboard Events

Handle keyboard input on focused elements:

<TextField
    onKeyDown={(e) => {
        if (e.keyCode === CS.UnityEngine.KeyCode.Return) {
            console.log("Enter pressed!")
        }
    }}
/>

Event Propagation

Events bubble up through the component tree:

<View onClick={() => console.log("Parent clicked")}>
    <Button
        text="Click"
        onClick={(e) => {
            console.log("Button clicked")
            // Event will also trigger parent's onClick
        }}
    />
</View>

To stop propagation:

<Button
    onClick={(e) => {
        e.stopPropagation()
        console.log("Only this handler runs")
    }}
/>

Drag and Drop

Implement drag behavior:

function Draggable({ children }) {
    const [pos, setPos] = useState({ x: 0, y: 0 })
    const [dragging, setDragging] = useState(false)
    const startPos = useRef({ x: 0, y: 0 })

    return (
        <View
            style={{
                position: "absolute",
                left: pos.x,
                top: pos.y,
                cursor: dragging ? "grabbing" : "grab",
            }}
            onPointerDown={(e) => {
                setDragging(true)
                startPos.current = { x: e.x - pos.x, y: e.y - pos.y }
            }}
            onPointerMove={(e) => {
                if (dragging) {
                    setPos({
                        x: e.x - startPos.current.x,
                        y: e.y - startPos.current.y,
                    })
                }
            }}
            onPointerUp={() => setDragging(false)}
            onPointerLeave={() => setDragging(false)}
        >
            {children}
        </View>
    )
}

Global Input

For game input that isn't tied to UI elements, use Unity's Input system:

function useInput() {
    const [keys, setKeys] = useState({ w: false, a: false, s: false, d: false })

    useEffect(() => {
        function checkInput() {
            setKeys({
                w: CS.UnityEngine.Input.GetKey(CS.UnityEngine.KeyCode.W),
                a: CS.UnityEngine.Input.GetKey(CS.UnityEngine.KeyCode.A),
                s: CS.UnityEngine.Input.GetKey(CS.UnityEngine.KeyCode.S),
                d: CS.UnityEngine.Input.GetKey(CS.UnityEngine.KeyCode.D),
            })
            requestAnimationFrame(checkInput)
        }
        const id = requestAnimationFrame(checkInput)
        return () => cancelAnimationFrame(id)
    }, [])

    return keys
}

Mouse Events

For mouse-specific interactions (separate from pointer events):

<View
    onMouseDown={(e) => console.log("Mouse down", e.button)}
    onMouseUp={(e) => console.log("Mouse up")}
    onMouseMove={(e) => console.log("Mouse move", e.x, e.y)}
    onMouseEnter={(e) => console.log("Mouse entered")}
    onMouseLeave={(e) => console.log("Mouse left")}
    onMouseOver={(e) => console.log("Mouse over")}
    onMouseOut={(e) => console.log("Mouse out")}
    onWheel={(e) => console.log("Wheel delta", e.delta.y)}
    onContextClick={(e) => console.log("Right-click menu")}
>
    <Label text="Mouse interactions" />
</View>

Geometry Events

Detect when an element's size or position changes:

<View
    onGeometryChanged={(e) => {
        console.log("Old rect:", e.oldRect)
        console.log("New rect:", e.newRect)
    }}
>
    <Label text="Resizable content" />
</View>

Transition Events

Monitor USS transition animations:

<View
    className="animated"
    onTransitionStart={(e) => console.log("Transition started:", e.styleProperty)}
    onTransitionEnd={(e) => console.log("Transition ended:", e.styleProperty)}
    onTransitionRun={(e) => console.log("Transition running")}
    onTransitionCancel={(e) => console.log("Transition cancelled")}
>
    <Label text="Animated element" />
</View>

Handle gamepad/keyboard UI navigation:

<View
    onNavigationMove={(e) => console.log("Navigation direction:", e.direction)}
    onNavigationSubmit={(e) => console.log("Navigation submit")}
    onNavigationCancel={(e) => console.log("Navigation cancel")}
>
    <Label text="Navigable element" />
</View>

Tooltip Events

<View onTooltip={() => console.log("Tooltip triggered")}>
    <Label text="Hover for tooltip" />
</View>

Event Mapping Reference

Click & Pointer

React PropUI Toolkit Event
onClickClickEvent
onPointerDownPointerDownEvent
onPointerUpPointerUpEvent
onPointerMovePointerMoveEvent
onPointerEnterPointerEnterEvent
onPointerLeavePointerLeaveEvent
onPointerCancelPointerCancelEvent
onPointerCapturePointerCaptureEvent
onPointerCaptureOutPointerCaptureOutEvent
onPointerStationaryPointerStationaryEvent

Mouse

React PropUI Toolkit Event
onMouseDownMouseDownEvent
onMouseUpMouseUpEvent
onMouseMoveMouseMoveEvent
onMouseEnterMouseEnterEvent
onMouseLeaveMouseLeaveEvent
onMouseOverMouseOverEvent
onMouseOutMouseOutEvent
onWheelWheelEvent
onContextClickContextClickEvent

Focus & Input

React PropUI Toolkit Event
onFocusFocusEvent
onBlurBlurEvent
onFocusInFocusInEvent
onFocusOutFocusOutEvent
onChangeChangeEvent<T>
onInputInputEvent
onKeyDownKeyDownEvent
onKeyUpKeyUpEvent

Drag & Drop

React PropUI Toolkit Event
onDragEnterDragEnterEvent
onDragLeaveDragLeaveEvent
onDragUpdatedDragUpdatedEvent
onDragPerformDragPerformEvent
onDragExitedDragExitedEvent

Layout & Transitions

React PropUI Toolkit Event
onGeometryChangedGeometryChangedEvent
onTransitionRunTransitionRunEvent
onTransitionStartTransitionStartEvent
onTransitionEndTransitionEndEvent
onTransitionCancelTransitionCancelEvent
React PropUI Toolkit Event
onNavigationMoveNavigationMoveEvent
onNavigationSubmitNavigationSubmitEvent
onNavigationCancelNavigationCancelEvent
onTooltipTooltipEvent

Custom Rendering

For custom drawing with onGenerateVisualContent, see Unity's Painter2D documentation. This callback provides access to Unity's GPU-accelerated vector graphics API.