Skip to content

Commit 4f2070f

Browse files
committed
fix 2021.2 build errors
1 parent 7432e5b commit 4f2070f

File tree

7 files changed

+38
-42
lines changed

7 files changed

+38
-42
lines changed
90.7 KB
Binary file not shown.

public/Unity/injectable/Build/WebInjectable.framework.js

Lines changed: 1 addition & 1 deletion
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.
71 Bytes
Binary file not shown.

src/components/unity/cartridge.tsx

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -27,8 +27,8 @@ export const UnityCardridge = forwardRef<UnityCardridgeRef, Props>(
2727
const setRef = useCallback((el) => {
2828
if (el) unityContainer.current = el;
2929
}, [unityContainer]);
30-
const { loadUnity, instance, insertTo, insertedToRef } = useGlobalUnity();
31-
useEffect(() => loadUnity(undefined), [loadUnity]);
30+
const { instance, insertTo, insertedToRef, setLoaded } = useGlobalUnity();
31+
useEffect(() => setLoaded(true), [setLoaded]);
3232

3333
const instanceRef = useLatest(instance);
3434

src/components/unity/context.tsx

Lines changed: 20 additions & 33 deletions
Original file line numberDiff line numberDiff line change
@@ -7,72 +7,59 @@ import { defaultUnityInstanceName, UnityAPI } from './types';
77
export 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

1816
const 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}

src/components/unity/instance.tsx

Lines changed: 11 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,8 @@
11

22
import cn from 'classnames';
33
import Head from 'next/head';
4-
import React, { LegacyRef, useCallback, useEffect, useState } from 'react';
4+
import React, { LegacyRef, useCallback, useEffect, useMemo, useState } from 'react';
5+
import { createPortal } from 'react-dom';
56
import style from './index.module.scss';
67
import { defaultUnityInstanceName, isLoaderScriptLoaded, UnityAPI, UnityInstance } from './types';
78

@@ -17,6 +18,12 @@ export function Unity({ className, sampleName = defaultUnityInstanceName, unityR
1718
const [scriptLoaded, setScriptLoaded] = useState(isLoaderScriptLoaded());
1819
const [unityInstance, setUnityInstance] = useState<UnityAPI>();
1920

21+
const id = useMemo(() => `unity-canvas-ref-${Math.round(Math.random() * 10000)}`, []);
22+
23+
const portal = useMemo(() => {
24+
return createPortal(<div style={{ width: 0, height: 0 }} id={id} />, document.body, id);
25+
}, [id])
26+
2027
const setCanvasRef = useCallback(async canvas => {
2128
if (!canvas || !scriptLoaded) { return; }
2229

@@ -76,13 +83,15 @@ export function Unity({ className, sampleName = defaultUnityInstanceName, unityR
7683
</Head>
7784

7885
<div className={cn(className, style.host, 'unity')} ref={innerRef}>
79-
<canvas className={style.canvas} ref={setCanvasRef} tabIndex={-1} />
86+
<canvas id={id} className={style.canvas} ref={setCanvasRef} tabIndex={-1} />
8087

8188
{progress < 1 &&
8289
<div className={style.progress}>
8390
<div className={style.spinner}></div>
8491
<div className={style.progressBar} style={{ paddingRight: ((1 - progress) * 80) + '%' }}></div>
8592
</div>}
8693
</div>
94+
95+
{portal}
8796
</>;
8897
}

src/pages/_app.tsx

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -35,10 +35,10 @@ export default function MyApp({ Component, pageProps }: AppProps) {
3535
}
3636
}, []);
3737
return (
38-
<AppShell>
39-
<GlobalUnityProvider>
38+
<GlobalUnityProvider>
39+
<AppShell>
4040
<Component {...pageProps} />
41-
</GlobalUnityProvider>
42-
</AppShell>
41+
</AppShell>
42+
</GlobalUnityProvider>
4343
);
4444
}

0 commit comments

Comments
 (0)