@@ -7,72 +7,59 @@ import { defaultUnityInstanceName, UnityAPI } from './types';
77export interface UnityContextType {
88 instance ?: UnityAPI ;
99 component : React . ReactElement | null ;
10- loadedId ?: string ;
11- loadUnity : ( id ?: string , className ?: string ) => void ;
12- unloadUnity : ( ) => void ;
10+ setLoaded : React . Dispatch < React . SetStateAction < boolean > > ;
1311 insertTo : ( el : HTMLElement | undefined ) => void ;
1412 insertedTo ?: HTMLElement ;
1513 insertedToRef : MutableRefObject < HTMLElement | undefined > ;
1614}
1715
1816const UnityContext = React . createContext < UnityContextType > ( {
1917 component : null ,
20- loadUnity : ( ) => null ,
21- unloadUnity : ( ) => null ,
18+ setLoaded : ( ) => null ,
2219 insertTo : ( ) => null ,
2320 insertedToRef : { current : undefined } ,
2421} ) ;
2522
26- export function GlobalUnityProvider ( { children } : { children ?: React . ReactNode } ) {
27- const [ loadedId , setLoadedId ] = React . useState < string | undefined > ( ) ;
28- const [ className , setClassName ] = React . useState < string | undefined > ( ) ;
23+ export function GlobalUnityProvider (
24+ { children , instanceClassName = '' , loadedId = defaultUnityInstanceName } :
25+ { children ?: React . ReactNode , loadedId ?: string , instanceClassName ?: string } ) {
2926 const [ instance , setInstance ] = React . useState < UnityAPI > ( ) ;
27+ const [ loaded , setLoaded ] = React . useState < boolean > ( false ) ;
3028 const [ insertedTo , setInsertedTo ] = React . useState < HTMLElement > ( ) ;
3129 const insertedToRef = React . useRef < HTMLElement > ( ) ;
3230
33- const loadUnity = useCallback ( ( id ?: string , className ?: string ) => {
34- setLoadedId ( id || defaultUnityInstanceName ) ;
35- setClassName ( className ) ;
36- } , [ setLoadedId , setClassName ] ) ;
37-
38- const unloadUnity = useCallback ( ( ) => {
39- setLoadedId ( undefined ) ;
40- setClassName ( undefined ) ;
41- } , [ setLoadedId , setClassName ] ) ;
42-
43- const component = React . useMemo ( ( ) => loadedId == null ? null :
44- < Unity unityRef = { setInstance } sampleName = { loadedId } className = { className } /> ,
45- [ setInstance , loadedId , className ] ) ;
46-
31+ const component = React . useMemo ( ( ) => ! loaded ? null :
32+ < Unity unityRef = { setInstance } sampleName = { loadedId } className = { instanceClassName } /> ,
33+ [ setInstance , instanceClassName , loadedId , loaded ] ) ;
4734
4835 const container = React . useMemo < HTMLDivElement > ( ( ) => {
4936 const el = typeof document !== 'undefined' && document . createElement ( 'div' ) ;
5037 if ( el ) el . className = style . globalUnityContainer ;
5138 return el as HTMLDivElement ;
5239 } , [ ] ) ;
5340
54- useEffect ( ( ) => {
55- return ( ) => container ?. remove ( ) ;
56- } , [ container ] ) ;
57-
5841 useEffect ( ( ) => {
5942 if ( ! container ) return ;
60- if ( insertedTo ) insertedTo . appendChild ( container ) ;
61- else container . remove ( ) ;
62-
63- return ( ) => container . remove ( ) ;
43+ if ( insertedTo ) {
44+ insertedTo . appendChild ( container ) ;
45+ container . style . display = '' ;
46+ }
47+ else {
48+ container . style . display = 'none' ;
49+ document . body . appendChild ( container ) ;
50+ }
6451 } , [ container , insertedTo ] ) ;
6552
66- const unityPortal = ! ! container && createPortal ( component , container , 'unity-instance' ) ;
53+ const unityPortal = useMemo ( ( ) => ! ! container && ! ! component && createPortal ( component , container , 'unity-instance' ) , [ container , component ] ) ;
6754
6855 const insertTo = useCallback ( ( el ?: HTMLElement ) => {
6956 insertedToRef . current = el ;
7057 setInsertedTo ( el ) ;
7158 } , [ insertedToRef , setInsertedTo ] ) ;
7259
7360 const value = useMemo ( ( ) =>
74- ( { loadedId , component, instance, loadUnity , unloadUnity , insertedTo, insertTo, insertedToRef } ) ,
75- [ loadedId , component , instance , loadUnity , unloadUnity , insertedTo , insertTo , insertedToRef ] ) ;
61+ ( { component, instance, insertedTo, insertTo, insertedToRef, setLoaded } ) ,
62+ [ component , instance , insertedTo , insertTo , insertedToRef , setLoaded ] ) ;
7663
7764 return < >
7865 { unityPortal }
0 commit comments