"use client"; import Image from "next/image"; import { useSearchParams } from "next/navigation"; import { useCallback, useEffect, useState } from "react"; import { Unity, UnityConfig, useUnityContext } from "react-unity-webgl"; import { ObjectType } from "../types"; const unityConfigBuilder = (path: string): UnityConfig => ({ loaderUrl: `${path}.loader.js`, dataUrl: `${path}.data`, frameworkUrl: `${path}.framework.js`, codeUrl: `${path}.wasm`, streamingAssetsUrl: "StreamingAssets", companyName: "DTOL", productName: "3d-test", productVersion: "0.1", }); export default function UnityComponent({ option = [], ohg = [], frame = [], }: { option: { value: string; name: string; description: string; }[]; ohg: ObjectType[]; frame: ObjectType[]; }) { const params = useSearchParams(); const p = params.get("p"); const [selectedIndex, setSelectedIndex] = useState({ ohg: 0, frame: 0 }); type SelectedIndexType = typeof selectedIndex; const [match, setMatch] = useState(100); if (!p || isNaN(Number(p))) location.href = "/unity?p=0"; const { unityProvider, isLoaded, loadingProgression, UNSAFE__unityInstance } = useUnityContext(unityConfigBuilder(option[Number(p)].value)); const loadingPercentage = Math.round(loadingProgression * 100); // 매치율 조회 및 업데이트 const handleMatchUpdate = useCallback( async (newSelectedIndex: SelectedIndexType) => { const res = await fetch( `/fit?o=${newSelectedIndex.ohg}&f=${newSelectedIndex.frame}`, { method: "GET", }, ); console.log(res); const json = (await res.json()) as { match: number }; if (isNaN(Number(json.match)) === false) setMatch(json.match); return json.match; }, [], ); // 최초 1회 조회 useEffect(() => { handleMatchUpdate({ ohg: 0, frame: 0 }); }, [handleMatchUpdate]); // ohg나 frame이 바뀔 때마다 호출 const handleSelectIndex = useCallback( // objectName: ohg | frame, newValue: "0", "1", ... ( currentSelectedIndex: SelectedIndexType, objectName: keyof SelectedIndexType, newValue: string, ) => { // 화면상의 select 컴포넌트 업데이트 const newIndex = Number(newValue); const newSelectedIndex = { ...currentSelectedIndex, [objectName]: newIndex, }; setSelectedIndex(newSelectedIndex); // 유니티 스크립트 호출 - objectName 및 함수 이름은 유니티의 것과 동일해야 함 UNSAFE__unityInstance?.SendMessage(objectName, "HandleSelect", newIndex); handleMatchUpdate(newSelectedIndex) // 매치율 이용하여 컴포넌트 업데이트 .then((match) => { // }) .catch((err) => { // 에러처리 }); }, [UNSAFE__unityInstance, handleMatchUpdate], ); return ( <>
Loading... ({loadingPercentage}%)