Skip to content

Commit a757ac0

Browse files
committed
add useReactiveValue sample
1 parent 0dfeaa9 commit a757ac0

File tree

7 files changed

+57
-7
lines changed

7 files changed

+57
-7
lines changed

Assets/Resources/check.svg.meta

+1
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

Assets/Resources/react/index.js

+34-1
Original file line numberDiff line numberDiff line change
@@ -22325,6 +22325,39 @@ var ForwardRef = /*#__PURE__*/(/* unused pure expression or super */ null && (fo
2232522325
;// CONCATENATED MODULE: ./src/pages/images/index.tsx
2232622326
// @ts-expect-error
2232722327
var webImage='https://www.google.com.tr/images/branding/googlelogo/1x/googlelogo_color_272x92dp.png';var webVideo='https://media.w3.org/2010/05/sintel/trailer.mp4';function ImagesPage(){var _useState=(0,react.useState)(),_useState2=slicedToArray_slicedToArray(_useState,2),videoRef=_useState2[0],setVideoRef=_useState2[1];var _useGlobals=useGlobals(),customPrefab=_useGlobals.customPrefab,renderCamera=_useGlobals.renderCamera,cameraRoot=_useGlobals.cameraRoot,portalRoot=_useGlobals.portalRoot,portalCamera=_useGlobals.portalCamera;(0,react.useEffect)(function(){if(videoRef){videoRef.VideoPlayer.Pause();}},[videoRef]);var toggleVideo=function toggleVideo(){var vp=videoRef.VideoPlayer;if(vp.isPlaying)vp.Pause();else vp.Play();};var _useState3=(0,react.useState)(),_useState4=slicedToArray_slicedToArray(_useState3,2),renderRef=_useState4[0],setRenderRef=_useState4[1];return (0,emotion_react_jsx_runtime_browser_esm/* jsxs */.FD)("view",{className:pages_images_index_module.host,children:[(0,emotion_react_jsx_runtime_browser_esm/* jsxs */.FD)("portal",{id:"pt",target:portalRoot,eventCamera:portalCamera,style:{scale:1/200,translateZ:-0.55},eventViewport:renderRef,children:["This is a portal",(0,emotion_react_jsx_runtime_browser_esm/* jsx */.Y)("button",{children:"Button inside portal"})]}),(0,emotion_react_jsx_runtime_browser_esm/* jsxs */.FD)("section",{children:[(0,emotion_react_jsx_runtime_browser_esm/* jsx */.Y)("h2",{children:(0,emotion_react_jsx_runtime_browser_esm/* jsxs */.FD)("row",{children:["Image",(0,emotion_react_jsx_runtime_browser_esm/* jsx */.Y)(icon.image,{})]})}),(0,emotion_react_jsx_runtime_browser_esm/* jsxs */.FD)("row",{children:[(0,emotion_react_jsx_runtime_browser_esm/* jsx */.Y)("image",{source:bg_namespaceObject}),(0,emotion_react_jsx_runtime_browser_esm/* jsx */.Y)("image",{source:bg_namespaceObject}),(0,emotion_react_jsx_runtime_browser_esm/* jsx */.Y)("image",{source:base64Image}),(0,emotion_react_jsx_runtime_browser_esm/* jsx */.Y)("image",{source:webImage})]})]}),(0,emotion_react_jsx_runtime_browser_esm/* jsxs */.FD)("section",{children:[(0,emotion_react_jsx_runtime_browser_esm/* jsx */.Y)("h2",{children:(0,emotion_react_jsx_runtime_browser_esm/* jsxs */.FD)("row",{children:["Vector Images",(0,emotion_react_jsx_runtime_browser_esm/* jsx */.Y)(icon.trending_up,{})]})}),(0,emotion_react_jsx_runtime_browser_esm/* jsxs */.FD)("row",{children:[(0,emotion_react_jsx_runtime_browser_esm/* jsx */.Y)("svgimage",{source:'res:check'}),(0,emotion_react_jsx_runtime_browser_esm/* jsx */.Y)("svg",{source:checkraw}),(0,emotion_react_jsx_runtime_browser_esm/* jsx */.Y)("svg",{source:'https://dev.w3.org/SVG/tools/svgweb/samples/svg-files/betterplace.svg'}),(0,emotion_react_jsx_runtime_browser_esm/* jsx */.Y)("svg",{source:'https://dev.w3.org/SVG/tools/svgweb/samples/svg-files/debian.svg'})]})]}),(0,emotion_react_jsx_runtime_browser_esm/* jsxs */.FD)("section",{children:[(0,emotion_react_jsx_runtime_browser_esm/* jsx */.Y)("h2",{children:(0,emotion_react_jsx_runtime_browser_esm/* jsxs */.FD)("row",{children:["Prefab",(0,emotion_react_jsx_runtime_browser_esm/* jsx */.Y)(icon.videogame_asset,{})]})}),(0,emotion_react_jsx_runtime_browser_esm/* jsx */.Y)("row",{children:(0,emotion_react_jsx_runtime_browser_esm/* jsx */.Y)("prefab",{target:customPrefab})})]}),(0,emotion_react_jsx_runtime_browser_esm/* jsxs */.FD)("section",{children:[(0,emotion_react_jsx_runtime_browser_esm/* jsx */.Y)("h2",{children:(0,emotion_react_jsx_runtime_browser_esm/* jsxs */.FD)("row",{children:["Border Image",(0,emotion_react_jsx_runtime_browser_esm/* jsx */.Y)(icon.crop_square,{})]})}),(0,emotion_react_jsx_runtime_browser_esm/* jsx */.Y)("row",{children:(0,emotion_react_jsx_runtime_browser_esm/* jsx */.Y)("view",{className:pages_images_index_module.borderImage,children:"This is a border image"})})]}),(0,emotion_react_jsx_runtime_browser_esm/* jsxs */.FD)("section",{children:[(0,emotion_react_jsx_runtime_browser_esm/* jsx */.Y)("h2",{children:(0,emotion_react_jsx_runtime_browser_esm/* jsxs */.FD)("row",{children:["Video",(0,emotion_react_jsx_runtime_browser_esm/* jsx */.Y)(icon.movie,{})]})}),(0,emotion_react_jsx_runtime_browser_esm/* jsx */.Y)("row",{children:(0,emotion_react_jsx_runtime_browser_esm/* jsx */.Y)("video",{style:{flexGrow:1},source:webVideo,ref:setVideoRef,onPointerClick:toggleVideo})})]}),(0,emotion_react_jsx_runtime_browser_esm/* jsxs */.FD)("section",{children:[(0,emotion_react_jsx_runtime_browser_esm/* jsx */.Y)("h2",{children:(0,emotion_react_jsx_runtime_browser_esm/* jsxs */.FD)("row",{children:["Render Texture",(0,emotion_react_jsx_runtime_browser_esm/* jsx */.Y)(icon._3d_rotation,{})]})}),(0,emotion_react_jsx_runtime_browser_esm/* jsx */.Y)("row",{children:(0,emotion_react_jsx_runtime_browser_esm/* jsx */.Y)("render",{width:900,height:400,style:{flexGrow:1},ref:setRenderRef,onDrag:function onDrag(ev){cameraRoot.transform.Rotate(new Interop.UnityEngine.Vector3(-ev.delta.y,ev.delta.x,0));},onScroll:function onScroll(ev){renderCamera.transform.Translate(0,0,Math.fround(ev.scrollDelta.y*10),Interop.UnityEngine.Space.Self);},onMount:function onMount(ev){return ev.gameObject.SetActive(true);},onUnmount:function onUnmount(ev){return ev.gameObject.SetActive(false);},camera:renderCamera})})]})]});}/* harmony default export */ const pages_images = (ImagesPage);
22328+
;// CONCATENATED MODULE: ../../renderer/dist/src/helpers/hooks/use-reactive-value.js
22329+
22330+
22331+
function createSubscriber(obj, isEqual) {
22332+
var isReactive = obj && typeof obj === 'object' && 'Value' in obj;
22333+
var snapshot = isReactive ? obj.Value : undefined;
22334+
return {
22335+
subscribe: function subscribe(onStoreChange) {
22336+
snapshot = isReactive ? obj.Value : undefined;
22337+
var remove = isReactive && typeof obj.AddListener === 'function' && (obj === null || obj === void 0 ? void 0 : obj.AddListener(function () {
22338+
var prev = snapshot;
22339+
snapshot = isReactive ? obj.Value : undefined;
22340+
if (typeof isEqual !== 'function' || !isEqual(prev, snapshot)) {
22341+
onStoreChange();
22342+
}
22343+
}));
22344+
if (isReactive && typeof remove !== 'function') console.warn('The reactive value does not provide a change listener');
22345+
return function () {
22346+
return remove === null || remove === void 0 ? void 0 : remove();
22347+
};
22348+
},
22349+
getSnapshot: function getSnapshot() {
22350+
return snapshot;
22351+
}
22352+
};
22353+
}
22354+
function useReactiveValue(obj, isEqual) {
22355+
var sb = (0,react.useMemo)(function () {
22356+
return createSubscriber(obj, isEqual);
22357+
}, [obj, isEqual]);
22358+
return (0,shim.useSyncExternalStore)(sb.subscribe, sb.getSnapshot, sb.getSnapshot);
22359+
}
22360+
//# sourceMappingURL=use-reactive-value.js.map
2232822361
;// CONCATENATED MODULE: ../../renderer/dist/src/webgl-compat/error-messages.js
2232922362
// Original file: https://github.com/jeffreylanters/react-unity-webgl/blob/main/module/source/constants/error-messages.ts
2233022363
var errorMessages = {
@@ -22566,7 +22599,7 @@ var interop_index_module_update = injectStylesIntoStyleTag_default()(interop_ind
2256622599
/* harmony default export */ const pages_interop_index_module = (interop_index_module/* default */.A && interop_index_module/* default */.A.locals ? interop_index_module/* default */.A.locals : undefined);
2256722600

2256822601
;// CONCATENATED MODULE: ./src/pages/interop/index.tsx
22569-
var InteropPage=function InteropPage(){var _useState=(0,react.useState)(true),_useState2=slicedToArray_slicedToArray(_useState,2),shouldListen=_useState2[0],setShouldListen=_useState2[1];var _useState3=(0,react.useState)(null),_useState4=slicedToArray_slicedToArray(_useState3,2),pressedKey=_useState4[0],setPressedKey=_useState4[1];var _useUnityContext=useUnityContext({}),addEventListener=_useUnityContext.addEventListener,removeEventListener=_useUnityContext.removeEventListener;(0,react.useEffect)(function(){if(shouldListen){var remove=Globals.InteropTest.AddKeyPressListener(function(key){setPressedKey(key);});Interop.GetType('MyInterop.InteropTest').TestDebug();return function(){return remove();};}},[shouldListen]);(0,react.useEffect)(function(){var fn=function fn(key){console.log('Pressed key is: '+key);};addEventListener('OnKeyPress',fn);return function(){return removeEventListener('OnKeyPress',fn);};},[addEventListener,removeEventListener]);return (0,emotion_react_jsx_runtime_browser_esm/* jsxs */.FD)("view",{className:pages_interop_index_module.host,children:[(0,emotion_react_jsx_runtime_browser_esm/* jsx */.Y)("button",{onClick:function onClick(){return setShouldListen(function(x){return!x;});},children:shouldListen?'Remove Listener':'Add Listener'}),!!pressedKey&&(0,emotion_react_jsx_runtime_browser_esm/* jsx */.Y)("view",{children:(0,emotion_react_jsx_runtime_browser_esm/* jsxs */.FD)("text",{children:["Pressed key is: ",pressedKey]})})]});};/* harmony default export */ const interop = (InteropPage);
22602+
var InteropPage=function InteropPage(){var _useState=(0,react.useState)(true),_useState2=slicedToArray_slicedToArray(_useState,2),shouldListen=_useState2[0],setShouldListen=_useState2[1];var _useState3=(0,react.useState)(null),_useState4=slicedToArray_slicedToArray(_useState3,2),pressedKey=_useState4[0],setPressedKey=_useState4[1];var _useUnityContext=useUnityContext({}),addEventListener=_useUnityContext.addEventListener,removeEventListener=_useUnityContext.removeEventListener;var _useGlobals=useGlobals(),InteropTest=_useGlobals.InteropTest;var deltaTime=useReactiveValue(InteropTest.DeltaTime);(0,react.useEffect)(function(){if(shouldListen){var remove=Globals.InteropTest.AddKeyPressListener(function(key){setPressedKey(key);});Interop.GetType('MyInterop.InteropTest').TestDebug();return function(){return remove();};}},[shouldListen]);(0,react.useEffect)(function(){var fn=function fn(key){console.log('Pressed key is: '+key);};addEventListener('OnKeyPress',fn);return function(){return removeEventListener('OnKeyPress',fn);};},[addEventListener,removeEventListener]);return (0,emotion_react_jsx_runtime_browser_esm/* jsxs */.FD)("view",{className:pages_interop_index_module.host,children:[(0,emotion_react_jsx_runtime_browser_esm/* jsx */.Y)("button",{onClick:function onClick(){return setShouldListen(function(x){return!x;});},children:shouldListen?'Remove Listener':'Add Listener'}),!!pressedKey&&(0,emotion_react_jsx_runtime_browser_esm/* jsx */.Y)("view",{children:(0,emotion_react_jsx_runtime_browser_esm/* jsxs */.FD)("text",{children:["Pressed key is: ",pressedKey]})}),"Delta Time: ",deltaTime]});};/* harmony default export */ const interop = (InteropPage);
2257022603
;// CONCATENATED MODULE: ../../material/dist/src/util/helpers.js
2257122604

2257222605
function getChildrenOfType(children, type) {

Assets/Resources/react/static/media/check.4701752daa56435b75dc4edd7886d403.svg.meta

+2-1
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

Assets/Scripts/InteropTest.cs

+9-1
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,6 @@
11
using System;
22
using ReactUnity.Helpers;
3+
using ReactUnity.Reactive;
34
using ReactUnity.UGUI;
45
using UnityEngine;
56
using UnityEngine.InputSystem;
@@ -12,6 +13,8 @@ public class InteropTest : MonoBehaviour
1213
public ReactAction<string> OnKeyPress = new ReactAction<string>();
1314
IDisposable dispose;
1415

16+
public ReactiveValue<float> DeltaTime = new ReactiveValue<float>();
17+
1518
[Obsolete]
1619
public Action AddKeyPressListener(object callback) => OnKeyPress.AddListener(callback);
1720

@@ -24,7 +27,7 @@ void OnEnable()
2427

2528
dispose = InputSystem.onAnyButtonPress.Call(x => {
2629
OnKeyPress?.Invoke(x.displayName);
27-
ctx.Context.Script.WebGLCompatDispatchEvent("OnKeyPress", x.displayName);
30+
ctx.Context?.Script?.WebGLCompatDispatchEvent("OnKeyPress", x.displayName);
2831
});
2932
});
3033
}
@@ -39,5 +42,10 @@ public static void TestDebug()
3942
{
4043
Debug.Log("Interop Test Works");
4144
}
45+
46+
void Update()
47+
{
48+
DeltaTime.Value = Time.deltaTime;
49+
}
4250
}
4351
}

