From 156285a6919c8255c745f7ac058b5fbd087acb4f Mon Sep 17 00:00:00 2001 From: Oliver Wong Date: Thu, 9 Apr 2026 16:26:45 +0800 Subject: [PATCH] =?UTF-8?q?feat:=20=E6=A0=B8=E5=BF=83=E5=8A=9F=E8=83=BD?= =?UTF-8?q?=E5=AE=9E=E7=8E=B0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../Resources/HapticData/HapticObject.bytes | Bin 329 -> 356 bytes Assets/Resources/Haptics.meta | 8 + Assets/Resources/Haptics/NVDice.haptic | 1 + Assets/Resources/Haptics/NVDice.haptic.meta | 10 + Assets/Resources/Haptics/NVHeartbeats.haptic | 1 + .../Haptics/NVHeartbeats.haptic.meta | 10 + Assets/Scenes/HomeScene.unity | 755 ++++++++++++++++++ .../Handwritten/HandwrittenDefinitions.cs | 32 +- .../OCES/Haptic/Handwritten/HapticSystem.cs | 126 +++ Assets/Scripts/OCES/Haptic/HapticInvoker.cs | 40 + .../Scripts/OCES/Haptic/HapticInvoker.cs.meta | 3 + ProjectSettings/ProjectSettings.asset | 6 +- 12 files changed, 988 insertions(+), 4 deletions(-) create mode 100644 Assets/Resources/Haptics.meta create mode 100644 Assets/Resources/Haptics/NVDice.haptic create mode 100644 Assets/Resources/Haptics/NVDice.haptic.meta create mode 100644 Assets/Resources/Haptics/NVHeartbeats.haptic create mode 100644 Assets/Resources/Haptics/NVHeartbeats.haptic.meta create mode 100644 Assets/Scripts/OCES/Haptic/HapticInvoker.cs create mode 100644 Assets/Scripts/OCES/Haptic/HapticInvoker.cs.meta diff --git a/Assets/Resources/HapticData/HapticObject.bytes b/Assets/Resources/HapticData/HapticObject.bytes index 904cb516ceb1bbf99b6e6847c410210fadd357d2..6c8776c4f9705ea028a1cb9c666241c67b28c177 100644 GIT binary patch delta 52 ycmX@f^n{5~a3iA?qb8eQm`i4IDxXA82|tP diff --git a/Assets/Resources/Haptics.meta b/Assets/Resources/Haptics.meta new file mode 100644 index 0000000..f9e6230 --- /dev/null +++ b/Assets/Resources/Haptics.meta @@ -0,0 +1,8 @@ +fileFormatVersion: 2 +guid: 50ce29defe5bc42808e887aa20cef298 +folderAsset: yes +DefaultImporter: + externalObjects: {} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/Resources/Haptics/NVDice.haptic b/Assets/Resources/Haptics/NVDice.haptic new file mode 100644 index 0000000..b76f105 --- /dev/null +++ b/Assets/Resources/Haptics/NVDice.haptic @@ -0,0 +1 @@ +{"version":{"major":1,"minor":0,"patch":0},"metadata":{"author":"joao@lofelt.com","editor":"Lofelt Studio","source":"AHAPPresets/NVDice.wav","project":"NVDice","tags":[],"description":""},"signals":{"continuous":{"envelopes":{"amplitude":[{"time":0,"amplitude":0.00029056615},{"time":0.0010204081,"amplitude":0.00029056615},{"time":0.020022675,"amplitude":0.0010838391},{"time":0.023015874,"amplitude":0.24628326,"emphasis":{"amplitude":0.64811385,"frequency":1}},{"time":0.04301587,"amplitude":0.30893233},{"time":0.06201814,"amplitude":0.14449422},{"time":0.0870068,"amplitude":0.058487773},{"time":0.090022676,"amplitude":0.21247946,"emphasis":{"amplitude":0.5591565,"frequency":0.1768105}},{"time":0.114013605,"amplitude":0.21455966},{"time":0.14301588,"amplitude":0.06968115},{"time":0.21102041,"amplitude":0.031449247},{"time":0.21201813,"amplitude":0.24404025,"emphasis":{"amplitude":0.6422112,"frequency":0.2923607}},{"time":0.23301587,"amplitude":0.28606227},{"time":0.26600906,"amplitude":0.07495963},{"time":0.26700678,"amplitude":0.6502027},{"time":0.27002266,"amplitude":0.308164,"emphasis":{"amplitude":0.8109579,"frequency":0.618822}},{"time":0.28301588,"amplitude":0.49409807},{"time":0.30301586,"amplitude":0.21208319},{"time":0.3170068,"amplitude":0.120308496},{"time":0.35201815,"amplitude":0.044048432},{"time":0.35301587,"amplitude":0.597531},{"time":0.37201813,"amplitude":0.29360098},{"time":0.3840136,"amplitude":0.17828391},{"time":0.38501135,"amplitude":0.3910198},{"time":0.41201812,"amplitude":0.14365426},{"time":0.42501134,"amplitude":0.18421979},{"time":0.4640136,"amplitude":0.043719392},{"time":0.46501133,"amplitude":0.13552359},{"time":0.48,"amplitude":0.08007864},{"time":0.48600906,"amplitude":0.17900568},{"time":0.5050113,"amplitude":0.090373725},{"time":0.57900226,"amplitude":0.023051888},{"time":0.58,"amplitude":0.07891691},{"time":0.61,"amplitude":0.024494085},{"time":0.61099774,"amplitude":0.10730806},{"time":0.65,"amplitude":0.023467101},{"time":0.6509977,"amplitude":0.056163862},{"time":0.69600904,"amplitude":0.013153992},{"time":0.7140136,"amplitude":0.06063435},{"time":0.77900225,"amplitude":0.0046691853},{"time":0.9629932,"amplitude":0.0005919837},{"time":0.9633333,"amplitude":0.0005919837},{"time":0.9633333,"amplitude":0.0005919837}],"frequency":[{"time":0,"frequency":1},{"time":0.0058049876,"frequency":0.45383245},{"time":0.043537416,"frequency":0.74745363},{"time":0.13931973,"frequency":0.574811},{"time":0.18575963,"frequency":0.7171733},{"time":0.20897959,"frequency":0.5531693},{"time":0.23510204,"frequency":0.6953524},{"time":0.26702946,"frequency":0.52940357},{"time":0.30476192,"frequency":0.6585863},{"time":0.38893422,"frequency":0.5463057},{"time":0.41505668,"frequency":0.68535703},{"time":0.42376417,"frequency":0.54946226},{"time":0.4614966,"frequency":0.5811323},{"time":0.53696144,"frequency":0.54777396},{"time":0.6066213,"frequency":0.5811939},{"time":0.64435375,"frequency":0.72476804},{"time":0.6675737,"frequency":0.5684711},{"time":0.6849887,"frequency":0.9723859},{"time":0.69659865,"frequency":0.66252524},{"time":0.751746,"frequency":0.6206365},{"time":0.757551,"frequency":0.97920614},{"time":0.7662585,"frequency":0.6674669},{"time":0.786576,"frequency":0.679469},{"time":0.8039909,"frequency":0.99255854},{"time":0.8185034,"frequency":0.6613598},{"time":0.83591837,"frequency":1},{"time":0.85043085,"frequency":0.635323},{"time":0.8649433,"frequency":0.65902764},{"time":0.8707483,"frequency":1},{"time":0.94911563,"frequency":1}]}}}} \ No newline at end of file diff --git a/Assets/Resources/Haptics/NVDice.haptic.meta b/Assets/Resources/Haptics/NVDice.haptic.meta new file mode 100644 index 0000000..df62dd6 --- /dev/null +++ b/Assets/Resources/Haptics/NVDice.haptic.meta @@ -0,0 +1,10 @@ +fileFormatVersion: 2 +guid: 5889c407bb04d42428e6225122e4b847 +ScriptedImporter: + internalIDToNameTable: [] + externalObjects: {} + serializedVersion: 2 + userData: + assetBundleName: + assetBundleVariant: + script: {fileID: 11500000, guid: dc84fb4fa9e67485a972c887d976d004, type: 3} diff --git a/Assets/Resources/Haptics/NVHeartbeats.haptic b/Assets/Resources/Haptics/NVHeartbeats.haptic new file mode 100644 index 0000000..c061759 --- /dev/null +++ b/Assets/Resources/Haptics/NVHeartbeats.haptic @@ -0,0 +1 @@ +{"version":{"major":1,"minor":0,"patch":0},"metadata":{"author":"joao@lofelt.com","editor":"Lofelt Studio","source":"AHAPPresets/NVHeartbeats.wav","project":"NVHeartbeats","tags":[],"description":""},"signals":{"continuous":{"envelopes":{"amplitude":[{"time":0,"amplitude":0.009742844},{"time":0.0010204081,"amplitude":0.009742844},{"time":0.003015873,"amplitude":0.19868761},{"time":0.0070068026,"amplitude":0.21186994},{"time":0.009002267,"amplitude":0.3535316},{"time":0.018004535,"amplitude":0.32513767},{"time":0.029002268,"amplitude":0.2547701},{"time":0.045011338,"amplitude":0.18802175},{"time":0.06301587,"amplitude":0.13030155},{"time":0.083015874,"amplitude":0.085643366},{"time":0.10401361,"amplitude":0.055023465},{"time":0.12900226,"amplitude":0.031824943},{"time":0.18501133,"amplitude":0.008188676},{"time":0.22900227,"amplitude":0.0017238385},{"time":0.29999998,"amplitude":0.000433428},{"time":0.3010204,"amplitude":0.023433387},{"time":0.3040086,"amplitude":0.3662426,"emphasis":{"amplitude":0.8550492434482757,"frequency":1}},{"time":0.3040136,"amplitude":0.5318154},{"time":0.3070068,"amplitude":0.50587577},{"time":0.30900225,"amplitude":0.8576526},{"time":0.31201813,"amplitude":0.8540082},{"time":0.31501132,"amplitude":0.78581953},{"time":0.31900227,"amplitude":0.79041666},{"time":0.32900226,"amplitude":0.6319953},{"time":0.3370068,"amplitude":0.54113984},{"time":0.3540136,"amplitude":0.38007545},{"time":0.37301588,"amplitude":0.25503132},{"time":0.39301586,"amplitude":0.16664001},{"time":0.4170068,"amplitude":0.098586604},{"time":0.4540136,"amplitude":0.042635933},{"time":0.48301587,"amplitude":0.020449765},{"time":0.53301585,"amplitude":0.0033419875},{"time":0.5770068,"amplitude":0.0005798723},{"time":0.9,"amplitude":0.0004947566},{"time":0.9020066357822161,"amplitude":0.10341841455295508},{"time":0.9029932,"amplitude":0.15402092,"emphasis":{"amplitude":0.18556738,"frequency":0.14043266}},{"time":0.9050361486566805,"amplitude":0.17912326986405525},{"time":0.9070068,"amplitude":0.20333728},{"time":0.90900224,"amplitude":0.34423363},{"time":0.9370068,"amplitude":0.21514598},{"time":0.9550113,"amplitude":0.1495948},{"time":0.9729932,"amplitude":0.10280151},{"time":1.0009977,"amplitude":0.059750818},{"time":1.0019954,"amplitude":0.057907753},{"time":1.0170068,"amplitude":0.04022924},{"time":1.0429932,"amplitude":0.022579549},{"time":1.0670068,"amplitude":0.012942444},{"time":1.1,"amplitude":0.0051094904},{"time":1.1520181,"amplitude":0.0006914464},{"time":1.2000227,"amplitude":0.00037157716},{"time":1.2010204,"amplitude":0.016553689},{"time":1.2040085999999999,"amplitude":0.36852205,"emphasis":{"amplitude":0.8336576524137936,"frequency":0.96081686}},{"time":1.2040136,"amplitude":0.53432286},{"time":1.2070068,"amplitude":0.50807685},{"time":1.2090023,"amplitude":0.85174495},{"time":1.2100227,"amplitude":0.8910244},{"time":1.2120181,"amplitude":0.87354046},{"time":1.2140136,"amplitude":0.81445026},{"time":1.2180045,"amplitude":0.7936242},{"time":1.2210203,"amplitude":0.72203946},{"time":1.2250113,"amplitude":0.695834},{"time":1.2290022,"amplitude":0.61917233},{"time":1.2340136,"amplitude":0.5880176},{"time":1.2370068,"amplitude":0.53021616},{"time":1.2410204,"amplitude":0.50928617},{"time":1.2450113,"amplitude":0.45255724},{"time":1.2500226,"amplitude":0.42614263},{"time":1.2540135,"amplitude":0.37573743},{"time":1.259025,"amplitude":0.35394874},{"time":1.2630159,"amplitude":0.3121782},{"time":1.2700226,"amplitude":0.28171903},{"time":1.2730159,"amplitude":0.25217998},{"time":1.2780045,"amplitude":0.23790987},{"time":1.2830158,"amplitude":0.2039585},{"time":1.3040136,"amplitude":0.13108838},{"time":1.3170068,"amplitude":0.09773624},{"time":1.3410203,"amplitude":0.057223924},{"time":1.3700227,"amplitude":0.028775413},{"time":1.399025,"amplitude":0.012871244},{"time":1.4290249,"amplitude":0.0040058647},{"time":1.4660317,"amplitude":0.00085569033},{"time":1.5120181,"amplitude":0.00051419035},{"time":1.7990476,"amplitude":0.00053922477},{"time":1.8,"amplitude":0.00053922477},{"time":1.8,"amplitude":0.00053922477}],"frequency":[{"time":0,"frequency":0.020718927},{"time":0.17414966,"frequency":0.0033238232},{"time":0.20897959,"frequency":0.09051466},{"time":0.21188208,"frequency":0.017611936},{"time":0.22349207,"frequency":0.36407393},{"time":0.22929706,"frequency":0.3733385},{"time":0.23510204,"frequency":1},{"time":0.28734693,"frequency":1},{"time":0.29315192,"frequency":0.03697985},{"time":0.3076644,"frequency":0.015080327},{"time":0.44408163,"frequency":0.0042551477},{"time":0.510839,"frequency":0.013670002},{"time":0.5195465,"frequency":0.114794515},{"time":0.528254,"frequency":1},{"time":0.6675737,"frequency":1},{"time":0.6704762,"frequency":0.39109683},{"time":0.6733787,"frequency":1},{"time":0.76335603,"frequency":1},{"time":0.7662585,"frequency":0.34064588},{"time":0.769161,"frequency":1},{"time":0.8126984,"frequency":1},{"time":0.8156009,"frequency":0.46277383},{"time":0.8185034,"frequency":1},{"time":0.8591383,"frequency":1},{"time":0.8620408,"frequency":0.33363342},{"time":0.8649433,"frequency":1},{"time":0.88816327,"frequency":1},{"time":0.8910658,"frequency":0.14180698},{"time":0.8939682,"frequency":0.029813504},{"time":0.9984581,"frequency":0.0049297404},{"time":1.0013604,"frequency":0.0075458325},{"time":1.0390929,"frequency":0.0169438},{"time":1.0594103,"frequency":0.0026711088},{"time":1.0942403,"frequency":0.010803959},{"time":1.1058502,"frequency":0.07026733},{"time":1.1116552,"frequency":0.18236092},{"time":1.1174603,"frequency":0.1253173},{"time":1.1203628,"frequency":0.028144006},{"time":1.1232653,"frequency":0.4114257},{"time":1.1261678,"frequency":1},{"time":1.1900226,"frequency":1},{"time":1.1929251,"frequency":0.04367737},{"time":1.2074375,"frequency":0.015173969},{"time":1.2974149,"frequency":0.0044053462},{"time":1.3264399,"frequency":0.013245664},{"time":1.3612697,"frequency":0.0032118666},{"time":1.3670747,"frequency":0.019418897},{"time":1.3873922,"frequency":0.0033809673},{"time":1.4077097,"frequency":0.009184113},{"time":1.4106121,"frequency":0.056718018},{"time":1.4193196,"frequency":0.050725304},{"time":1.4280272,"frequency":0.2703589},{"time":1.4309297,"frequency":1},{"time":1.4512471,"frequency":1},{"time":1.4541496,"frequency":0.22229218},{"time":1.4570521,"frequency":1},{"time":1.6457142,"frequency":1},{"time":1.6486167,"frequency":0.3691811},{"time":1.6515192,"frequency":1},{"time":1.7879364,"frequency":1}]}}}} \ No newline at end of file diff --git a/Assets/Resources/Haptics/NVHeartbeats.haptic.meta b/Assets/Resources/Haptics/NVHeartbeats.haptic.meta new file mode 100644 index 0000000..2383fdf --- /dev/null +++ b/Assets/Resources/Haptics/NVHeartbeats.haptic.meta @@ -0,0 +1,10 @@ +fileFormatVersion: 2 +guid: 2a996381c3ac0493a8a4ec47d6d84232 +ScriptedImporter: + internalIDToNameTable: [] + externalObjects: {} + serializedVersion: 2 + userData: + assetBundleName: + assetBundleVariant: + script: {fileID: 11500000, guid: dc84fb4fa9e67485a972c887d976d004, type: 3} diff --git a/Assets/Scenes/HomeScene.unity b/Assets/Scenes/HomeScene.unity index 5ceeff4..c03b503 100644 --- a/Assets/Scenes/HomeScene.unity +++ b/Assets/Scenes/HomeScene.unity @@ -122,6 +122,228 @@ NavMeshSettings: debug: m_Flags: 0 m_NavMeshData: {fileID: 0} +--- !u!1 &109734265 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 109734266} + - component: {fileID: 109734268} + - component: {fileID: 109734267} + m_Layer: 5 + m_Name: Text (Legacy) + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!224 &109734266 +RectTransform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 109734265} + m_LocalRotation: {x: -0, y: -0, z: -0, w: 1} + m_LocalPosition: {x: 0, y: 0, z: 0} + m_LocalScale: {x: 1, y: 1, z: 1} + m_ConstrainProportionsScale: 0 + m_Children: [] + m_Father: {fileID: 1053000218} + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} + m_AnchorMin: {x: 0, y: 0} + m_AnchorMax: {x: 1, y: 1} + m_AnchoredPosition: {x: 0, y: 0} + m_SizeDelta: {x: 0, y: 0} + m_Pivot: {x: 0.5, y: 0.5} +--- !u!114 &109734267 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 109734265} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: 5f7201a12d95ffc409449d95f23cf332, type: 3} + m_Name: + m_EditorClassIdentifier: + m_Material: {fileID: 0} + m_Color: {r: 0.19607843, g: 0.19607843, b: 0.19607843, a: 1} + m_RaycastTarget: 1 + m_RaycastPadding: {x: 0, y: 0, z: 0, w: 0} + m_Maskable: 1 + m_OnCullStateChanged: + m_PersistentCalls: + m_Calls: [] + m_FontData: + m_Font: {fileID: 10102, guid: 0000000000000000e000000000000000, type: 0} + m_FontSize: 40 + m_FontStyle: 0 + m_BestFit: 0 + m_MinSize: 4 + m_MaxSize: 69 + m_Alignment: 4 + m_AlignByGeometry: 0 + m_RichText: 1 + m_HorizontalOverflow: 0 + m_VerticalOverflow: 0 + m_LineSpacing: 1 + m_Text: Play Haptic +--- !u!222 &109734268 +CanvasRenderer: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 109734265} + m_CullTransparentMesh: 1 +--- !u!1 &498129365 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 498129366} + - component: {fileID: 498129368} + - component: {fileID: 498129367} + m_Layer: 5 + m_Name: Placeholder + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!224 &498129366 +RectTransform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 498129365} + m_LocalRotation: {x: -0, y: -0, z: -0, w: 1} + m_LocalPosition: {x: 0, y: 0, z: 0} + m_LocalScale: {x: 1, y: 1, z: 1} + m_ConstrainProportionsScale: 0 + m_Children: [] + m_Father: {fileID: 1660846378} + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} + m_AnchorMin: {x: 0, y: 0} + m_AnchorMax: {x: 1, y: 1} + m_AnchoredPosition: {x: 0, y: -0.5} + m_SizeDelta: {x: -20, y: -13} + m_Pivot: {x: 0.5, y: 0.5} +--- !u!114 &498129367 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 498129365} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: 5f7201a12d95ffc409449d95f23cf332, type: 3} + m_Name: + m_EditorClassIdentifier: + m_Material: {fileID: 0} + m_Color: {r: 0.19607843, g: 0.19607843, b: 0.19607843, a: 0.5} + m_RaycastTarget: 1 + m_RaycastPadding: {x: 0, y: 0, z: 0, w: 0} + m_Maskable: 1 + m_OnCullStateChanged: + m_PersistentCalls: + m_Calls: [] + m_FontData: + m_Font: {fileID: 10102, guid: 0000000000000000e000000000000000, type: 0} + m_FontSize: 35 + m_FontStyle: 0 + m_BestFit: 0 + m_MinSize: 5 + m_MaxSize: 50 + m_Alignment: 4 + m_AlignByGeometry: 0 + m_RichText: 1 + m_HorizontalOverflow: 0 + m_VerticalOverflow: 0 + m_LineSpacing: 1 + m_Text: Haptic ID +--- !u!222 &498129368 +CanvasRenderer: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 498129365} + m_CullTransparentMesh: 1 +--- !u!1 &499674478 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 499674479} + - component: {fileID: 499674480} + m_Layer: 5 + m_Name: Content + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!224 &499674479 +RectTransform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 499674478} + m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} + m_LocalPosition: {x: 0, y: 0, z: 0} + m_LocalScale: {x: 1, y: 1, z: 1} + m_ConstrainProportionsScale: 0 + m_Children: + - {fileID: 1660846378} + - {fileID: 1053000218} + m_Father: {fileID: 1757585525} + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} + m_AnchorMin: {x: 0.5, y: 0.5} + m_AnchorMax: {x: 0.5, y: 0.5} + m_AnchoredPosition: {x: 0, y: 0} + m_SizeDelta: {x: 250, y: 80} + m_Pivot: {x: 0.5, y: 0.5} +--- !u!114 &499674480 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 499674478} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: 59f8146938fff824cb5fd77236b75775, type: 3} + m_Name: + m_EditorClassIdentifier: + m_Padding: + m_Left: 0 + m_Right: 0 + m_Top: 0 + m_Bottom: 0 + m_ChildAlignment: 0 + m_Spacing: 20 + m_ChildForceExpandWidth: 1 + m_ChildForceExpandHeight: 1 + m_ChildControlWidth: 0 + m_ChildControlHeight: 0 + m_ChildScaleWidth: 0 + m_ChildScaleHeight: 0 + m_ReverseArrangement: 0 --- !u!1 &705507993 GameObject: m_ObjectHideFlags: 0 @@ -216,6 +438,85 @@ Transform: m_Children: [] m_Father: {fileID: 0} m_LocalEulerAnglesHint: {x: 50, y: -30, z: 0} +--- !u!1 &757236543 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 757236544} + - component: {fileID: 757236546} + - component: {fileID: 757236545} + m_Layer: 5 + m_Name: Text (Legacy) + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!224 &757236544 +RectTransform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 757236543} + m_LocalRotation: {x: -0, y: -0, z: -0, w: 1} + m_LocalPosition: {x: 0, y: 0, z: 0} + m_LocalScale: {x: 1, y: 1, z: 1} + m_ConstrainProportionsScale: 0 + m_Children: [] + m_Father: {fileID: 1660846378} + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} + m_AnchorMin: {x: 0, y: 0} + m_AnchorMax: {x: 1, y: 1} + m_AnchoredPosition: {x: 0, y: -0.5} + m_SizeDelta: {x: -20, y: -13} + m_Pivot: {x: 0.5, y: 0.5} +--- !u!114 &757236545 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 757236543} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: 5f7201a12d95ffc409449d95f23cf332, type: 3} + m_Name: + m_EditorClassIdentifier: + m_Material: {fileID: 0} + m_Color: {r: 0.19607843, g: 0.19607843, b: 0.19607843, a: 1} + m_RaycastTarget: 1 + m_RaycastPadding: {x: 0, y: 0, z: 0, w: 0} + m_Maskable: 1 + m_OnCullStateChanged: + m_PersistentCalls: + m_Calls: [] + m_FontData: + m_Font: {fileID: 10102, guid: 0000000000000000e000000000000000, type: 0} + m_FontSize: 35 + m_FontStyle: 0 + m_BestFit: 0 + m_MinSize: 3 + m_MaxSize: 40 + m_Alignment: 4 + m_AlignByGeometry: 0 + m_RichText: 0 + m_HorizontalOverflow: 1 + m_VerticalOverflow: 0 + m_LineSpacing: 1 + m_Text: +--- !u!222 &757236546 +CanvasRenderer: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 757236543} + m_CullTransparentMesh: 1 --- !u!1 &963194225 GameObject: m_ObjectHideFlags: 0 @@ -308,6 +609,210 @@ Transform: m_Children: [] m_Father: {fileID: 0} m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} +--- !u!1 &1053000217 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 1053000218} + - component: {fileID: 1053000221} + - component: {fileID: 1053000220} + - component: {fileID: 1053000219} + - component: {fileID: 1053000222} + m_Layer: 5 + m_Name: Button (Legacy) + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!224 &1053000218 +RectTransform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1053000217} + m_LocalRotation: {x: -0, y: -0, z: -0, w: 1} + m_LocalPosition: {x: 0, y: 0, z: 0} + m_LocalScale: {x: 1, y: 1, z: 1} + m_ConstrainProportionsScale: 0 + m_Children: + - {fileID: 109734266} + m_Father: {fileID: 499674479} + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} + m_AnchorMin: {x: 0, y: 0} + m_AnchorMax: {x: 0, y: 0} + m_AnchoredPosition: {x: 0, y: 0} + m_SizeDelta: {x: 250, y: 80} + m_Pivot: {x: 0.5, y: 0.5} +--- !u!114 &1053000219 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1053000217} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: 4e29b1a8efbd4b44bb3f3716e73f07ff, type: 3} + m_Name: + m_EditorClassIdentifier: + m_Navigation: + m_Mode: 3 + m_WrapAround: 0 + m_SelectOnUp: {fileID: 0} + m_SelectOnDown: {fileID: 0} + m_SelectOnLeft: {fileID: 0} + m_SelectOnRight: {fileID: 0} + m_Transition: 1 + m_Colors: + m_NormalColor: {r: 1, g: 1, b: 1, a: 1} + m_HighlightedColor: {r: 0.9607843, g: 0.9607843, b: 0.9607843, a: 1} + m_PressedColor: {r: 0.78431374, g: 0.78431374, b: 0.78431374, a: 1} + m_SelectedColor: {r: 0.9607843, g: 0.9607843, b: 0.9607843, a: 1} + m_DisabledColor: {r: 0.78431374, g: 0.78431374, b: 0.78431374, a: 0.5019608} + m_ColorMultiplier: 1 + m_FadeDuration: 0.1 + m_SpriteState: + m_HighlightedSprite: {fileID: 0} + m_PressedSprite: {fileID: 0} + m_SelectedSprite: {fileID: 0} + m_DisabledSprite: {fileID: 0} + m_AnimationTriggers: + m_NormalTrigger: Normal + m_HighlightedTrigger: Highlighted + m_PressedTrigger: Pressed + m_SelectedTrigger: Selected + m_DisabledTrigger: Disabled + m_Interactable: 1 + m_TargetGraphic: {fileID: 1053000220} + m_OnClick: + m_PersistentCalls: + m_Calls: [] +--- !u!114 &1053000220 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1053000217} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: fe87c0e1cc204ed48ad3b37840f39efc, type: 3} + m_Name: + m_EditorClassIdentifier: + m_Material: {fileID: 0} + m_Color: {r: 1, g: 1, b: 1, a: 1} + m_RaycastTarget: 1 + m_RaycastPadding: {x: 0, y: 0, z: 0, w: 0} + m_Maskable: 1 + m_OnCullStateChanged: + m_PersistentCalls: + m_Calls: [] + m_Sprite: {fileID: 10905, guid: 0000000000000000f000000000000000, type: 0} + m_Type: 1 + m_PreserveAspect: 0 + m_FillCenter: 1 + m_FillMethod: 4 + m_FillAmount: 1 + m_FillClockwise: 1 + m_FillOrigin: 0 + m_UseSpriteMesh: 0 + m_PixelsPerUnitMultiplier: 1 +--- !u!222 &1053000221 +CanvasRenderer: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1053000217} + m_CullTransparentMesh: 1 +--- !u!114 &1053000222 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1053000217} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: 40c403aed9b64df8a9cecc470d6788a4, type: 3} + m_Name: + m_EditorClassIdentifier: + inputField: {fileID: 1660846379} + button: {fileID: 1053000219} +--- !u!1 &1239030540 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 1239030543} + - component: {fileID: 1239030542} + - component: {fileID: 1239030541} + m_Layer: 0 + m_Name: EventSystem + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!114 &1239030541 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1239030540} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: 4f231c4fb786f3946a6b90b886c48677, type: 3} + m_Name: + m_EditorClassIdentifier: + m_SendPointerHoverToParent: 1 + m_HorizontalAxis: Horizontal + m_VerticalAxis: Vertical + m_SubmitButton: Submit + m_CancelButton: Cancel + m_InputActionsPerSecond: 10 + m_RepeatDelay: 0.5 + m_ForceModuleActive: 0 +--- !u!114 &1239030542 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1239030540} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: 76c392e42b5098c458856cdf6ecaaaa1, type: 3} + m_Name: + m_EditorClassIdentifier: + m_FirstSelected: {fileID: 0} + m_sendNavigationEvents: 1 + m_DragThreshold: 10 +--- !u!4 &1239030543 +Transform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1239030540} + serializedVersion: 2 + m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} + m_LocalPosition: {x: 0, y: 0, z: 0} + m_LocalScale: {x: 1, y: 1, z: 1} + m_ConstrainProportionsScale: 0 + m_Children: [] + m_Father: {fileID: 0} + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} --- !u!1 &1279932961 GameObject: m_ObjectHideFlags: 0 @@ -352,6 +857,254 @@ Transform: m_Children: [] m_Father: {fileID: 0} m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} +--- !u!1 &1660846377 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 1660846378} + - component: {fileID: 1660846381} + - component: {fileID: 1660846380} + - component: {fileID: 1660846379} + m_Layer: 5 + m_Name: InputField (Legacy) + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!224 &1660846378 +RectTransform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1660846377} + m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} + m_LocalPosition: {x: 0, y: 0, z: 0} + m_LocalScale: {x: 1, y: 1, z: 1} + m_ConstrainProportionsScale: 0 + m_Children: + - {fileID: 498129366} + - {fileID: 757236544} + m_Father: {fileID: 499674479} + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} + m_AnchorMin: {x: 0, y: 0} + m_AnchorMax: {x: 0, y: 0} + m_AnchoredPosition: {x: 0, y: 0} + m_SizeDelta: {x: 250, y: 80} + m_Pivot: {x: 0.5, y: 0.5} +--- !u!114 &1660846379 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1660846377} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: d199490a83bb2b844b9695cbf13b01ef, type: 3} + m_Name: + m_EditorClassIdentifier: + m_Navigation: + m_Mode: 3 + m_WrapAround: 0 + m_SelectOnUp: {fileID: 0} + m_SelectOnDown: {fileID: 0} + m_SelectOnLeft: {fileID: 0} + m_SelectOnRight: {fileID: 0} + m_Transition: 1 + m_Colors: + m_NormalColor: {r: 1, g: 1, b: 1, a: 1} + m_HighlightedColor: {r: 0.9607843, g: 0.9607843, b: 0.9607843, a: 1} + m_PressedColor: {r: 0.78431374, g: 0.78431374, b: 0.78431374, a: 1} + m_SelectedColor: {r: 0.9607843, g: 0.9607843, b: 0.9607843, a: 1} + m_DisabledColor: {r: 0.78431374, g: 0.78431374, b: 0.78431374, a: 0.5019608} + m_ColorMultiplier: 1 + m_FadeDuration: 0.1 + m_SpriteState: + m_HighlightedSprite: {fileID: 0} + m_PressedSprite: {fileID: 0} + m_SelectedSprite: {fileID: 0} + m_DisabledSprite: {fileID: 0} + m_AnimationTriggers: + m_NormalTrigger: Normal + m_HighlightedTrigger: Highlighted + m_PressedTrigger: Pressed + m_SelectedTrigger: Selected + m_DisabledTrigger: Disabled + m_Interactable: 1 + m_TargetGraphic: {fileID: 1660846380} + m_TextComponent: {fileID: 757236545} + m_Placeholder: {fileID: 498129367} + m_ContentType: 2 + m_InputType: 0 + m_AsteriskChar: 42 + m_KeyboardType: 2 + m_LineType: 0 + m_HideMobileInput: 0 + m_CharacterValidation: 1 + m_CharacterLimit: 0 + m_OnSubmit: + m_PersistentCalls: + m_Calls: [] + m_OnDidEndEdit: + m_PersistentCalls: + m_Calls: [] + m_OnValueChanged: + m_PersistentCalls: + m_Calls: [] + m_CaretColor: {r: 0.19607843, g: 0.19607843, b: 0.19607843, a: 1} + m_CustomCaretColor: 0 + m_SelectionColor: {r: 0.65882355, g: 0.80784315, b: 1, a: 0.7529412} + m_Text: + m_CaretBlinkRate: 0.85 + m_CaretWidth: 1 + m_ReadOnly: 0 + m_ShouldActivateOnSelect: 1 +--- !u!114 &1660846380 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1660846377} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: fe87c0e1cc204ed48ad3b37840f39efc, type: 3} + m_Name: + m_EditorClassIdentifier: + m_Material: {fileID: 0} + m_Color: {r: 1, g: 1, b: 1, a: 1} + m_RaycastTarget: 1 + m_RaycastPadding: {x: 0, y: 0, z: 0, w: 0} + m_Maskable: 1 + m_OnCullStateChanged: + m_PersistentCalls: + m_Calls: [] + m_Sprite: {fileID: 10911, guid: 0000000000000000f000000000000000, type: 0} + m_Type: 1 + m_PreserveAspect: 0 + m_FillCenter: 1 + m_FillMethod: 4 + m_FillAmount: 1 + m_FillClockwise: 1 + m_FillOrigin: 0 + m_UseSpriteMesh: 0 + m_PixelsPerUnitMultiplier: 1 +--- !u!222 &1660846381 +CanvasRenderer: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1660846377} + m_CullTransparentMesh: 1 +--- !u!1 &1757585521 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 1757585525} + - component: {fileID: 1757585524} + - component: {fileID: 1757585523} + - component: {fileID: 1757585522} + m_Layer: 5 + m_Name: Canvas + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!114 &1757585522 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1757585521} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: dc42784cf147c0c48a680349fa168899, type: 3} + m_Name: + m_EditorClassIdentifier: + m_IgnoreReversedGraphics: 1 + m_BlockingObjects: 0 + m_BlockingMask: + serializedVersion: 2 + m_Bits: 4294967295 +--- !u!114 &1757585523 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1757585521} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: 0cd44c1031e13a943bb63640046fad76, type: 3} + m_Name: + m_EditorClassIdentifier: + m_UiScaleMode: 1 + m_ReferencePixelsPerUnit: 100 + m_ScaleFactor: 1 + m_ReferenceResolution: {x: 720, y: 1600} + m_ScreenMatchMode: 0 + m_MatchWidthOrHeight: 0 + m_PhysicalUnit: 3 + m_FallbackScreenDPI: 96 + m_DefaultSpriteDPI: 96 + m_DynamicPixelsPerUnit: 1 + m_PresetInfoIsWorld: 0 +--- !u!223 &1757585524 +Canvas: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1757585521} + m_Enabled: 1 + serializedVersion: 3 + m_RenderMode: 0 + m_Camera: {fileID: 0} + m_PlaneDistance: 100 + m_PixelPerfect: 0 + m_ReceivesEvents: 1 + m_OverrideSorting: 0 + m_OverridePixelPerfect: 0 + m_SortingBucketNormalizedSize: 0 + m_VertexColorAlwaysGammaSpace: 1 + m_AdditionalShaderChannelsFlag: 0 + m_UpdateRectTransformForStandalone: 0 + m_SortingLayerID: 0 + m_SortingOrder: 0 + m_TargetDisplay: 0 +--- !u!224 &1757585525 +RectTransform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1757585521} + m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} + m_LocalPosition: {x: 0, y: 0, z: 0} + m_LocalScale: {x: 0, y: 0, z: 0} + m_ConstrainProportionsScale: 0 + m_Children: + - {fileID: 499674479} + m_Father: {fileID: 0} + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} + m_AnchorMin: {x: 0, y: 0} + m_AnchorMax: {x: 0, y: 0} + m_AnchoredPosition: {x: 0, y: 0} + m_SizeDelta: {x: 0, y: 0} + m_Pivot: {x: 0, y: 0} --- !u!1660057539 &9223372036854775807 SceneRoots: m_ObjectHideFlags: 0 @@ -359,3 +1112,5 @@ SceneRoots: - {fileID: 963194228} - {fileID: 705507995} - {fileID: 1279932963} + - {fileID: 1757585525} + - {fileID: 1239030543} diff --git a/Assets/Scripts/OCES/Haptic/Handwritten/HandwrittenDefinitions.cs b/Assets/Scripts/OCES/Haptic/Handwritten/HandwrittenDefinitions.cs index f3579d5..fa11f17 100644 --- a/Assets/Scripts/OCES/Haptic/Handwritten/HandwrittenDefinitions.cs +++ b/Assets/Scripts/OCES/Haptic/Handwritten/HandwrittenDefinitions.cs @@ -11,8 +11,36 @@ namespace OCES.Haptic public enum HapticType { Preset = 0, //播放预制 - Transient = 1, //播放瞬时 - Continuous = 2, //播放连续 + Emphasis = 1, //播放瞬时 + Constant = 2, //播放连续 Advance = 3, //播放文件 } + + /// + /// 文件操作类 + /// + public static class FileManager + { + /// + /// 从内存流中读取二进制 + /// + /// + /// + /// + public static bool ReadBinaryDataFromBytes(byte[] bytes, ref IBinarySerializable data) + { + if (bytes == null) + return false; + using (MemoryStream memoryStream = new(bytes)) + { + using (var br = new BinaryReader(memoryStream)) + { + data.DeSerialize(br); + br.Close(); + } + memoryStream.Close(); + } + return true; + } + } } diff --git a/Assets/Scripts/OCES/Haptic/Handwritten/HapticSystem.cs b/Assets/Scripts/OCES/Haptic/Handwritten/HapticSystem.cs index e28cdb7..2ce7b4a 100644 --- a/Assets/Scripts/OCES/Haptic/Handwritten/HapticSystem.cs +++ b/Assets/Scripts/OCES/Haptic/Handwritten/HapticSystem.cs @@ -1,12 +1,138 @@ +using System; using System.Collections; using System.Collections.Generic; +using Lofelt.NiceVibrations; using UnityEngine; namespace OCES.Haptic { public class HapticSystem : MonoBehaviour { + public static HapticSystem Instance {get; private set;} + [NonSerialized] + public bool IsHapticSupported = DeviceCapabilities.isVersionSupported; + [NonSerialized] + public bool IsMeetsAdvanceRequirements = DeviceCapabilities.meetsAdvancedRequirements; + HapticObjectConfig m_hapticObjects; + const string k_hapticConfigPath = "HapticData/"; + const string k_hapticResourcesPath = "Haptics/"; + public void Play(uint hapticId, bool isDirectCall = true) + { + HapticObject hapticObject = this.m_hapticObjects.QueryById(hapticId); + if (hapticObject != null) + { + Play(hapticObject); + if (isDirectCall) + { + Debug.LogWarning($"[Haptic System] Playing haptic id {hapticId} without play audio." + + "This method should only be called during debugging."); + } + } + else + { + Debug.LogError("[Haptic System] Could not find Haptic Object with id: " + hapticId); + } + + } + + public void Play(HapticObject hapticObject) + { + switch (hapticObject.Type) + { + case HapticType.Preset: + if (Enum.TryParse(hapticObject.Payload, out HapticPatterns.PresetType hapticPattern)) + { + HapticPatterns.PlayPreset(hapticPattern); + } + else + { + Debug.LogError($"[Haptic System] Could not parse haptic pattern: {hapticObject.Payload}]"); + } + break; + case HapticType.Emphasis: + if (hapticObject.Amplitude < 0f || hapticObject.Frequency < 0f) + { + Debug.LogWarning($"[Haptic System] Haptic {hapticObject.Id} have no amplitude or frequency." + + "Please check the datatable."); + break; + } + HapticPatterns.PlayEmphasis(hapticObject.Amplitude, hapticObject.Frequency); + break; + case HapticType.Constant: + if (hapticObject.Amplitude < 0f || hapticObject.Frequency < 0f || hapticObject.Duration < 0f) + { + Debug.LogWarning($"[Haptic System] Haptic {hapticObject.Id} have no amplitude, frequency or duration." + + "Please check the datatable."); + break; + } + HapticController.Stop(); + HapticPatterns.PlayConstant(hapticObject.Amplitude, hapticObject.Frequency, hapticObject.Duration); + break; + case HapticType.Advance: + if (Enum.TryParse(hapticObject.FallbackPreset, out HapticPatterns.PresetType fallbackPreset)) + { + HapticController.fallbackPreset = fallbackPreset; + HapticClip hapticClip = GetHapticClip(hapticObject); + if (hapticClip) + { + HapticController.Stop(); + HapticController.Play(hapticClip); + } + else + { + Debug.LogError($"[Haptic System] Could not parse haptic file: {hapticObject.Payload}"); + } + } + else + { + Debug.LogError($"[Haptic System] Could not parse fallback preset: {hapticObject.FallbackPreset}]"); + } + break; + default: + throw new ArgumentOutOfRangeException(); + } + + } + + public void Stop() + { + HapticController.Stop(); + } + + void Awake() + { + if (Instance && Instance != this) + { + Destroy(gameObject); + return; + } + Instance = this; + DontDestroyOnLoad(gameObject); + + this.m_hapticObjects = HapticConfigLoader.Load(k_hapticConfigPath + "HapticObject"); + } + + static HapticClip GetHapticClip(HapticObject hapticObject) + { + return Resources.Load(k_hapticResourcesPath + hapticObject.Payload); + } + + static class HapticConfigLoader + { + internal static T Load(string tableName) where T : IBinarySerializable, new() + { + TextAsset bytes = Resources.Load(tableName); + if (!bytes) + Debug.LogError($"未找到表 {tableName}"); + IBinarySerializable data = new T(); + bool readOk = FileManager.ReadBinaryDataFromBytes(bytes.bytes, ref data); + if (readOk) + return (T)data; + Debug.LogError($"{tableName} 解析出错,类型 {typeof(T)}"); + return default; + } + } } } diff --git a/Assets/Scripts/OCES/Haptic/HapticInvoker.cs b/Assets/Scripts/OCES/Haptic/HapticInvoker.cs new file mode 100644 index 0000000..9579e91 --- /dev/null +++ b/Assets/Scripts/OCES/Haptic/HapticInvoker.cs @@ -0,0 +1,40 @@ +using System; +using UnityEngine; +using UnityEngine.UI; + +namespace OCES.Haptic +{ + public class HapticInvoker : MonoBehaviour + { + public InputField inputField; + public Button button; + + uint m_hapticId; + + void OnEnable() + { + this.inputField.onSubmit.AddListener(GetCurrentHapticId); + this.inputField.onEndEdit.AddListener(GetCurrentHapticId); + this.button.onClick.AddListener(InvokeHaptic); + } + + void OnDisable() + { + this.inputField.onSubmit.RemoveListener(GetCurrentHapticId); + this.inputField.onEndEdit.RemoveListener(GetCurrentHapticId); + this.button.onClick.RemoveListener(InvokeHaptic); + } + + void GetCurrentHapticId(string value) + { + if(string.IsNullOrEmpty(value)) return; + + this.m_hapticId = uint.Parse(value); + } + + void InvokeHaptic() + { + HapticSystem.Instance.Play(this.m_hapticId); + } + } +} diff --git a/Assets/Scripts/OCES/Haptic/HapticInvoker.cs.meta b/Assets/Scripts/OCES/Haptic/HapticInvoker.cs.meta new file mode 100644 index 0000000..7b15fd8 --- /dev/null +++ b/Assets/Scripts/OCES/Haptic/HapticInvoker.cs.meta @@ -0,0 +1,3 @@ +fileFormatVersion: 2 +guid: 40c403aed9b64df8a9cecc470d6788a4 +timeCreated: 1775717470 \ No newline at end of file diff --git a/ProjectSettings/ProjectSettings.asset b/ProjectSettings/ProjectSettings.asset index ab5677a..b2879c5 100644 --- a/ProjectSettings/ProjectSettings.asset +++ b/ProjectSettings/ProjectSettings.asset @@ -9,10 +9,10 @@ PlayerSettings: AndroidFilterTouchesWhenObscured: 0 AndroidEnableSustainedPerformanceMode: 0 defaultScreenOrientation: 4 - targetDevice: 2 + targetDevice: 0 useOnDemandResources: 0 accelerometerFrequency: 60 - companyName: DefaultCompany + companyName: oces productName: HapticSystem defaultCursor: {fileID: 0} cursorHotspot: {x: 0, y: 0} @@ -164,6 +164,8 @@ PlayerSettings: androidMaxAspectRatio: 2.1 applicationIdentifier: Android: com.DefaultCompany.HapticSystem + Standalone: com.oces.HapticSystem + iPhone: com.oces.HapticSystem buildNumber: Standalone: 0 VisionOS: 0