"use client"; import { useRef, useState } from "react"; import { useFrame, useThree } from "@react-three/fiber"; import { useGLTF } from "@react-three/drei"; import * as THREE from "three"; import { useEditorStore } from "@/lib/store"; interface GameCharacterProps { position?: [number, number, number] | null; rotation?: [number, number, number] | null; scale?: [number, number, number] | null; castShadow?: boolean | null; receiveShadow?: boolean | null; modelUrl: string; role?: string | null; physics?: { mass?: number | null; isStatic?: boolean | null; restitution?: number | null; friction?: number | null; colliderType?: string | null; } | null; objectId?: string | null; } export function GameCharacter({ position, rotation, scale, modelUrl, }: GameCharacterProps) { const isPlaying = useEditorStore((s) => s.isPlaying); const pos: [number, number, number] = position ?? [0, 0, 0]; const rot: [number, number, number] = rotation ?? [0, 0, 0]; const scl: [number, number, number] = scale ?? [1, 1, 1]; const groupRef = useRef(null); const { camera } = useThree(); const [isNear, setIsNear] = useState(false); useFrame(() => { if (!isPlaying || !groupRef.current) return; const dist = groupRef.current.position.distanceTo(camera.position); setIsNear(dist < 3); }); if (!modelUrl) { return ( ); } return ( {isPlaying && isNear && ( )} ); } function CharacterModel({ url }: { url: string }) { const { scene } = useGLTF(url); return ; }