Packages/manifest.json

+2-2
Original file line numberDiff line numberDiff line change
@@ -1,15 +1,15 @@
11
{
22
"dependencies": {
33
"com.reactunity.clearscript": "0.17.0",
4-
"com.reactunity.core": "0.19.8",
4+
"com.reactunity.core": "0.19.10",
55
"com.reactunity.jint": "0.17.0",
66
"com.reactunity.quickjs": "0.19.0",
77
"com.unity.2d.sprite": "1.0.0",
88
"com.unity.device-simulator.devices": "1.0.0",
99
"com.unity.editorcoroutines": "1.0.0",
1010
"com.unity.ide.visualstudio": "2.0.22",
1111
"com.unity.inputsystem": "1.11.2",
12-
"com.unity.mobile.android-logcat": "1.4.3",
12+
"com.unity.mobile.android-logcat": "1.4.4",
1313
"com.unity.multiplayer.center": "1.0.0",
1414
"com.unity.profiling.core": "1.0.2",
1515
"com.unity.render-pipelines.universal": "17.0.3",

Packages/packages-lock.json

+2-2
Original file line numberDiff line numberDiff line change
@@ -8,7 +8,7 @@
88
"url": "https://package.openupm.com"
99
},
1010
"com.reactunity.core": {
11-
"version": "0.19.8",
11+
"version": "0.19.10",
1212
"depth": 0,
1313
"source": "registry",
1414
"dependencies": {
@@ -106,7 +106,7 @@
106106
"url": "https://packages.unity.com"
107107
},
108108
"com.unity.mobile.android-logcat": {
109-
"version": "1.4.3",
109+
"version": "1.4.4",
110110
"depth": 0,
111111
"source": "registry",
112112
"dependencies": {},

react/src/pages/interop/index.tsx

+7
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,5 @@
11

2+
import { useGlobals, useReactiveValue } from '@reactunity/renderer';
23
import { useEffect, useState } from 'react';
34
import { useUnityContext } from 'react-unity-webgl';
45
import styles from './index.module.scss';
@@ -9,6 +10,10 @@ export const InteropPage = () => {
910

1011
const { addEventListener, removeEventListener } = useUnityContext({} as any);
1112

13+
14+
const { InteropTest }= useGlobals();
15+
const deltaTime = useReactiveValue(InteropTest.DeltaTime);
16+
1217
useEffect(() => {
1318
if (shouldListen) {
1419
const remove = Globals.InteropTest.AddKeyPressListener((key) => {
@@ -39,6 +44,8 @@ export const InteropPage = () => {
3944
{!!pressedKey && <view>
4045
<text>Pressed key is: {pressedKey}</text>
4146
</view>}
47+
48+
Delta Time: {deltaTime}
4249
</view>;
4350
};
4451

0 commit comments

Comments
 (0)