1
0
forked from cgvr/DeltaVR

32 Commits

Author SHA1 Message Date
4e55b7e9ab made shape scanner ray colliders higher 2026-03-25 13:46:57 +02:00
dea42068f7 cafe gen items slightly smaller 2026-03-25 13:38:30 +02:00
b021fd0110 remove whisper-small, add and use whisper base EN 2026-03-25 13:03:22 +02:00
7b45d623d1 add whisper-small and whisper-tiny, use tiny 2026-03-23 10:09:58 +02:00
f42356dd7a remove mic buffer clearing functionality 2026-03-23 09:55:58 +02:00
50002adb61 remove audio loopback functionality 2026-03-23 09:22:20 +02:00
ee629e2593 assigned correct collision layer to tutorial cubes 2026-03-20 14:51:27 +02:00
4796869a29 professor final voice line comes from himself, not radio 2026-03-20 14:50:15 +02:00
398f22efdd added 'END PLAYBACK' to removing strings 2026-03-17 10:36:12 +02:00
b40b075540 update TODO 2026-03-16 15:59:54 +02:00
cad4c2cbbc mouth animation correctly plays even if previous voiceline is interrupted 2026-03-16 15:40:31 +02:00
6a77893ed7 archery range npc voicelines for completing round and submitting name 2026-03-16 15:32:46 +02:00
439094f74a professor says thank you after player enters room 2026-03-16 15:09:14 +02:00
c78886e492 professor says good job after first config done 2026-03-16 14:59:10 +02:00
3edef118af add new voiceline files, remove FMOD cache folder 2026-03-16 14:23:02 +02:00
d6c2878491 simplify shape scanner code 2026-03-16 12:31:43 +02:00
f101de5390 remove SelectExit from shape scanner 2026-03-16 12:29:07 +02:00
58d5f24069 delete copy scene 2026-03-16 12:06:53 +02:00
2c8c146a5f fixed bug with shape scanner destroying not whole scannable object, deleted Parent-GeneratedModel objects from scene 2026-03-16 12:04:03 +02:00
db60947749 fix shapescanner incorrect ray counting and make asynchronous 2026-03-16 11:28:58 +02:00
717964affd fixed bug with radio not recording voice 2026-03-15 12:40:27 +02:00
e0492595e1 moved spawn point to cgvr lab, adjusted tp points heights 2026-03-14 17:43:43 +02:00
e56e3f3618 cheat keys also rotate player after teleport 2026-03-12 19:08:05 +02:00
fc083e7d81 npcs turn towards the player separately from being aggroed 2026-03-12 18:57:30 +02:00
a6a6b036ca reduced shape scanner conf count, fix bug with HUD 2026-03-12 18:07:55 +02:00
b1fe32bdf2 professor has his own radio 2026-03-12 17:32:53 +02:00
6e9e5cb4d4 releasing radio button starts feeding silence into Whisper stream 2026-03-12 17:16:34 +02:00
f6b46784bf archery range mic particles slower, wider cone area, shorter lifetime 2026-03-12 16:37:38 +02:00
fca8453a26 continuous collision for cafe spawned objects 2026-03-12 16:32:47 +02:00
07e42ea60b treat more words as positive, make serving tray larger 2026-03-12 16:27:58 +02:00
d85953e02f radio button is pressable only when radio is held 2026-03-12 16:10:49 +02:00
d969d3b77c update readme 2026-03-11 18:10:36 +02:00
530 changed files with 2812 additions and 298 deletions

3
.gitignore vendored
View File

@@ -104,6 +104,9 @@ NetrworkManagerUI.prefab.meta
CustomNetworkManager.prefab CustomNetworkManager.prefab
CustomNetworkManager.prefab.meta CustomNetworkManager.prefab.meta
#FMOD Studio
DeltaVRFMOD/.cache
# Project-specific files # Project-specific files
config.json config.json

View File

@@ -1,26 +1,24 @@
### TODO ### TODO
* korralik teleportation minigame'idesse, kasutades TeleportProviderit, nagu button * pidev krabamise heli, kui kahe käega korraga krabada: "(Un)requesting ownership of Cube"
* quest marker peaks jätma nähtavad noolekesed enda liikumise teele
* teha build kus archery range'is spawnitud objektid
* FMOD ChannelControl errorid * FMOD ChannelControl errorid
* keyboard numbrid ei tööta pärast minigame'i completemist?
* speech-to-text: * speech-to-text:
* vahepeal lakkab töötamast lih??? tundub et siis kui pikalt tühjust salvestab? ei, vahepeal läheb kohe alguses ka
* sööta talle nulle kui on disabled, sest ikka kuidagi tuvastab eelnevat rääkimist
* uurida miks buildis Whisper halvemini töötab * uurida miks buildis Whisper halvemini töötab
* proovida suuremat Whisperi mudelit, äkki töötab mürases keskkonnas paremini
* npc character: * npc character:
* klaas on näha temast eespool * klaas on näha temast eespool
* voicelines: list listidest, mille hulgast saab valida
* shape detection: * shape detection:
* ring liiga raske
* professor võiks öelda "good job, continue..." pärast esimest successi
* kui kõik configurationid tehtud, siis professor ütleb "thank you"
* peab mängijale kuidagi selgitama, kuidas scale'ida prinditud objekte * peab mängijale kuidagi selgitama, kuidas scale'ida prinditud objekte
* prinditud objekti scale'imisele min ja max size limiit * prinditud objekti scale'imisele min ja max size limiit
* 3d printerile soft particle'id, et ei oleks teravaid ääri seina sisse minnes
* archery range: * archery range:
* archery targetite rework, et buildis ka töötaks
* võiks jääda kordama viimast instruktsiooni, kui mängija ei progressi edasi * võiks jääda kordama viimast instruktsiooni, kui mängija ei progressi edasi
* kui archery range läbi, võiks npc öelda "good job, try again..." * UFO möödalendamise animation/cutscene alguses kui ütleb "delta attacked by ufos" + panna juba alguses kapsli sisse ufo pöörlema
* cafe: * cafe:
* võiks saada hinnata saadud tellimust * võiks saada hinnata saadud tellimust
* npc võiks olla keeratud sinu poole juba kaugelt * "order again" nupp
Can't/Won't Do: Can't/Won't Do:
* glTF loading: vahetada ära shader Universal render pipeline Lit, mitte panna buildi kaasa glTf oma - **ei saa, objekt on siis ilma tekstuurita, lihtsalt hall** * glTF loading: vahetada ära shader Universal render pipeline Lit, mitte panna buildi kaasa glTf oma - **ei saa, objekt on siis ilma tekstuurita, lihtsalt hall**
@@ -34,3 +32,8 @@ Can't/Won't Do:
* Getting Whisper stream to work with FMOD instead of Unity default audio * Getting Whisper stream to work with FMOD instead of Unity default audio
* TRELLIS: added functionality to specify texture baking optimisation total steps as an argument (`texture_opt_total_steps`), to replace the hardcoded 2500. But this is not tracked in Git (because modified this https://github.com/IgorAherne/trellis-stable-projectorz/releases/tag/latest) * TRELLIS: added functionality to specify texture baking optimisation total steps as an argument (`texture_opt_total_steps`), to replace the hardcoded 2500. But this is not tracked in Git (because modified this https://github.com/IgorAherne/trellis-stable-projectorz/releases/tag/latest)
* Custom Shader Variant Collection to include glTF-pbrMetallicRoughness shader in build * Custom Shader Variant Collection to include glTF-pbrMetallicRoughness shader in build
Katse tähelepanekud:
* peab väga proper english accenti tegema
* mõne inimese puhul kuuleb "cat" asemel "cut"
* kui helitugevus oli liiga suur siis cafe waiter kuulis kohviku taustaheli taldriku klirinat kui "piano music"

View File

@@ -6,9 +6,17 @@ import numpy as np
FRAME_DURATION = 0.02 # 20 ms windows FRAME_DURATION = 0.02 # 20 ms windows
GAIN = 1.0 # multiply RMS values (set to e.g. 30.0 if you want larger values) GAIN = 1.0 # multiply RMS values (set to e.g. 30.0 if you want larger values)
EXTENSION = ".txt" # output file extension EXTENSION = ".txt" # output file extension
OVERWRITE = False # set True to regenerate even if .txt exists
def process_wav(filepath): def process_wav(filepath):
# Compute output path first (so we can decide whether to skip)
out_path = os.path.splitext(filepath)[0] + EXTENSION
if not OVERWRITE and os.path.exists(out_path):
print(f"Skipping (already exists): {out_path}")
return
print(f"Processing: {filepath}") print(f"Processing: {filepath}")
# Load audio # Load audio
@@ -29,7 +37,6 @@ def process_wav(filepath):
rms = rms * GAIN rms = rms * GAIN
# Save to .txt # Save to .txt
out_path = os.path.splitext(filepath)[0] + EXTENSION
np.savetxt(out_path, rms, fmt="%.8f") np.savetxt(out_path, rms, fmt="%.8f")
print(f"Saved RMS → {out_path}") print(f"Saved RMS → {out_path}")

View File

@@ -0,0 +1,242 @@
0.00000005
0.00000003
0.00000000
0.00000000
0.00000000
0.00036824
0.03882600
0.04177133
0.02403286
0.09960490
0.10405141
0.07374308
0.07527987
0.03196403
0.01316589
0.01331185
0.03220127
0.12253414
0.14686617
0.12083520
0.10250615
0.04661508
0.01492038
0.01040760
0.01080491
0.03343014
0.03452057
0.08047014
0.13933837
0.10572984
0.09591001
0.09608150
0.08540177
0.09933743
0.10790430
0.11058167
0.13160037
0.06650670
0.03915674
0.03693420
0.04971446
0.03620111
0.06649657
0.11552364
0.10445996
0.09714538
0.08278799
0.09152920
0.08658629
0.05098534
0.02467363
0.02987090
0.02563231
0.02510932
0.02980772
0.02069706
0.01281166
0.00566670
0.00150570
0.00020095
0.00000742
0.00000009
0.00000012
0.00000011
0.00000010
0.00000010
0.00000009
0.00000022
0.00000005
0.00001097
0.04429267
0.09924962
0.09210955
0.10632528
0.10751414
0.06163353
0.05821634
0.06596723
0.04842441
0.05856047
0.10333158
0.10103170
0.08816345
0.04771255
0.04730519
0.04158855
0.05243348
0.05098458
0.03500115
0.08092596
0.09854711
0.04113061
0.01454402
0.01907839
0.03828202
0.05046624
0.04319734
0.03666504
0.04976141
0.10466427
0.13796268
0.06061497
0.07129071
0.05450837
0.05630979
0.03684894
0.01367352
0.00608366
0.06432867
0.11517638
0.05077915
0.02521306
0.09515605
0.10619617
0.08939873
0.07993037
0.04875693
0.01546201
0.00356502
0.00079084
0.02424777
0.06102380
0.11638185
0.07587082
0.02516444
0.00761989
0.00276396
0.00242381
0.11056973
0.12456685
0.11282478
0.09799541
0.08472683
0.07964602
0.05019686
0.03458880
0.06462081
0.13280798
0.10013983
0.07293872
0.04550291
0.01720131
0.00380182
0.00101899
0.02245994
0.06382865
0.10524299
0.13267922
0.10135622
0.05452089
0.03518274
0.01694293
0.00530868
0.00184345
0.02273818
0.11510796
0.11920995
0.08493148
0.08406932
0.07499230
0.04316685
0.01455623
0.00360244
0.00098371
0.00005477
0.00000010
0.00000002
0.00000016
0.00000019
0.00000010
0.00000005
0.00000003
0.00000004
0.00000005
0.00000004
0.00000005
0.00000005
0.00000005
0.00000005
0.00000004
0.00000004
0.00000004
0.00000004
0.00000003
0.00000003
0.00000003
0.00000003
0.00000002
0.00000003
0.00000001
0.00000001
0.00000001
0.00000001
0.00000001
0.00000000
0.00000001
0.00000000
0.00000000
0.00000000
0.00000000
0.00000000
0.00000000
0.00000000
0.00000000
0.00464831
0.01679505
0.01644613
0.00761335
0.04794521
0.15165883
0.14422260
0.11421057
0.10831729
0.10226198
0.09510653
0.08230808
0.06091324
0.08704218
0.11292138
0.11823592
0.07064166
0.08501519
0.10195074
0.08617997
0.09215603
0.08520056
0.07150462
0.07387789
0.07179367
0.07710328
0.09889054
0.11394204
0.12855592
0.09594936
0.05344614
0.02629551
0.00702043
0.00639688
0.00356133
0.00343324
0.00178488
0.00017040

View File

@@ -1,5 +1,5 @@
fileFormatVersion: 2 fileFormatVersion: 2
guid: d9e3dd6a9520c354e998bd0ad3a81f46 guid: 38bc01876ee396a46b03ca91e612e687
DefaultImporter: DefaultImporter:
externalObjects: {} externalObjects: {}
userData: userData:

View File

@@ -0,0 +1,7 @@
fileFormatVersion: 2
guid: 42e58ab8243a8c3449d391cc548d895c
DefaultImporter:
externalObjects: {}
userData:
assetBundleName:
assetBundleVariant:

View File

@@ -0,0 +1,257 @@
0.00000005
0.00000003
0.00000000
0.00000000
0.00000000
0.00000000
0.00000000
0.00000000
0.00000000
0.00000000
0.02866505
0.03807113
0.04488242
0.10851473
0.09911134
0.08479626
0.10611577
0.12813284
0.08128907
0.07260925
0.04148039
0.01129543
0.03132603
0.04842420
0.12944126
0.12574370
0.09939571
0.08343700
0.04287383
0.01194310
0.00638063
0.00868709
0.01998390
0.03058048
0.05329744
0.13083695
0.12668352
0.10024661
0.10386836
0.08472306
0.11218496
0.14319295
0.13648318
0.13254981
0.04781179
0.03629516
0.03413614
0.03457404
0.03213657
0.05343652
0.09439317
0.12365869
0.09173419
0.09353486
0.07192323
0.03836626
0.01338022
0.00760281
0.01999712
0.02072252
0.01272902
0.00845736
0.00641201
0.00285632
0.00061737
0.00005392
0.00000020
0.00000018
0.00000019
0.00000017
0.00000015
0.00000016
0.00000013
0.00000011
0.00000011
0.00000008
0.00000010
0.00000006
0.00000007
0.00000003
0.00782415
0.01642422
0.02543612
0.05934152
0.07718527
0.11592234
0.11971953
0.06149256
0.03805179
0.05762681
0.05818856
0.04659332
0.08668210
0.10497145
0.12429776
0.11524499
0.04751239
0.02633372
0.03824132
0.04337949
0.03293408
0.03691372
0.03303327
0.07757192
0.13191013
0.09265970
0.02088793
0.02473713
0.02916055
0.03506608
0.05408846
0.03094980
0.10444548
0.15158002
0.08798907
0.04625344
0.06151570
0.05407208
0.03231843
0.01555239
0.00728854
0.04916612
0.10232492
0.07878979
0.06246471
0.05366619
0.10158715
0.11886908
0.07526539
0.02821623
0.01340943
0.00232617
0.00036846
0.03731488
0.03152382
0.03894958
0.03209079
0.00981623
0.00146699
0.00014517
0.00534313
0.06100523
0.15190409
0.10988420
0.12650685
0.11347217
0.05970725
0.04618064
0.05150063
0.03090077
0.03317851
0.08775605
0.13566470
0.10128807
0.04527346
0.01804154
0.00596208
0.00167694
0.00009594
0.00012192
0.01358539
0.07102436
0.12123850
0.12106773
0.10533741
0.13110749
0.05361572
0.02358464
0.01034726
0.00343355
0.00162977
0.03254148
0.12353230
0.12104879
0.10228956
0.07902068
0.03294208
0.01555405
0.00885278
0.00349990
0.00085096
0.00030811
0.00001531
0.00000017
0.00000016
0.00000014
0.00000013
0.00000013
0.00000011
0.00000029
0.00000028
0.00000010
0.00000008
0.00000007
0.00000007
0.00000005
0.00000005
0.00000003
0.00000005
0.00000002
0.00000002
0.00000001
0.00000001
0.00000001
0.00000001
0.00000000
0.00000001
0.00000001
0.00000001
0.00000001
0.00000002
0.00000002
0.00000001
0.00000002
0.00000001
0.00000001
0.00000001
0.00000001
0.00000456
0.01129090
0.01738315
0.02089866
0.01380159
0.13116765
0.11541200
0.10767516
0.11273928
0.10450145
0.08044391
0.08610874
0.07811639
0.08932848
0.09916812
0.08233824
0.07835159
0.08648565
0.08551071
0.11009068
0.12401471
0.09915505
0.07595969
0.06414745
0.06739331
0.06131895
0.09213228
0.09952611
0.08556054
0.09036897
0.08143000
0.04082204
0.01703065
0.00659234
0.00967564
0.00593357
0.00343951
0.00107827
0.00010090

View File

@@ -0,0 +1,7 @@
fileFormatVersion: 2
guid: 5898d7a0def449d47856bcc1ca7a29d6
DefaultImporter:
externalObjects: {}
userData:
assetBundleName:
assetBundleVariant:

View File

@@ -0,0 +1,7 @@
fileFormatVersion: 2
guid: 7cb93a4fb1b04374eaf023113b75af18
DefaultImporter:
externalObjects: {}
userData:
assetBundleName:
assetBundleVariant:

View File

@@ -0,0 +1,287 @@
0.00000005
0.00000003
0.00000000
0.00000000
0.00000000
0.00000000
0.00000000
0.01041133
0.11050373
0.11571781
0.09685160
0.06781394
0.06115836
0.02671054
0.01714665
0.01123293
0.00581291
0.00527384
0.03901498
0.11867370
0.15407452
0.09560385
0.05615886
0.04482845
0.02856232
0.08357130
0.12180025
0.11046895
0.08895491
0.08778770
0.09132081
0.04692575
0.01269024
0.00540550
0.01323932
0.03548777
0.09886734
0.10633425
0.06211413
0.04629371
0.03601964
0.03145342
0.03699398
0.02851260
0.09810046
0.12985127
0.10250688
0.07980689
0.08739660
0.04454322
0.01042159
0.02879480
0.04266862
0.01084313
0.04596614
0.13443977
0.10879387
0.04520948
0.04018075
0.02624859
0.00865528
0.00220818
0.00292230
0.00325043
0.01547375
0.10285073
0.13288546
0.06569756
0.04191129
0.00984927
0.00487799
0.00717907
0.07125617
0.14066201
0.12093860
0.12668209
0.08771859
0.08893538
0.11586918
0.09410246
0.11251948
0.06581375
0.01573470
0.00798749
0.00473720
0.00184862
0.00599098
0.01365598
0.00891943
0.00741468
0.00870850
0.12349596
0.20865980
0.11312929
0.08664145
0.12243897
0.12067145
0.08424711
0.05526139
0.04627320
0.10428049
0.08349684
0.07010089
0.02950357
0.01629749
0.01049282
0.01468810
0.02427274
0.02904649
0.02663092
0.02238721
0.01449317
0.00891655
0.00328868
0.00101202
0.00018072
0.00000018
0.00000022
0.00001380
0.00340936
0.01070781
0.02272540
0.02303817
0.01339627
0.01482264
0.02972042
0.16883568
0.13453023
0.14972425
0.08440456
0.09065786
0.05294919
0.02135629
0.00819955
0.00474883
0.00529746
0.00265304
0.00225529
0.01425153
0.08025608
0.12780648
0.10383718
0.06637228
0.06980769
0.06826495
0.05187644
0.03362885
0.01408524
0.02797011
0.04798624
0.04473467
0.06783500
0.07362254
0.03932714
0.01432003
0.00567656
0.02164616
0.02448191
0.12810233
0.14456984
0.12034076
0.12263951
0.10216748
0.08076008
0.06284898
0.04605800
0.01751118
0.04122978
0.05452909
0.06921396
0.07712647
0.05760632
0.03222826
0.02906787
0.05488998
0.05686560
0.04881791
0.06627714
0.07501493
0.06122237
0.04391065
0.04513443
0.05685579
0.06692855
0.11950159
0.09488340
0.05996871
0.12589936
0.12426486
0.08167235
0.08727088
0.09361180
0.05560031
0.02492296
0.01225502
0.02261247
0.10637776
0.10854032
0.08564665
0.06367619
0.03858946
0.01254055
0.00857360
0.00521010
0.03276831
0.05026552
0.07917455
0.12885508
0.09776132
0.04524392
0.02057937
0.00684326
0.00172701
0.00501310
0.00338763
0.00062568
0.00007869
0.00000011
0.07221141
0.13406493
0.11343215
0.06939244
0.05757182
0.05019560
0.02351180
0.00653620
0.01007761
0.03060259
0.07896144
0.11751062
0.06696402
0.03085680
0.01771194
0.05062816
0.12535316
0.09691679
0.05669325
0.03652356
0.04995165
0.10247808
0.14754270
0.10729573
0.09490211
0.08105871
0.03237764
0.01436423
0.02403967
0.06067147
0.09486736
0.11827907
0.06557996
0.01828207
0.00410462
0.00560886
0.02666351
0.10461742
0.12328171
0.11638515
0.07130920
0.06859463
0.04690340
0.02583032
0.02004467
0.04906425
0.06766128
0.10911208
0.11592212
0.09715220
0.03466866
0.01872768
0.01205066
0.03613232
0.09832279
0.14594945
0.10550399
0.13000724
0.09247153
0.04398929
0.06428571
0.04855256
0.05265495
0.02728924
0.01480956
0.01000638
0.00291081
0.00050468
0.00004996

View File

@@ -0,0 +1,7 @@
fileFormatVersion: 2
guid: 7d61563367dd2174ebac733fc96d5a7c
DefaultImporter:
externalObjects: {}
userData:
assetBundleName:
assetBundleVariant:

View File

@@ -0,0 +1,7 @@
fileFormatVersion: 2
guid: 264f1b0a1d60ee44fb83104376fe62d6
DefaultImporter:
externalObjects: {}
userData:
assetBundleName:
assetBundleVariant:

View File

@@ -0,0 +1,292 @@
0.00000005
0.00000003
0.00000000
0.00000000
0.00000000
0.00000000
0.00000000
0.00000000
0.00000000
0.00017371
0.00397631
0.00645893
0.03636703
0.11108588
0.09490587
0.05810735
0.03614677
0.01433622
0.02562395
0.03500152
0.11138436
0.11492082
0.08813144
0.11754254
0.09585521
0.05497217
0.08569790
0.10671677
0.09063023
0.10238150
0.10540754
0.07553490
0.04124249
0.01229520
0.00533037
0.00913266
0.02397980
0.10611945
0.10192107
0.07391837
0.05137710
0.05373237
0.05023317
0.03660126
0.04064788
0.03359168
0.05470684
0.14775619
0.13745435
0.10754745
0.10044444
0.08634765
0.04968073
0.02235863
0.00676216
0.01762132
0.03200046
0.01515087
0.02490337
0.03465642
0.08731771
0.05780291
0.04214677
0.03614981
0.01129049
0.00178883
0.00043622
0.00002077
0.00790669
0.03906181
0.13493988
0.12611340
0.10359488
0.05120334
0.02121265
0.00780912
0.02118601
0.08881138
0.13246961
0.13096575
0.08698378
0.07840307
0.08006902
0.08267396
0.07665613
0.06423858
0.02234341
0.00549498
0.00242034
0.00047552
0.00005966
0.03320520
0.06114354
0.05643975
0.11037107
0.13888292
0.16179177
0.10823945
0.09318663
0.08210272
0.05253165
0.04468418
0.08318146
0.09999528
0.05302287
0.02463017
0.00933137
0.00975701
0.01784607
0.02833371
0.03651267
0.04211179
0.03161097
0.02936525
0.02278606
0.01299867
0.00431430
0.00138863
0.00027162
0.00000123
0.00000004
0.00000005
0.00000004
0.00073564
0.00535114
0.01484067
0.02635980
0.02197363
0.01175617
0.01850840
0.13574521
0.13955091
0.16727531
0.10608624
0.09235191
0.08989335
0.03222363
0.01007234
0.00426795
0.00493753
0.00278311
0.00285112
0.00889112
0.02711722
0.11798907
0.12569274
0.08584248
0.06597847
0.07110602
0.05414321
0.04401594
0.01751132
0.01334137
0.03514252
0.04998326
0.05386503
0.08303778
0.05580477
0.03294466
0.01155389
0.01592658
0.01961545
0.04122524
0.14904048
0.13972428
0.12943657
0.10712221
0.08562635
0.07122923
0.05961891
0.02759550
0.01993110
0.04310589
0.07547285
0.08173466
0.06247975
0.04214621
0.03760689
0.03115748
0.05670190
0.05714985
0.06260712
0.07415769
0.07433423
0.05062892
0.04170515
0.04818286
0.05886082
0.10128240
0.10150870
0.05131475
0.11870202
0.12748007
0.09922212
0.09134800
0.11311474
0.05401089
0.04061917
0.01249508
0.00948702
0.04186318
0.11898167
0.09532230
0.09337173
0.04848767
0.02473678
0.01069614
0.00484177
0.01662082
0.04742326
0.06200481
0.12276933
0.10882907
0.08602326
0.03015586
0.00973329
0.00328402
0.00226518
0.00784843
0.00278660
0.00034507
0.00005544
0.00514254
0.11737227
0.11911432
0.06987587
0.06208072
0.05524339
0.03672045
0.01023218
0.00268005
0.02696391
0.03711095
0.11534176
0.07793026
0.06439523
0.02477391
0.02580977
0.12326863
0.10718736
0.06945094
0.04225161
0.04650784
0.05684860
0.14646806
0.12088709
0.10804930
0.09149216
0.06569657
0.01902741
0.00708923
0.03978205
0.06555759
0.13457091
0.07263914
0.03940162
0.01395208
0.00407308
0.00785582
0.07307136
0.14730501
0.12630911
0.09076075
0.05463418
0.05033695
0.03686942
0.02131259
0.03664210
0.03732653
0.07706883
0.10262816
0.11299729
0.08176315
0.03037785
0.01326680
0.01651880
0.08489019
0.12672557
0.12814839
0.13081826
0.10027778
0.06042381
0.05928643
0.04862963
0.05942964
0.03829884
0.02554955
0.01399406
0.00600915
0.00526958
0.00088941
0.00000848

View File

@@ -0,0 +1,7 @@
fileFormatVersion: 2
guid: 0a12bca9c495f844788cac4b3dc01528
DefaultImporter:
externalObjects: {}
userData:
assetBundleName:
assetBundleVariant:

View File

@@ -0,0 +1,7 @@
fileFormatVersion: 2
guid: 8ff483912820c0c458c2960593f32d01
DefaultImporter:
externalObjects: {}
userData:
assetBundleName:
assetBundleVariant:

View File

@@ -0,0 +1,306 @@
0.00000005
0.00000003
0.00000000
0.00000000
0.00008677
0.02555647
0.06356105
0.06754274
0.12535521
0.11968394
0.10654067
0.08807448
0.03094069
0.01887335
0.04522886
0.10707195
0.10807064
0.11986617
0.15139525
0.12412844
0.08856518
0.09356070
0.09514336
0.07740945
0.06272630
0.05835729
0.05653152
0.04069148
0.02248743
0.00993187
0.00186555
0.00107107
0.00120904
0.00187453
0.00111695
0.00004033
0.00000578
0.00000037
0.00000047
0.00000041
0.00000041
0.00000036
0.00000037
0.00000030
0.00000033
0.00000027
0.00000021
0.00000026
0.00000013
0.00000017
0.00000012
0.00000011
0.01054585
0.05012132
0.13717458
0.13160563
0.06083952
0.03850145
0.06312518
0.08917529
0.07733954
0.03812576
0.02091784
0.02317895
0.09112280
0.10568590
0.05461230
0.01764572
0.00752449
0.00855657
0.01883113
0.11905217
0.15466592
0.14110537
0.12407092
0.09104393
0.06492120
0.05765026
0.03929679
0.01446094
0.01584649
0.01906035
0.00225289
0.03853673
0.04068287
0.12364593
0.11614482
0.09028992
0.06433237
0.02383663
0.01381440
0.00635609
0.01836661
0.02473579
0.11016511
0.10806321
0.03348883
0.01009692
0.03878922
0.07220570
0.08639481
0.07928380
0.10606322
0.10445405
0.11997829
0.09822565
0.08011347
0.04837793
0.03226493
0.03607234
0.03278252
0.03711180
0.06834672
0.07951122
0.08939215
0.08045211
0.06378602
0.03623512
0.03542983
0.13810526
0.13145922
0.08724828
0.07982137
0.07484215
0.06310783
0.03040927
0.02398604
0.01799416
0.01170484
0.00820995
0.00466642
0.00173959
0.00026183
0.00000286
0.00000056
0.00000045
0.00000036
0.00000037
0.00000035
0.00000034
0.00000032
0.00000030
0.00000027
0.00000027
0.00000023
0.00000022
0.00000018
0.00000018
0.00000013
0.00000013
0.00000010
0.00000010
0.00000008
0.00000004
0.00000004
0.00000003
0.00000002
0.00000003
0.00000003
0.00000002
0.00000002
0.00000004
0.00000002
0.01210695
0.03104685
0.09687874
0.10992987
0.06612710
0.05232693
0.07025713
0.07789180
0.05726887
0.05102119
0.05531616
0.07071804
0.07324490
0.12500001
0.13551877
0.11463275
0.09164570
0.07969173
0.08745047
0.09294610
0.08758718
0.04984579
0.01199116
0.01887675
0.01864040
0.07235581
0.10418790
0.03615440
0.00980441
0.00221446
0.03594533
0.06812992
0.11332203
0.06093310
0.05594898
0.06496126
0.08740044
0.12233238
0.09580570
0.04772820
0.02361993
0.01078867
0.03802064
0.07909553
0.08012012
0.07333743
0.05754400
0.05097869
0.07664723
0.05694538
0.04448567
0.09419085
0.06582000
0.06082845
0.03704552
0.02209460
0.00290526
0.00198855
0.00014714
0.00000098
0.00000014
0.00000015
0.00003012
0.00101211
0.00025446
0.00000087
0.00000012
0.00000008
0.00000007
0.00000005
0.00017385
0.00057944
0.00056784
0.00059026
0.00004644
0.01499533
0.03538585
0.06983574
0.06200712
0.06784921
0.06938390
0.08049586
0.07614776
0.05881132
0.11806823
0.15041181
0.12342727
0.11753254
0.10245495
0.09522798
0.09911717
0.09732006
0.07817753
0.08756886
0.05415813
0.02474579
0.02446261
0.11357070
0.11718469
0.09938256
0.08500034
0.07520326
0.07641556
0.06648254
0.06731120
0.07971697
0.08603772
0.05109902
0.09391770
0.12228667
0.05145732
0.05202519
0.06156273
0.01560635
0.00427968
0.02421295
0.03267565
0.07683574
0.02789398
0.01183625
0.01795142
0.02549900
0.04912534
0.10022978
0.09703911
0.06528247
0.05660536
0.05310062
0.02857801
0.00309033
0.00894551
0.02781632
0.00307855
0.00136751
0.01259168
0.03591923
0.02849875
0.03123168
0.01485326
0.00356870
0.00102485
0.00086726
0.00025258

View File

@@ -0,0 +1,7 @@
fileFormatVersion: 2
guid: 9e4ecb709f95cd241a9c5dc5558ab3b7
DefaultImporter:
externalObjects: {}
userData:
assetBundleName:
assetBundleVariant:

View File

@@ -0,0 +1,7 @@
fileFormatVersion: 2
guid: 5aa14328feee8ad47a37f50a3b07ae47
DefaultImporter:
externalObjects: {}
userData:
assetBundleName:
assetBundleVariant:

View File

@@ -0,0 +1,309 @@
0.00000005
0.00000003
0.00000002
0.00000004
0.00001575
0.00056058
0.10512087
0.06247878
0.13907126
0.10796085
0.08928745
0.04296236
0.01589850
0.03041418
0.09944262
0.09935775
0.09998433
0.11296503
0.11884489
0.10825495
0.09847742
0.08814481
0.09157983
0.09493581
0.08478543
0.06469711
0.06443882
0.04607481
0.01910205
0.00103388
0.00010046
0.00071292
0.00033006
0.00008951
0.00007941
0.00000031
0.00011136
0.00000019
0.00000021
0.00000018
0.00000026
0.00000008
0.00000014
0.00000015
0.00000016
0.00000012
0.00000009
0.00000007
0.00000006
0.00000005
0.00000004
0.00000002
0.00000002
0.00005185
0.00000828
0.02832398
0.12830395
0.16844831
0.12687734
0.06460033
0.01894131
0.03220102
0.05880868
0.06527510
0.05140930
0.03658038
0.01398638
0.02421561
0.08997451
0.08377688
0.02418836
0.00973439
0.00599007
0.00905722
0.02651637
0.10164079
0.14320731
0.12904300
0.11029114
0.07977970
0.05571616
0.06751201
0.01764874
0.00617195
0.02489195
0.01025172
0.00284820
0.04030944
0.02575630
0.11017919
0.11959197
0.06856420
0.03276161
0.01958396
0.01616774
0.02088996
0.05009602
0.07843453
0.06901982
0.02250954
0.01337707
0.02803325
0.06195528
0.07357799
0.06418665
0.09644670
0.09922776
0.11329394
0.10822823
0.09179486
0.06035907
0.05104551
0.03396708
0.05817677
0.06630339
0.04054824
0.07112641
0.05802667
0.06763632
0.06566662
0.05350130
0.03097204
0.01398106
0.03965144
0.13338506
0.14704359
0.09780610
0.06288150
0.05591090
0.05028389
0.02308469
0.02326990
0.01427633
0.01059657
0.00597096
0.00265677
0.00096331
0.00027705
0.00081122
0.00029532
0.00003557
0.00000033
0.00000033
0.00000032
0.00000030
0.00000028
0.00000030
0.00000022
0.00000023
0.00000021
0.00000018
0.00000015
0.00000015
0.00000014
0.00000010
0.00000007
0.00000008
0.00000004
0.00000004
0.00000002
0.00000002
0.00000002
0.00000002
0.00000002
0.00008707
0.00058412
0.00013537
0.00000516
0.02347101
0.04357265
0.11365347
0.08669745
0.05095782
0.06836279
0.07590245
0.07837829
0.06091340
0.05027740
0.07152368
0.12868381
0.13290957
0.11694506
0.10228214
0.10048629
0.08879036
0.03953559
0.01065895
0.02042474
0.02315973
0.05589612
0.10023368
0.05182547
0.00905302
0.00198392
0.02186030
0.04189350
0.14410524
0.09991421
0.04756368
0.06668478
0.09321541
0.11032545
0.10434034
0.08342411
0.03306899
0.01367741
0.06044695
0.09034430
0.06164889
0.06296910
0.05844286
0.04815272
0.05400948
0.07309759
0.08802762
0.15068236
0.11547473
0.05514836
0.03452749
0.01822943
0.00416943
0.00182502
0.00100153
0.00051689
0.00018493
0.00159059
0.00043061
0.00000588
0.00000041
0.00000057
0.00000034
0.00000041
0.00015376
0.00000841
0.00085780
0.01958037
0.03508846
0.08052298
0.05665231
0.05217534
0.07203114
0.06636944
0.06487500
0.06899809
0.05801162
0.13297467
0.10661902
0.09435981
0.09961571
0.10622018
0.11464507
0.10977937
0.09725338
0.09613403
0.07686792
0.04782833
0.04779501
0.02959961
0.04014716
0.10748242
0.09299997
0.08187937
0.08289372
0.10451850
0.09585603
0.10306562
0.09885249
0.09429167
0.08828995
0.08491156
0.05210634
0.06902108
0.06840731
0.03392952
0.05985209
0.05023765
0.01092744
0.00683205
0.02457151
0.09223298
0.04956920
0.01651768
0.00484253
0.00325285
0.01828707
0.03094625
0.08162503
0.09403877
0.07717906
0.05836591
0.07295292
0.03507503
0.00875005
0.00378138
0.01026982
0.00332591
0.00306266
0.01591836
0.03091518
0.02433426
0.02051376
0.00947862
0.00142537
0.00069377
0.00004064
0.00000018
0.00000003
0.00000002
0.00007110

View File

@@ -0,0 +1,7 @@
fileFormatVersion: 2
guid: d0ebb29a4c0d68b4da17bc19e7384990
DefaultImporter:
externalObjects: {}
userData:
assetBundleName:
assetBundleVariant:

View File

@@ -0,0 +1,7 @@
fileFormatVersion: 2
guid: 97f150ec0d3d48a4db1ea667fe05b072
DefaultImporter:
externalObjects: {}
userData:
assetBundleName:
assetBundleVariant:

View File

@@ -0,0 +1,293 @@
0.00000006
0.00000004
0.00000000
0.00000876
0.00000012
0.00004277
0.05436340
0.17665382
0.12990713
0.12583591
0.13277286
0.13517515
0.12306246
0.12600669
0.12459808
0.10394835
0.09309749
0.09333178
0.07643553
0.05511052
0.04393115
0.02941259
0.03382056
0.02038616
0.01548435
0.01363530
0.01174366
0.00893834
0.00600578
0.00371616
0.00200703
0.00146441
0.00025279
0.00000120
0.00000023
0.00000033
0.00000023
0.00000020
0.00000020
0.00000015
0.00000013
0.00000013
0.00000010
0.00000008
0.00000008
0.00011547
0.03884210
0.11290570
0.14032798
0.11392568
0.10667438
0.11704497
0.08145794
0.03876734
0.01617737
0.00410597
0.03786850
0.01552934
0.08146030
0.12936532
0.10310936
0.04261066
0.01968959
0.01155729
0.01246085
0.01643562
0.02611092
0.06975007
0.06647281
0.04812134
0.06127471
0.04931017
0.05622455
0.09936404
0.13729018
0.09841577
0.05966850
0.01680984
0.00261750
0.00143242
0.01419471
0.04943705
0.04137772
0.03587830
0.03199233
0.03906901
0.03574416
0.03229308
0.03190199
0.04779297
0.04261694
0.04245671
0.04589238
0.05662980
0.05274693
0.05354149
0.04374932
0.03250221
0.01861564
0.01963406
0.00308434
0.00011245
0.00000138
0.00004786
0.00000296
0.00000008
0.00040744
0.01232126
0.00401640
0.00080837
0.00001568
0.00000014
0.00000001
0.00000000
0.00000001
0.00000000
0.00000001
0.00000001
0.00000001
0.00000001
0.00000001
0.00000001
0.00000001
0.00000001
0.00000001
0.00000001
0.00000001
0.00000001
0.00000001
0.00137698
0.00120946
0.00037309
0.00001546
0.00019473
0.05597774
0.05349650
0.07315911
0.10007664
0.12148964
0.10390536
0.11813873
0.12236188
0.07448173
0.07163881
0.03668909
0.00482586
0.00674204
0.03587620
0.16254307
0.15529911
0.04756048
0.01177680
0.00713155
0.09382056
0.10292054
0.16375251
0.13605520
0.05452843
0.09455058
0.12224557
0.13256259
0.09879588
0.06324653
0.02657961
0.01032267
0.00230831
0.02871299
0.07454104
0.13230723
0.08707617
0.04283587
0.02152865
0.08970764
0.15705778
0.13232288
0.11249097
0.12094339
0.09471517
0.08165064
0.05688582
0.06236089
0.06496719
0.07772935
0.07066742
0.06583010
0.06023704
0.05579713
0.03196885
0.02167577
0.00885445
0.00054829
0.00120143
0.05003724
0.05701566
0.05554289
0.06652608
0.06286423
0.07321317
0.10022882
0.08733696
0.05627337
0.00893717
0.05115506
0.02904028
0.03742857
0.05691869
0.04722928
0.04761178
0.11284457
0.06448554
0.01647628
0.00811301
0.00184246
0.00095617
0.03380137
0.05253933
0.09993897
0.08770414
0.06539877
0.06725874
0.05866503
0.02927921
0.00474572
0.00449728
0.00220470
0.03732991
0.16716687
0.13160835
0.11313587
0.09361040
0.08533838
0.05350770
0.01132886
0.00188624
0.00224469
0.04322987
0.14946128
0.11786281
0.09559109
0.08745537
0.06887340
0.06453345
0.14468354
0.15365960
0.08112232
0.05636847
0.05092329
0.06082837
0.05791784
0.03492959
0.01728887
0.01145544
0.03110087
0.06301248
0.08440568
0.02886192
0.02436969
0.06101014
0.06737709
0.12571132
0.13595617
0.11148004
0.02669337
0.00637604
0.00583108
0.04190948
0.12353806
0.13185968
0.10900982
0.09392569
0.07719076
0.06124953
0.04566133
0.03477211
0.02629414
0.02993021
0.03762943
0.05084812
0.03652138
0.05007470
0.11358684
0.14574684
0.11534683
0.09708887
0.06805480
0.04739871
0.04391212
0.04065108
0.02693054
0.01430396
0.00508704
0.00183298
0.00007207

View File

@@ -0,0 +1,7 @@
fileFormatVersion: 2
guid: 62632355e21a84c4c84e476062ab8670
DefaultImporter:
externalObjects: {}
userData:
assetBundleName:
assetBundleVariant:

View File

@@ -0,0 +1,7 @@
fileFormatVersion: 2
guid: 7a43d69a404558844883b6d1e9ccc6a6
DefaultImporter:
externalObjects: {}
userData:
assetBundleName:
assetBundleVariant:

View File

@@ -0,0 +1,268 @@
0.00000005
0.00000003
0.00240253
0.02907968
0.10503523
0.13422142
0.12195620
0.13128196
0.13441545
0.10902201
0.11511548
0.12498570
0.10779791
0.08748529
0.09270831
0.08885102
0.07140992
0.07817293
0.05512253
0.07312962
0.05332483
0.02952465
0.00628433
0.00322687
0.01116481
0.02963358
0.09202230
0.10785520
0.09845226
0.10343045
0.09329684
0.04513930
0.02688077
0.01212403
0.04465980
0.02088372
0.02843172
0.14170074
0.14037681
0.08236120
0.02720438
0.01238582
0.01198153
0.01171427
0.04087922
0.11383022
0.10109381
0.08515322
0.04896748
0.04567009
0.02929136
0.06172283
0.11550593
0.09598164
0.07837296
0.02478683
0.00525718
0.00181524
0.00970324
0.07209075
0.09798092
0.07967266
0.06513842
0.05123381
0.05027419
0.04282681
0.04678136
0.06629726
0.04876049
0.04369129
0.03766395
0.04394144
0.04186778
0.05153219
0.04662358
0.03369124
0.02084255
0.01368451
0.00168093
0.00043239
0.00004149
0.00041319
0.00029644
0.00001294
0.00009876
0.01724320
0.00515795
0.00088585
0.00000051
0.00000013
0.00000001
0.00000002
0.00000002
0.00000002
0.00029903
0.00017885
0.00173300
0.03660622
0.08778569
0.08299683
0.08249202
0.07836448
0.07183830
0.09798677
0.10288965
0.07641125
0.07789677
0.06810252
0.00654751
0.00414498
0.01800906
0.10378619
0.10797114
0.02479648
0.00965088
0.01219227
0.07751130
0.11227150
0.14128794
0.06956887
0.05905581
0.10559428
0.11890519
0.08814315
0.05743459
0.02042473
0.00343255
0.02520813
0.04550547
0.11568366
0.09366174
0.04345708
0.03914818
0.07486159
0.13059510
0.15400928
0.13821089
0.12171482
0.10681405
0.08661242
0.06828332
0.04075309
0.05218672
0.07257383
0.07887270
0.08816109
0.09971622
0.08168958
0.05080761
0.02718288
0.00490109
0.00417936
0.01302431
0.01342031
0.01449505
0.01702639
0.01002846
0.00135636
0.00615288
0.00988699
0.05511121
0.13424085
0.13549428
0.12707625
0.10175641
0.09349026
0.08078031
0.10017768
0.09641082
0.05651959
0.02388979
0.03372757
0.02807933
0.06420366
0.05765516
0.10705915
0.12931576
0.06605592
0.01316365
0.00862626
0.00548033
0.00231362
0.05162323
0.02771896
0.04052469
0.06053808
0.04970683
0.04813053
0.03046989
0.00504421
0.00297387
0.00175442
0.03428232
0.16087463
0.14309265
0.11838740
0.07561675
0.07153413
0.06790428
0.03115408
0.00911597
0.03592220
0.12518162
0.14040351
0.13036409
0.08447693
0.08117232
0.06552082
0.09590764
0.13285699
0.12561189
0.06799156
0.04766290
0.04445734
0.03842782
0.02435055
0.01544531
0.01147488
0.01724531
0.10274742
0.08165291
0.02878892
0.04548312
0.05494404
0.07406324
0.12911624
0.12757473
0.11833390
0.03788988
0.01097155
0.00298281
0.00275654
0.02835943
0.14801164
0.12368125
0.11705162
0.08316845
0.07073751
0.07032350
0.07200280
0.05796322
0.03717402
0.02600084
0.02813455
0.03365216
0.03137246
0.02250615
0.06806763
0.12442078
0.12454491
0.12151590
0.09865309
0.07201285
0.05476528
0.04899836
0.04472922
0.04327874
0.03483583
0.02293462
0.01217319
0.00345893
0.00050839
0.00024330
0.00011198
0.00018678
0.00008502
0.00005998
0.00000075

View File

@@ -0,0 +1,7 @@
fileFormatVersion: 2
guid: 6789c915ab4332b4f9a2a5e01a0b1d32
DefaultImporter:
externalObjects: {}
userData:
assetBundleName:
assetBundleVariant:

View File

@@ -0,0 +1,7 @@
fileFormatVersion: 2
guid: 7bb958a26428f774dae23140e390d603
DefaultImporter:
externalObjects: {}
userData:
assetBundleName:
assetBundleVariant:

Binary file not shown.

View File

@@ -0,0 +1,7 @@
fileFormatVersion: 2
guid: 4fef61b9ad4f7eb488ea2657f1cc700e
DefaultImporter:
externalObjects: {}
userData:
assetBundleName:
assetBundleVariant:

Binary file not shown.

View File

@@ -0,0 +1,7 @@
fileFormatVersion: 2
guid: 6f5a0c98d09a6dc4d9d570e23dc96ab9
DefaultImporter:
externalObjects: {}
userData:
assetBundleName:
assetBundleVariant:

View File

@@ -85,7 +85,6 @@ public class ArcheryRange : NetworkBehaviour
_presentPlayers.Remove(exitedPlayer); // Shifts others left automatically _presentPlayers.Remove(exitedPlayer); // Shifts others left automatically
if (exitedPlayer == _scoredPlayer) keyboardManager.DeActivate(); // If the player <20>refuses to enter their name. if (exitedPlayer == _scoredPlayer) keyboardManager.DeActivate(); // If the player <20>refuses to enter their name.
} }

View File

@@ -8,6 +8,11 @@ public class KeyboardManager : NetworkBehaviour
{ {
public enum ShiftMode { Lowercase, NextUppercase, Uppercase } public enum ShiftMode { Lowercase, NextUppercase, Uppercase }
public delegate void OnActivateDelegate();
public event OnActivateDelegate OnActivate;
public delegate void OnSubmitDelegate();
public event OnSubmitDelegate OnSubmit;
[Header("UI References")] [Header("UI References")]
public TMP_Text nameTextField; public TMP_Text nameTextField;
public TMP_Text scoreTextField; public TMP_Text scoreTextField;
@@ -57,6 +62,7 @@ public class KeyboardManager : NetworkBehaviour
gameObject.transform.position = assignedTransform.position; gameObject.transform.position = assignedTransform.position;
gameObject.transform.rotation = assignedTransform.rotation; gameObject.transform.rotation = assignedTransform.rotation;
OnActivate?.Invoke();
} }
public void DeActivate() public void DeActivate()
@@ -64,7 +70,7 @@ public class KeyboardManager : NetworkBehaviour
gameObject.SetActive(false); gameObject.SetActive(false);
} }
private void addToInput(string newInput) private void AddToInput(string newInput)
{ {
if (_input.Length < inputTextLimit) if (_input.Length < inputTextLimit)
@@ -82,13 +88,13 @@ public class KeyboardManager : NetworkBehaviour
switch (_shiftMode) switch (_shiftMode)
{ {
case ShiftMode.Lowercase: case ShiftMode.Lowercase:
addToInput(letter.ToLower()); AddToInput(letter.ToLower());
break; break;
case ShiftMode.Uppercase: case ShiftMode.Uppercase:
addToInput(letter.ToUpper()); AddToInput(letter.ToUpper());
break; break;
case ShiftMode.NextUppercase: case ShiftMode.NextUppercase:
addToInput(letter.ToUpper()); AddToInput(letter.ToUpper());
_shiftMode = ShiftMode.Lowercase; _shiftMode = ShiftMode.Lowercase;
UpdateKeyLabels(); UpdateKeyLabels();
break; break;
@@ -124,6 +130,7 @@ public class KeyboardManager : NetworkBehaviour
void OnEnterPressed() void OnEnterPressed()
{ {
AudioManager.Instance.PlayAttachedInstance(FMODEvents.Instance.LetterEnter, enterButton.gameObject); AudioManager.Instance.PlayAttachedInstance(FMODEvents.Instance.LetterEnter, enterButton.gameObject);
OnSubmit?.Invoke();
if (_input.Length > 0) if (_input.Length > 0)
{ {
@@ -136,7 +143,7 @@ public class KeyboardManager : NetworkBehaviour
{ {
AudioManager.Instance.PlayAttachedInstance(FMODEvents.Instance.LetterEnter, spaceButton.gameObject); AudioManager.Instance.PlayAttachedInstance(FMODEvents.Instance.LetterEnter, spaceButton.gameObject);
addToInput(" "); AddToInput(" ");
UpdateOutput(); UpdateOutput();
} }

View File

@@ -10365,6 +10365,11 @@ PrefabInstance:
propertyPath: leftHand propertyPath: leftHand
value: value:
objectReference: {fileID: 8597422041532106397} objectReference: {fileID: 8597422041532106397}
- target: {fileID: 3290095342561961842, guid: d90913a7f0b00844a8c4482b2afc2c66,
type: 3}
propertyPath: m_Enabled
value: 1
objectReference: {fileID: 0}
- target: {fileID: 3290095342561961842, guid: d90913a7f0b00844a8c4482b2afc2c66, - target: {fileID: 3290095342561961842, guid: d90913a7f0b00844a8c4482b2afc2c66,
type: 3} type: 3}
propertyPath: rightHand propertyPath: rightHand
@@ -10390,6 +10395,11 @@ PrefabInstance:
propertyPath: m_Name propertyPath: m_Name
value: TutorialController value: TutorialController
objectReference: {fileID: 0} objectReference: {fileID: 0}
- target: {fileID: 6405559763661037305, guid: d90913a7f0b00844a8c4482b2afc2c66,
type: 3}
propertyPath: m_IsActive
value: 1
objectReference: {fileID: 0}
m_RemovedComponents: [] m_RemovedComponents: []
m_RemovedGameObjects: [] m_RemovedGameObjects: []
m_AddedGameObjects: [] m_AddedGameObjects: []

View File

@@ -168,20 +168,14 @@ public class TutorialAudioListener : MonoBehaviour
private EventReference GetGrabEvent(GrabSoundType type) private EventReference GetGrabEvent(GrabSoundType type)
{ {
switch (type) return type switch
{ {
case GrabSoundType.Bow: GrabSoundType.Bow => FMODEvents.Instance.BowGrab,
return FMODEvents.Instance.BowGrab; GrabSoundType.Sprayer => FMODEvents.Instance.SprayerGrab,
case GrabSoundType.Sprayer:
return FMODEvents.Instance.SprayerGrab;
//Add more objects for grabbing here and do not forget to define them in FMODEvents.cs //Add more objects for grabbing here and do not forget to define them in FMODEvents.cs
//Add the GrabAudioProfile.cs component to an object instance //Add the GrabAudioProfile.cs component to an object instance
_ => FMODEvents.Instance.DefaultGrab,
default: };
return FMODEvents.Instance.DefaultGrab;
}
} }
private void HandleGrab(XRGrabInteractable grab) private void HandleGrab(XRGrabInteractable grab)
@@ -195,10 +189,6 @@ public class TutorialAudioListener : MonoBehaviour
: GrabSoundType.Default; : GrabSoundType.Default;
EventReference grabEvent = GetGrabEvent(type); EventReference grabEvent = GetGrabEvent(type);
Debug.Log(grabEvent);
AudioManager.Instance.PlayAttachedInstance(grabEvent, grab.gameObject); AudioManager.Instance.PlayAttachedInstance(grabEvent, grab.gameObject);
} }
} }

View File

@@ -31,6 +31,7 @@ namespace _PROJECT.NewHandPresence
private XRControllerHintController _leftHintController; private XRControllerHintController _leftHintController;
private XRControllerHintController _rightHintController; private XRControllerHintController _rightHintController;
private XRBaseInteractor lastInteractor = null;
private SmartHandPresence _leftSmartHandPresence; private SmartHandPresence _leftSmartHandPresence;
private SmartHandPresence _rightSmartHandPresence; private SmartHandPresence _rightSmartHandPresence;
@@ -244,16 +245,22 @@ namespace _PROJECT.NewHandPresence
StopCoroutine(initializationInfoCoroutine); StopCoroutine(initializationInfoCoroutine);
} }
private void OnGripPerformed(SelectEnterEventArgs arg0) private void OnGripPerformed(SelectEnterEventArgs args)
{ {
var grab = arg0.interactableObject as XRGrabInteractable;
// Notify any listeners var interactor = args.interactorObject as XRBaseInteractor;
OnGrab?.Invoke(grab); var interactable = args.interactableObject as XRGrabInteractable;
if (_state != TutorialState.Grip) return; if (lastInteractor == interactor)
Debug.Log("Grip performed"); return; // same hand grabbing again
UpdateState(_state.Next());
lastInteractor = interactor;
OnGrab?.Invoke(interactable as XRGrabInteractable);
if (_state == TutorialState.Grip)
UpdateState(_state.Next());
} }
private void OnTeleportPerformed(LocomotionSystem obj) private void OnTeleportPerformed(LocomotionSystem obj)

View File

@@ -93,6 +93,7 @@ GameObject:
- component: {fileID: 7699707098595015193} - component: {fileID: 7699707098595015193}
- component: {fileID: 1413215456818694348} - component: {fileID: 1413215456818694348}
- component: {fileID: 483845010817450077} - component: {fileID: 483845010817450077}
- component: {fileID: 8646891389811022226}
m_Layer: 0 m_Layer: 0
m_Name: ArcheryRangeNPC m_Name: ArcheryRangeNPC
m_TagString: Untagged m_TagString: Untagged
@@ -267,7 +268,7 @@ MonoBehaviour:
_initializeOrder: 0 _initializeOrder: 0
_defaultDespawnType: 0 _defaultDespawnType: 0
NetworkObserver: {fileID: 0} NetworkObserver: {fileID: 0}
<PrefabId>k__BackingField: 18 <PrefabId>k__BackingField: 6
<SpawnableCollectionId>k__BackingField: 0 <SpawnableCollectionId>k__BackingField: 0
_scenePathHash: 0 _scenePathHash: 0
<SceneId>k__BackingField: 0 <SceneId>k__BackingField: 0
@@ -465,6 +466,27 @@ MonoBehaviour:
X: 0 X: 0
Y: 0 Y: 0
Z: 0 Z: 0
--- !u!135 &8646891389811022226
SphereCollider:
m_ObjectHideFlags: 0
m_CorrespondingSourceObject: {fileID: 0}
m_PrefabInstance: {fileID: 0}
m_PrefabAsset: {fileID: 0}
m_GameObject: {fileID: 4663194936290788516}
m_Material: {fileID: 0}
m_IncludeLayers:
serializedVersion: 2
m_Bits: 0
m_ExcludeLayers:
serializedVersion: 2
m_Bits: 0
m_LayerOverridePriority: 0
m_IsTrigger: 1
m_ProvidesContacts: 0
m_Enabled: 1
serializedVersion: 3
m_Radius: 5
m_Center: {x: 0, y: 0, z: 0}
--- !u!1 &7802421088258943189 --- !u!1 &7802421088258943189
GameObject: GameObject:
m_ObjectHideFlags: 0 m_ObjectHideFlags: 0

View File

@@ -195,6 +195,7 @@ GameObject:
- component: {fileID: 7699707098595015193} - component: {fileID: 7699707098595015193}
- component: {fileID: 1413215456818694348} - component: {fileID: 1413215456818694348}
- component: {fileID: 483845010817450077} - component: {fileID: 483845010817450077}
- component: {fileID: 8270600859684143550}
m_Layer: 0 m_Layer: 0
m_Name: CafeWaiterNPC m_Name: CafeWaiterNPC
m_TagString: Untagged m_TagString: Untagged
@@ -270,7 +271,7 @@ MonoBehaviour:
m_FallbackScreenDPI: 96 m_FallbackScreenDPI: 96
m_DefaultSpriteDPI: 96 m_DefaultSpriteDPI: 96
m_DynamicPixelsPerUnit: 1 m_DynamicPixelsPerUnit: 1
m_PresetInfoIsWorld: 1 m_PresetInfoIsWorld: 0
--- !u!114 &6105090838799004608 --- !u!114 &6105090838799004608
MonoBehaviour: MonoBehaviour:
m_ObjectHideFlags: 0 m_ObjectHideFlags: 0
@@ -569,6 +570,27 @@ MonoBehaviour:
X: 0 X: 0
Y: 0 Y: 0
Z: 0 Z: 0
--- !u!135 &8270600859684143550
SphereCollider:
m_ObjectHideFlags: 0
m_CorrespondingSourceObject: {fileID: 0}
m_PrefabInstance: {fileID: 0}
m_PrefabAsset: {fileID: 0}
m_GameObject: {fileID: 4663194936290788516}
m_Material: {fileID: 0}
m_IncludeLayers:
serializedVersion: 2
m_Bits: 0
m_ExcludeLayers:
serializedVersion: 2
m_Bits: 0
m_LayerOverridePriority: 0
m_IsTrigger: 1
m_ProvidesContacts: 0
m_Enabled: 1
serializedVersion: 3
m_Radius: 5
m_Center: {x: 0, y: 0, z: 0}
--- !u!1 &7802421088258943189 --- !u!1 &7802421088258943189
GameObject: GameObject:
m_ObjectHideFlags: 0 m_ObjectHideFlags: 0

View File

@@ -93,6 +93,7 @@ GameObject:
- component: {fileID: 1653195237934660084} - component: {fileID: 1653195237934660084}
- component: {fileID: 1413215456818694348} - component: {fileID: 1413215456818694348}
- component: {fileID: 483845010817450077} - component: {fileID: 483845010817450077}
- component: {fileID: 1179918406964740421}
m_Layer: 0 m_Layer: 0
m_Name: ShapeDetectionNPC m_Name: ShapeDetectionNPC
m_TagString: Untagged m_TagString: Untagged
@@ -233,10 +234,14 @@ MonoBehaviour:
questMarker: {fileID: 0} questMarker: {fileID: 0}
radio: {fileID: 0} radio: {fileID: 0}
computerKeyboardKey: {fileID: 0} computerKeyboardKey: {fileID: 0}
computerPrinter: {fileID: 0}
printerInsertionHole: {fileID: 0} printerInsertionHole: {fileID: 0}
computerPrinter: {fileID: 0}
shapeScanner: {fileID: 0} shapeScanner: {fileID: 0}
staticRadio: {fileID: 0}
questMarkerPoint: {fileID: 0}
radioAmount: 1 radioAmount: 1
movementPath: []
moveSpeedPerSecond: 2
--- !u!114 &1413215456818694348 --- !u!114 &1413215456818694348
MonoBehaviour: MonoBehaviour:
m_ObjectHideFlags: 0 m_ObjectHideFlags: 0
@@ -459,6 +464,27 @@ MonoBehaviour:
X: 0 X: 0
Y: 0 Y: 0
Z: 0 Z: 0
--- !u!135 &1179918406964740421
SphereCollider:
m_ObjectHideFlags: 0
m_CorrespondingSourceObject: {fileID: 0}
m_PrefabInstance: {fileID: 0}
m_PrefabAsset: {fileID: 0}
m_GameObject: {fileID: 4663194936290788516}
m_Material: {fileID: 0}
m_IncludeLayers:
serializedVersion: 2
m_Bits: 0
m_ExcludeLayers:
serializedVersion: 2
m_Bits: 0
m_LayerOverridePriority: 0
m_IsTrigger: 1
m_ProvidesContacts: 0
m_Enabled: 1
serializedVersion: 3
m_Radius: 5
m_Center: {x: 0, y: 0, z: 0}
--- !u!1 &7802421088258943189 --- !u!1 &7802421088258943189
GameObject: GameObject:
m_ObjectHideFlags: 0 m_ObjectHideFlags: 0

View File

@@ -29,7 +29,7 @@ Transform:
m_GameObject: {fileID: 1659788510314838016} m_GameObject: {fileID: 1659788510314838016}
m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} m_LocalRotation: {x: 0, y: 0, z: 0, w: 1}
m_LocalPosition: {x: 0, y: 0, z: 0} m_LocalPosition: {x: 0, y: 0, z: 0}
m_LocalScale: {x: 0.4, y: 0.35, z: 0.4} m_LocalScale: {x: 0.4, y: 0.38386, z: 0.4}
m_ConstrainProportionsScale: 0 m_ConstrainProportionsScale: 0
m_Children: m_Children:
- {fileID: 4211436824399037528} - {fileID: 4211436824399037528}
@@ -149,7 +149,7 @@ Transform:
m_PrefabAsset: {fileID: 0} m_PrefabAsset: {fileID: 0}
m_GameObject: {fileID: 4039766663692926199} m_GameObject: {fileID: 4039766663692926199}
m_LocalRotation: {x: -0, y: 0.000000014901158, z: -0, w: 1} m_LocalRotation: {x: -0, y: 0.000000014901158, z: -0, w: 1}
m_LocalPosition: {x: 0, y: 0, z: 0} m_LocalPosition: {x: 0, y: -0.36, z: 0}
m_LocalScale: {x: 1, y: 1, z: 1} m_LocalScale: {x: 1, y: 1, z: 1}
m_ConstrainProportionsScale: 0 m_ConstrainProportionsScale: 0
m_Children: [] m_Children: []

View File

@@ -4,9 +4,9 @@ using System.Runtime.InteropServices;
using UnityEngine; using UnityEngine;
using FMOD; using FMOD;
using FMODUnity; using FMODUnity;
using Whisper; // WhisperManager, WhisperStream, WhisperResult using Whisper;
using Whisper.Utils; using Whisper.Utils;
using Debug = UnityEngine.Debug; // AudioChunk using Debug = UnityEngine.Debug;
/// <summary> /// <summary>
/// FMOD mic is initialized once (Start) and runs continuously in a ring buffer. /// FMOD mic is initialized once (Start) and runs continuously in a ring buffer.
@@ -28,12 +28,6 @@ public class FMODWhisperBridge : MonoBehaviour
public int channels = 1; public int channels = 1;
[Range(1, 10)] public int bufferLengthSec = 5; [Range(1, 10)] public int bufferLengthSec = 5;
[Header("Loopback (monitor your voice)")]
public bool playLoopback = true;
[Tooltip("If true, loopback plays only while active; otherwise its always on.")]
public bool loopbackOnlyWhenActive = true;
[Range(0f, 2f)] public float loopbackVolume = 1.0f;
public delegate void OnWhisperSegmentUpdatedDelegate(string result); public delegate void OnWhisperSegmentUpdatedDelegate(string result);
public event OnWhisperSegmentUpdatedDelegate OnWhisperSegmentUpdated; public event OnWhisperSegmentUpdatedDelegate OnWhisperSegmentUpdated;
@@ -44,7 +38,6 @@ public class FMODWhisperBridge : MonoBehaviour
private FMOD.System _core; private FMOD.System _core;
private Sound _recSound; private Sound _recSound;
private Channel _playChannel; private Channel _playChannel;
private ChannelGroup _masterGroup;
private uint _soundPcmLength; // in samples private uint _soundPcmLength; // in samples
private int _nativeRate; private int _nativeRate;
private int _nativeChannels; private int _nativeChannels;
@@ -54,7 +47,6 @@ public class FMODWhisperBridge : MonoBehaviour
// Whisper // Whisper
private WhisperStream _stream; private WhisperStream _stream;
private bool _streamStarted;
// temp conversion buffer // temp conversion buffer
private float[] _floatTmp = new float[0]; private float[] _floatTmp = new float[0];
@@ -138,24 +130,6 @@ public class FMODWhisperBridge : MonoBehaviour
_core.getRecordPosition(recordDriverId, out _lastRecordPos); _core.getRecordPosition(recordDriverId, out _lastRecordPos);
Debug.Log("[FMOD→Whisper] Recording started."); Debug.Log("[FMOD→Whisper] Recording started.");
// Loopback channel (optional). Start once; pause when inactive if desired.
_core.getMasterChannelGroup(out _masterGroup);
if (playLoopback)
{
res = _core.playSound(_recSound, _masterGroup, false, out _playChannel);
if (res == RESULT.OK && _playChannel.hasHandle())
{
_playChannel.setMode(MODE._2D);
_playChannel.setVolume(loopbackVolume);
if (loopbackOnlyWhenActive) _playChannel.setPaused(true); // keep muted until Activate
Debug.Log("[FMOD→Whisper] Loopback playback ready.");
}
else
{
Debug.LogWarning($"[FMOD→Whisper] playSound failed or channel invalid: {res}");
}
}
// No Whisper stream here. It will be created on ActivateRecording(). // No Whisper stream here. It will be created on ActivateRecording().
await System.Threading.Tasks.Task.Yield(); await System.Threading.Tasks.Task.Yield();
} }
@@ -179,6 +153,11 @@ public class FMODWhisperBridge : MonoBehaviour
int rate = (_nativeRate > 0) ? _nativeRate : desiredSampleRate; int rate = (_nativeRate > 0) ? _nativeRate : desiredSampleRate;
if (_stream != null)
{
_stream.StopStream();
}
try try
{ {
_stream = await whisper.CreateStream(rate, _nativeChannels); _stream = await whisper.CreateStream(rate, _nativeChannels);
@@ -187,7 +166,6 @@ public class FMODWhisperBridge : MonoBehaviour
{ {
Debug.LogError($"[FMOD→Whisper] CreateStream exception: {e}"); Debug.LogError($"[FMOD→Whisper] CreateStream exception: {e}");
_stream = null; _stream = null;
_streamStarted = false;
return; return;
} }
@@ -208,16 +186,6 @@ public class FMODWhisperBridge : MonoBehaviour
whisper.useVad = useVadInStream; whisper.useVad = useVadInStream;
_stream.StartStream(); _stream.StartStream();
_streamStarted = true;
// --- NEW: Clear the ring buffer and reset read pointer ---
// Pause loopback while we clear (optional, but avoids clicks)
if (playLoopback && _playChannel.hasHandle())
_playChannel.setPaused(true);
// Clear buffer bytes
ClearRecordRingBuffer();
// Reset our read pointer to the current write head // Reset our read pointer to the current write head
_core.getRecordPosition(recordDriverId, out _lastRecordPos); _core.getRecordPosition(recordDriverId, out _lastRecordPos);
@@ -225,13 +193,8 @@ public class FMODWhisperBridge : MonoBehaviour
// Well skip feeding for one frame to guarantee a clean start // Well skip feeding for one frame to guarantee a clean start
_skipOneFeedFrame = true; _skipOneFeedFrame = true;
// Unpause loopback if we want it active during recording
if (playLoopback && _playChannel.hasHandle() && (!loopbackOnlyWhenActive || isRecordingActivated))
_playChannel.setPaused(loopbackOnlyWhenActive ? false : _playChannel.getPaused(out var paused) == FMOD.RESULT.OK && paused ? false : false);
isRecordingActivated = true; isRecordingActivated = true;
Debug.Log("[FMOD→Whisper] Stream activated (buffer cleared; reading from current head)."); Debug.Log("[FMOD→Whisper] Stream activated (buffer cleared; reading from current head).");
} }
/// <summary> /// <summary>
@@ -239,24 +202,10 @@ public class FMODWhisperBridge : MonoBehaviour
/// </summary> /// </summary>
public void DeactivateRecording() public void DeactivateRecording()
{ {
if (!isRecordingActivated && !_streamStarted) if (!isRecordingActivated)
return; return;
isRecordingActivated = false; isRecordingActivated = false;
// Pause loopback if it should only be active during recording
if (playLoopback && loopbackOnlyWhenActive && _playChannel.hasHandle())
_playChannel.setPaused(true);
// Tear down Whisper stream
if (_streamStarted)
{
try { _stream.StopStream(); } catch { /* ignore */ }
_streamStarted = false;
}
_stream = null;
Debug.Log("[FMOD→Whisper] Stream deactivated (Whisper stopped; FMOD still recording).");
} }
/// <summary> /// <summary>
@@ -281,7 +230,6 @@ public class FMODWhisperBridge : MonoBehaviour
return Mathf.Clamp01(Mathf.InverseLerp(-60f, -15f, db)); return Mathf.Clamp01(Mathf.InverseLerp(-60f, -15f, db));
} }
private void Update() private void Update()
{ {
// Always tick FMOD // Always tick FMOD
@@ -289,8 +237,7 @@ public class FMODWhisperBridge : MonoBehaviour
if (!_recSound.hasHandle()) return; if (!_recSound.hasHandle()) return;
// Compute how many samples recorded since last frame. // Compute how many samples recorded since last frame.
uint recPos; _core.getRecordPosition(recordDriverId, out uint recPos);
_core.getRecordPosition(recordDriverId, out recPos);
uint deltaSamples = (recPos >= _lastRecordPos) uint deltaSamples = (recPos >= _lastRecordPos)
? (recPos - _lastRecordPos) ? (recPos - _lastRecordPos)
@@ -303,10 +250,6 @@ public class FMODWhisperBridge : MonoBehaviour
return; return;
} }
// If not active, we *still* advance the ring (so we don't backlog data),
// but we *don't* push chunks to Whisper.
bool shouldFeed = isRecordingActivated && _streamStarted && _stream != null;
// Calculate byte range to lock (16-bit) // Calculate byte range to lock (16-bit)
uint bytesToRead = deltaSamples * (uint)_nativeChannels * 2; // 2 bytes per sample uint bytesToRead = deltaSamples * (uint)_nativeChannels * 2; // 2 bytes per sample
uint startBytes = _lastRecordPos * (uint)_nativeChannels * 2; uint startBytes = _lastRecordPos * (uint)_nativeChannels * 2;
@@ -323,7 +266,6 @@ public class FMODWhisperBridge : MonoBehaviour
try try
{ {
float rmsAccumulator = 0f; float rmsAccumulator = 0f;
int rmsSampleCount = 0; int rmsSampleCount = 0;
@@ -345,11 +287,21 @@ public class FMODWhisperBridge : MonoBehaviour
currentVolumeRms = Mathf.Lerp(currentVolumeRms, rms, 1f - Mathf.Pow(1f - volumeSmoothing, Time.deltaTime * 60f)); currentVolumeRms = Mathf.Lerp(currentVolumeRms, rms, 1f - Mathf.Pow(1f - volumeSmoothing, Time.deltaTime * 60f));
} }
// 2) Feed audio to Whisper ONLY when active // 2) Feed audio to Whisper
if (shouldFeed && !_skipOneFeedFrame) if (_stream != null)
{ {
if (len1 > 0) CopyPcm16ToFloatAndFeed(p1, len1); if (isRecordingActivated && !_skipOneFeedFrame)
if (len2 > 0) CopyPcm16ToFloatAndFeed(p2, len2); {
// Feed real mic
if (len1 > 0) CopyPcm16ToFloatAndFeed(p1, len1);
if (len2 > 0) CopyPcm16ToFloatAndFeed(p2, len2);
}
else
{
// Feed same-size silence instead
if (len1 > 0) FeedSilentChunk(len1);
if (len2 > 0) FeedSilentChunk(len2);
}
} }
// If skipping, we just discard this frame to ensure no stale data leaks. // If skipping, we just discard this frame to ensure no stale data leaks.
@@ -362,12 +314,30 @@ public class FMODWhisperBridge : MonoBehaviour
if (_skipOneFeedFrame) _skipOneFeedFrame = false; if (_skipOneFeedFrame) _skipOneFeedFrame = false;
_lastRecordPos = recPos; _lastRecordPos = recPos;
} }
private string PostProcessInput(string input) private string PostProcessInput(string input)
{ {
return input.Replace("[silence]", "").Replace("[ Silence ]", "").Replace("BLANK_AUDIO", "").Replace("[", "").Replace("]", "").Trim(); return input.Replace("[silence]", "").Replace("[ Silence ]", "").Replace("BLANK_AUDIO", "").Replace("[", "").Replace("]", "").Replace("END PLAYBACK", "").Trim();
}
private void FeedSilentChunk(uint byteLen)
{
int samples = (int)(byteLen / 2);
EnsureTmpCapacity(samples);
// fill existing _floatTmp with zeros (efficient)
Array.Clear(_floatTmp, 0, samples);
var chunk = new AudioChunk
{
Data = _floatTmp.AsSpan(0, samples).ToArray(),
Frequency = (_nativeRate > 0) ? _nativeRate : desiredSampleRate,
Channels = _nativeChannels,
IsVoiceDetected = false
};
_stream.AddToStream(chunk);
} }
private void CopyPcm16ToFloatAndFeed(IntPtr src, uint byteLen) private void CopyPcm16ToFloatAndFeed(IntPtr src, uint byteLen)
@@ -429,56 +399,6 @@ public class FMODWhisperBridge : MonoBehaviour
} }
} }
private void ClearRecordRingBuffer()
{
if (!_recSound.hasHandle() || _soundPcmLength == 0) return;
uint totalBytes = _soundPcmLength * (uint)_nativeChannels * 2; // PCM16
IntPtr p1, p2;
uint len1, len2;
// Lock the whole buffer (start=0, length=totalBytes)
var r = _recSound.@lock(0, totalBytes, out p1, out p2, out len1, out len2);
if (r != FMOD.RESULT.OK)
{
Debug.LogWarning($"[FMOD→Whisper] Could not lock ring buffer to clear: {r}");
return;
}
try
{
if (len1 > 0)
{
// zero p1
// Well reuse a static zero array to avoid allocating huge buffers repeatedly
ZeroMem(p1, (int)len1);
}
if (len2 > 0)
{
ZeroMem(p2, (int)len2);
}
}
finally
{
_recSound.unlock(p1, p2, len1, len2);
}
}
// cheap zeroing helper (avoids allocating len-sized arrays each time)
private static readonly byte[] _zeroChunk = new byte[16 * 1024]; // 16 KB
private static void ZeroMem(IntPtr dst, int byteLen)
{
int offset = 0;
while (byteLen > 0)
{
int n = Math.Min(_zeroChunk.Length, byteLen);
Marshal.Copy(_zeroChunk, 0, dst + offset, n);
offset += n;
byteLen -= n;
}
}
/// <summary> /// <summary>
/// Computes RMS (root mean square) from a PCM16 block using only safe code. /// Computes RMS (root mean square) from a PCM16 block using only safe code.
/// Uses the shared _shortOverlay buffer (no allocations). /// Uses the shared _shortOverlay buffer (no allocations).

View File

@@ -36,6 +36,7 @@ public class ModelGenerationUtils : MonoBehaviour
{ {
XROrigin xrOrigin = FindObjectOfType<XROrigin>(includeInactive: true); XROrigin xrOrigin = FindObjectOfType<XROrigin>(includeInactive: true);
xrOrigin.transform.position = minigamePoints[0].position; xrOrigin.transform.position = minigamePoints[0].position;
xrOrigin.transform.rotation = minigamePoints[0].rotation;
} }
@@ -43,12 +44,14 @@ public class ModelGenerationUtils : MonoBehaviour
{ {
XROrigin xrOrigin = FindObjectOfType<XROrigin>(includeInactive: true); XROrigin xrOrigin = FindObjectOfType<XROrigin>(includeInactive: true);
xrOrigin.transform.position = minigamePoints[1].position; xrOrigin.transform.position = minigamePoints[1].position;
xrOrigin.transform.rotation = minigamePoints[1].rotation;
} }
if (Keyboard.current.digit3Key.wasPressedThisFrame) if (Keyboard.current.digit3Key.wasPressedThisFrame)
{ {
XROrigin xrOrigin = FindObjectOfType<XROrigin>(includeInactive: true); XROrigin xrOrigin = FindObjectOfType<XROrigin>(includeInactive: true);
xrOrigin.transform.position = minigamePoints[2].position; xrOrigin.transform.position = minigamePoints[2].position;
xrOrigin.transform.rotation = minigamePoints[2].rotation;
} }
if (Keyboard.current.digit0Key.wasPressedThisFrame) if (Keyboard.current.digit0Key.wasPressedThisFrame)

View File

@@ -15,6 +15,7 @@ public class ArcheryRangeNPC : NPCController
public ModelDisplay modelDisplay; public ModelDisplay modelDisplay;
public float modelDisplaySize = 0.75f; public float modelDisplaySize = 0.75f;
public Transform startTargetQuestMarkerPoint; public Transform startTargetQuestMarkerPoint;
public KeyboardManager keyboardManager;
private Texture2D GeneratedTexture; private Texture2D GeneratedTexture;
@@ -25,6 +26,8 @@ public class ArcheryRangeNPC : NPCController
// 3 - player pressed the image generation button // 3 - player pressed the image generation button
// 4 - player pressed the model generation button // 4 - player pressed the model generation button
// 5 - model spawned into the game // 5 - model spawned into the game
// 6 - round completed
// 7 - name submitted
private int state; private int state;
private void Awake() private void Awake()
@@ -37,6 +40,8 @@ public class ArcheryRangeNPC : NPCController
microphoneStand.OnPlayerUsedMicrophone += OnPlayerUsedMicrophone; microphoneStand.OnPlayerUsedMicrophone += OnPlayerUsedMicrophone;
imageGenerationButton.OnButtonPressed += OnImageGenerationButtonPressed; imageGenerationButton.OnButtonPressed += OnImageGenerationButtonPressed;
modelGenerationButton.OnButtonPressed += OnModelGenerationButtonPressed; modelGenerationButton.OnButtonPressed += OnModelGenerationButtonPressed;
keyboardManager.OnActivate += OnRoundComplete;
keyboardManager.OnSubmit += OnNameSubmitted;
} }
protected async override void OnPlayerApproach() protected async override void OnPlayerApproach()
@@ -119,4 +124,23 @@ public class ArcheryRangeNPC : NPCController
modelGenerationButton.Deactivate(); modelGenerationButton.Deactivate();
} }
private void OnRoundComplete()
{
if (state == 5)
{
state = 6;
SpeakVoiceLine(6);
}
}
private void OnNameSubmitted()
{
if (state == 6)
{
state = 7;
}
SpeakVoiceLine(7);
}
} }

View File

@@ -122,7 +122,7 @@ public class CafeWaiterNPC : NPCController
} else if (state == 2) } else if (state == 2)
{ {
fmodWhisperBridge.DeactivateRecording(); fmodWhisperBridge.DeactivateRecording();
bool positiveAnswer = playerText.ToLower().Contains("ye") || playerText.ToLower().Contains("correct") | playerText.ToLower().Contains("right"); bool positiveAnswer = IsPlayerAnswerPositive(playerText);
SpeakVoiceLine(positiveAnswer ? 2 : 3); SpeakVoiceLine(positiveAnswer ? 2 : 3);
// Flip notepad back // Flip notepad back
notepad.transform.DOLocalRotate(notepadOriginalRotation, 0.5f).OnComplete(() => notepad.transform.DOLocalRotate(notepadOriginalRotation, 0.5f).OnComplete(() =>
@@ -159,7 +159,18 @@ public class CafeWaiterNPC : NPCController
} }
} }
private bool IsPlayerAnswerPositive(string playerText)
{
string lower = playerText.ToLower();
return lower.Contains("ye")
|| lower.Contains("correct")
|| lower.Contains("right")
|| lower.Contains("sure")
|| lower.Contains("of course")
|| lower.Contains("okay")
|| lower.Contains("yup")
|| lower.Contains("affirmative");
}
private async void BringFood() private async void BringFood()
{ {
@@ -193,6 +204,7 @@ public class CafeWaiterNPC : NPCController
private void InitializeSpawnedObject(GameObject spawnedObject) private void InitializeSpawnedObject(GameObject spawnedObject)
{ {
Rigidbody rigidbody = spawnedObject.AddComponent<Rigidbody>(); Rigidbody rigidbody = spawnedObject.AddComponent<Rigidbody>();
rigidbody.collisionDetectionMode = CollisionDetectionMode.ContinuousDynamic;
//spawnedObject.AddComponent<NetworkObject>(); //spawnedObject.AddComponent<NetworkObject>();
//spawnedObject.AddComponent<NetworkTransform>(); //spawnedObject.AddComponent<NetworkTransform>();

View File

@@ -26,25 +26,13 @@ public abstract class NPCController : MonoBehaviour
private float[] rmsCurve; private float[] rmsCurve;
private EventInstance currentVoicelineEvent; private EventInstance currentVoicelineEvent;
private bool isSpeaking;
private float smoothed; private float smoothed;
// If you change RMS window in Python, update this // If you change RMS window in Python, update this
private const float FRAME_DURATION = 0.02f; private const float FRAME_DURATION = 0.02f;
private float sampleRate = 1f / FRAME_DURATION; // RMS samples per second (20ms windows) private readonly float sampleRate = 1f / FRAME_DURATION; // RMS samples per second (20ms windows)
// Start is called before the first frame update
void Awake()
{
}
void Start()
{
}
// Update is called once per frame // Update is called once per frame
void Update() void Update()
{ {
@@ -65,7 +53,7 @@ public abstract class NPCController : MonoBehaviour
} }
} }
if (isSpeaking && rmsCurve != null && currentVoicelineEvent.isValid()) if (rmsCurve != null && currentVoicelineEvent.isValid())
{ {
AnimateMouth(); AnimateMouth();
} }
@@ -105,30 +93,14 @@ public abstract class NPCController : MonoBehaviour
mouth.localScale = s; mouth.localScale = s;
} }
public void PlayerApproach() {
private void StopSpeaking()
{
isSpeaking = false;
smoothed = inverted ? maxScaleY : minScaleY;
if (mouth != null)
{
var scale = mouth.localScale;
scale.y = smoothed;
mouth.localScale = scale;
}
currentVoicelineEvent.release();
}
public void PlayerApproach(Transform player) {
playerTransform = player;
OnPlayerApproach(); OnPlayerApproach();
} }
public void PlayerLeave() public void PlayerLeave()
{ {
playerTransform = null;
OnPlayerLeave(); OnPlayerLeave();
} }
@@ -136,6 +108,22 @@ public abstract class NPCController : MonoBehaviour
protected virtual void OnPlayerLeave() {} protected virtual void OnPlayerLeave() {}
private void OnTriggerEnter(Collider other)
{
if (other.gameObject.tag == "Player Head")
{
playerTransform = other.transform;
}
}
private void OnTriggerExit(Collider other)
{
if (other.gameObject.tag == "Player Head")
{
playerTransform = null;
}
}
public void SpeakVoiceLine(int voiceLineId, GameObject emitter = null, float radioAmount = 0f) public void SpeakVoiceLine(int voiceLineId, GameObject emitter = null, float radioAmount = 0f)
{ {
if (voiceLineId < 0 || voiceLineId >= voiceLineKeys.Length) if (voiceLineId < 0 || voiceLineId >= voiceLineKeys.Length)
@@ -152,21 +140,15 @@ public abstract class NPCController : MonoBehaviour
LoadCurve(key); // load RMS data LoadCurve(key); // load RMS data
emitter = emitter ?? gameObject; emitter = emitter != null ? emitter : gameObject;
currentVoicelineEvent = AudioManager.Instance.PlayDialogue(characterSpecificFolder + "/" + key, emitter, radioAmount); currentVoicelineEvent = AudioManager.Instance.PlayDialogue(characterSpecificFolder + "/" + key, emitter, radioAmount);
if (!currentVoicelineEvent.isValid()) if (!currentVoicelineEvent.isValid())
{ {
Debug.LogError("Failed to start dialogue event."); Debug.LogError("Failed to start dialogue event.");
return; return;
} }
isSpeaking = true;
// Stop mouth on end
float voicelineDuration = rmsCurve.Length * FRAME_DURATION;
Invoke(nameof(StopSpeaking), voicelineDuration + 0.1f);
} }
// --------------------------- // ---------------------------
// Load RMS Timeline (.txt) // Load RMS Timeline (.txt)
// --------------------------- // ---------------------------

View File

@@ -24,7 +24,7 @@ public class NPCTriggerArea : MonoBehaviour
if (isEnter && other.gameObject.tag == "Player Head") if (isEnter && other.gameObject.tag == "Player Head")
{ {
npcController.PlayerApproach(other.transform); npcController.PlayerApproach();
} }
} }

View File

@@ -1,5 +1,4 @@
using DG.Tweening; using DG.Tweening;
using System;
using System.Threading.Tasks; using System.Threading.Tasks;
using UnityEngine; using UnityEngine;
@@ -12,6 +11,7 @@ public class ShapeDetectionNPC : NPCController
public Printer3DInputHole printerInsertionHole; public Printer3DInputHole printerInsertionHole;
public ComputerPrinter computerPrinter; public ComputerPrinter computerPrinter;
public ShapeScanner shapeScanner; public ShapeScanner shapeScanner;
public GameObject staticRadio;
public Transform questMarkerPoint; public Transform questMarkerPoint;
public float radioAmount = 1f; public float radioAmount = 1f;
public Transform[] movementPath; public Transform[] movementPath;
@@ -25,8 +25,9 @@ public class ShapeDetectionNPC : NPCController
// 3 - player spoke into the radio // 3 - player spoke into the radio
// 4 - player pressed enter on keyboard // 4 - player pressed enter on keyboard
// 5 - player inserted picture into printer // 5 - player inserted picture into printer
// 6 - shape scanner completed // 6 - player completed first shape scanner config
// 7 - moving away // 7 - shape scanner completed
// 8 - moving away
private int state; private int state;
private float lastPlayerApproachTime; private float lastPlayerApproachTime;
@@ -42,7 +43,8 @@ public class ShapeDetectionNPC : NPCController
radio.OnPlayerFinishedSpeaking += OnPlayerSpokeIntoRadio; radio.OnPlayerFinishedSpeaking += OnPlayerSpokeIntoRadio;
printerInsertionHole.OnPlayerInsertedPrintable += OnPlayerInitiatedPrinting; printerInsertionHole.OnPlayerInsertedPrintable += OnPlayerInitiatedPrinting;
computerPrinter.OnImagePrinted += OnPlayerPrintedImage; computerPrinter.OnImagePrinted += OnPlayerPrintedImage;
shapeScanner.OnShapeScannerCompleted += OnShapeScannerCompleted; shapeScanner.OnConfigCompleted += OnPlayerCompletedFirstConfiguration;
shapeScanner.OnAllCompleted += OnShapeScannerCompleted;
} }
protected async override void OnPlayerApproach() protected async override void OnPlayerApproach()
@@ -131,10 +133,22 @@ public class ShapeDetectionNPC : NPCController
} }
} }
private void OnPlayerCompletedFirstConfiguration()
{
if (state == 5)
{
SpeakVoiceLine(6, radio.gameObject, radioAmount);
state = 6;
}
}
private void OnShapeScannerCompleted() private void OnShapeScannerCompleted()
{ {
state = 6; if (state == 6)
questMarker.MoveTo(questMarkerPoint); {
state = 7;
questMarker.MoveTo(questMarkerPoint);
}
} }
private void MoveToNextPoint(int pointIndex) private void MoveToNextPoint(int pointIndex)
@@ -152,11 +166,13 @@ public class ShapeDetectionNPC : NPCController
public async void OnPlayerEnteredRoom() public async void OnPlayerEnteredRoom()
{ {
if (state == 6) if (state == 7)
{ {
state = 7; state = 8;
staticRadio.SetActive(false);
questMarker.gameObject.SetActive(false); questMarker.gameObject.SetActive(false);
await Task.Delay(2500); SpeakVoiceLine(7, gameObject, 0);
await Task.Delay(6500);
MoveToNextPoint(0); MoveToNextPoint(0);
} }
} }

View File

@@ -51,7 +51,7 @@ public class Printer3D : MonoBehaviour
private void InitializeSpawnedObject(GameObject spawnedObject) private void InitializeSpawnedObject(GameObject spawnedObject)
{ {
GameObject spawnedObjectParent = new GameObject("SpawnedModelParent"); GameObject spawnedObjectParent = new("SpawnedModelParent");
spawnedObjectParent.transform.parent = spawnPoint; spawnedObjectParent.transform.parent = spawnPoint;
spawnedObjectParent.transform.position = spawnPoint.transform.position; spawnedObjectParent.transform.position = spawnPoint.transform.position;
spawnedObjectParent.layer = ignorePlayerCollisionLayer; spawnedObjectParent.layer = ignorePlayerCollisionLayer;

View File

@@ -20,7 +20,7 @@ public class RadioTransmitter : XRGrabInteractable
public float baseEmissionRate = 3; public float baseEmissionRate = 3;
public float maxExtraEmissionRate = 50; public float maxExtraEmissionRate = 50;
private bool isProcessing; private bool isRecording;
private ParticleSystem.EmissionModule particleEmission; private ParticleSystem.EmissionModule particleEmission;
// Start is called before the first frame update // Start is called before the first frame update
@@ -29,7 +29,7 @@ public class RadioTransmitter : XRGrabInteractable
radioButton.OnButtonPressed += OnRadioButtonPressed; radioButton.OnButtonPressed += OnRadioButtonPressed;
radioButton.OnButtonReleased += OnRadioButtonReleased; radioButton.OnButtonReleased += OnRadioButtonReleased;
radioButton.Lock(); radioButton.Lock();
isProcessing = false; isRecording = false;
particleEmission = particles.emission; particleEmission = particles.emission;
particleEmission.enabled = false; particleEmission.enabled = false;
@@ -41,7 +41,13 @@ public class RadioTransmitter : XRGrabInteractable
if (particleEmission.enabled) if (particleEmission.enabled)
{ {
particles.transform.LookAt(computerScreen.transform.position); particles.transform.LookAt(computerScreen.transform.position);
particleEmission.rateOverTime = baseEmissionRate + fmodWhisperBridge.GetNormalizedVolume01() * maxExtraEmissionRate; if (isRecording)
{
particleEmission.rateOverTime = baseEmissionRate + fmodWhisperBridge.GetNormalizedVolume01() * maxExtraEmissionRate;
} else
{
particleEmission.rateOverTime = baseEmissionRate;
}
} }
} }
@@ -54,40 +60,42 @@ public class RadioTransmitter : XRGrabInteractable
radioButton.Unlock(); radioButton.Unlock();
} }
protected override void OnSelectExited(SelectExitEventArgs args)
{
base.OnSelectExited(args);
radioButton.Lock();
}
private void OnRadioButtonPressed() private void OnRadioButtonPressed()
{ {
AudioManager.Instance.PlayAttachedInstance(FMODEvents.Instance.RadioButton, gameObject); AudioManager.Instance.PlayAttachedInstance(FMODEvents.Instance.RadioButton, gameObject);
if (!isProcessing) fmodWhisperBridge.OnWhisperSegmentUpdated += OnPlayerSpeechUpdated;
{ fmodWhisperBridge.OnWhisperSegmentFinished += OnPlayerSpeechFinished;
isProcessing = true; fmodWhisperBridge.ActivateRecording();
fmodWhisperBridge.OnWhisperSegmentUpdated += OnPlayerSpeechUpdated;
fmodWhisperBridge.OnWhisperSegmentFinished += OnPlayerSpeechFinished;
fmodWhisperBridge.ActivateRecording();
particleEmission.enabled = true; isRecording = true;
} particleEmission.enabled = true;
} }
private void OnRadioButtonReleased() private void OnRadioButtonReleased()
{ {
fmodWhisperBridge.DeactivateRecording();
AudioManager.Instance.PlayAttachedInstance(FMODEvents.Instance.RadioButton, gameObject); AudioManager.Instance.PlayAttachedInstance(FMODEvents.Instance.RadioButton, gameObject);
isRecording = false;
} }
private void OnPlayerSpeechUpdated(string text) private void OnPlayerSpeechUpdated(string text)
{ {
computerScreen.text = text; computerScreen.text = text;
//OnPlayerFinishedSpeaking?.Invoke();
} }
private void OnPlayerSpeechFinished(string playerText) private void OnPlayerSpeechFinished(string playerText)
{ {
computerScreen.text = playerText; computerScreen.text = playerText;
isProcessing = false;
OnPlayerFinishedSpeaking?.Invoke(); OnPlayerFinishedSpeaking?.Invoke();
fmodWhisperBridge.OnWhisperSegmentUpdated -= OnPlayerSpeechUpdated; fmodWhisperBridge.OnWhisperSegmentUpdated -= OnPlayerSpeechUpdated;
fmodWhisperBridge.OnWhisperSegmentFinished -= OnPlayerSpeechFinished; fmodWhisperBridge.OnWhisperSegmentFinished -= OnPlayerSpeechFinished;
fmodWhisperBridge.DeactivateRecording();
particleEmission.enabled = false; particleEmission.enabled = false;
} }

View File

@@ -1,7 +1,7 @@
using System; using System;
using System.Collections.Generic; using System.Collections.Generic;
using System.Data;
using System.Linq; using System.Linq;
using System.Threading.Tasks;
using TMPro; using TMPro;
using UnityEngine; using UnityEngine;
using UnityEngine.XR.Interaction.Toolkit; using UnityEngine.XR.Interaction.Toolkit;
@@ -35,11 +35,13 @@ public class ShapeScannerConfiguration
public class ShapeScanner : MonoBehaviour public class ShapeScanner : MonoBehaviour
{ {
public delegate void OnShapeScannerCompletedDelegate(); public delegate void OnConfigCompletedDelegate();
public event OnShapeScannerCompletedDelegate OnShapeScannerCompleted; public event OnConfigCompletedDelegate OnConfigCompleted;
public delegate void OnAllCompletedDelegate();
public event OnAllCompletedDelegate OnAllCompleted;
[Header("Static References")] [Header("Static References")]
public List<ShapeScannerConfiguration> configurations = new List<ShapeScannerConfiguration>(); public List<ShapeScannerConfiguration> configurations = new();
public ShapeScannerRay rayPrefab; public ShapeScannerRay rayPrefab;
public Transform raySpawnCorner1; public Transform raySpawnCorner1;
public Transform raySpawnCorner2; public Transform raySpawnCorner2;
@@ -68,8 +70,8 @@ public class ShapeScanner : MonoBehaviour
private float raySpawnDistanceX; private float raySpawnDistanceX;
private float raySpawnDistanceZ; private float raySpawnDistanceZ;
private int currentConfiguration; private int currentConfiguration;
private int rayCount; private int totalRayCount;
private int correctRayStates; private int correctRayCount;
private bool isCompleted; private bool isCompleted;
@@ -99,21 +101,14 @@ public class ShapeScanner : MonoBehaviour
private void InitializeConfiguration(ShapeScannerConfiguration configuration) private void InitializeConfiguration(ShapeScannerConfiguration configuration)
{ {
// Recreate all existing rays // Create rays
foreach (ShapeScannerRay ray in existingRays)
{
Destroy(ray.gameObject);
}
existingRays.Clear();
int rayRowCount = configuration.rows.Count; int rayRowCount = configuration.rows.Count;
for (int i = 0; i < rayRowCount; i++) for (int i = 0; i < rayRowCount; i++)
{ {
float rayPosX = raySpawnCorner1.localPosition.x + i * raySpawnDistanceX / (rayRowCount - 1); float rayPosZ = raySpawnCorner1.localPosition.z + i * raySpawnDistanceZ / (rayRowCount - 1);
for (int j = 0; j < rayRowCount; j++) for (int j = 0; j < rayRowCount; j++)
{ {
// Local position float rayPosX = raySpawnCorner1.localPosition.x + j * raySpawnDistanceX / (rayRowCount - 1);
float rayPosZ = raySpawnCorner1.localPosition.z + j * raySpawnDistanceZ / (rayRowCount - 1);
Vector3 rayPos = new Vector3(rayPosX, 0, rayPosZ); Vector3 rayPos = new Vector3(rayPosX, 0, rayPosZ);
ShapeScannerRay ray = Instantiate(rayPrefab, rayParent); ShapeScannerRay ray = Instantiate(rayPrefab, rayParent);
ray.transform.localPosition = rayPos; ray.transform.localPosition = rayPos;
@@ -131,14 +126,17 @@ public class ShapeScanner : MonoBehaviour
} }
} }
// Count total rays and required collision rays // Count total rays and required collision rays
rayCount = configuration.rows.SelectMany(row => row.cells).Count(); totalRayCount = configuration.rows.SelectMany(row => row.cells).Count();
correctRayStates = configuration.rows.SelectMany(row => row.cells).Count(cell => !cell); correctRayCount = configuration.rows.SelectMany(row => row.cells).Count(cell => !cell);
UpdateDisplay(calculateCorrectPercentage());
float percentage = CalculateCorrectPercentage();
UpdateDisplay(percentage);
} }
private void OnConfigurationComplete() private void OnConfigurationComplete()
{ {
HashSet<GameObject> allCollidingObjects = new HashSet<GameObject>(); // Destroy colliding scannable objects
HashSet<GameObject> allCollidingObjects = new();
foreach (ShapeScannerRay ray in existingRays) foreach (ShapeScannerRay ray in existingRays)
{ {
allCollidingObjects.UnionWith(ray.GetCollidingObjects()); allCollidingObjects.UnionWith(ray.GetCollidingObjects());
@@ -149,31 +147,37 @@ public class ShapeScanner : MonoBehaviour
var grab = collidingObject.GetComponent<XRGrabInteractable>(); var grab = collidingObject.GetComponent<XRGrabInteractable>();
if (grab != null && grab.isSelected) if (grab != null && grab.isSelected)
{ {
var interactor = grab.firstInteractorSelecting; // the hand/controller currently holding it grab.enabled = false;
if (interactor != null)
{
// Transfer ownership: tell the manager to stop the selection
interactionManager.SelectExit(interactor, grab);
}
} }
collidingObject.transform.position = Vector3.zero; collidingObject.transform.position = Vector3.zero;
Destroy(collidingObject); Destroy(collidingObject);
} }
// Destroy all existing rays
foreach (ShapeScannerRay ray in existingRays)
{
Destroy(ray.gameObject);
}
existingRays.Clear();
correctRayCount = 0;
// Play sound effect and emit particles
AudioManager.Instance.PlayAttachedInstance(FMODEvents.Instance.ShapeScannerSuccess, gameObject); AudioManager.Instance.PlayAttachedInstance(FMODEvents.Instance.ShapeScannerSuccess, gameObject);
if (!particles.isPlaying) particles.Play(); if (!particles.isPlaying) particles.Play();
particles.Emit(100); particles.Emit(100);
OnConfigCompleted?.Invoke();
} }
private float calculateCorrectPercentage() private float CalculateCorrectPercentage()
{ {
return (float) correctRayStates / rayCount * 100; return (float) correctRayCount / totalRayCount * 100;
} }
public void IncrementCorrectRayCount() public async void IncrementCorrectRayCount()
{ {
correctRayStates++; correctRayCount++;
float correctPercentage = calculateCorrectPercentage(); float correctPercentage = CalculateCorrectPercentage();
UpdateDisplay(correctPercentage); UpdateDisplay(correctPercentage);
if (isCompleted) if (isCompleted)
{ {
@@ -182,14 +186,16 @@ public class ShapeScanner : MonoBehaviour
if (correctPercentage >= configurations[currentConfiguration].requiredCorrectPercentage) if (correctPercentage >= configurations[currentConfiguration].requiredCorrectPercentage)
{ {
OnConfigurationComplete(); OnConfigurationComplete();
await Task.Delay(1000);
UpdateCurrentConfigurationDisplay(currentConfiguration + 1);
if (currentConfiguration + 1 < configurations.Count) if (currentConfiguration + 1 < configurations.Count)
{ {
currentConfiguration++; currentConfiguration++;
InitializeConfiguration(configurations[currentConfiguration]); InitializeConfiguration(configurations[currentConfiguration]);
UpdateCurrentConfigurationDisplay(currentConfiguration);
} else } else
{ {
// Initialize configuration with all rays requiring collision // Initialize configuration with no rays requiring collision
List<BoolRow> rows = Enumerable.Repeat(new BoolRow(Enumerable.Repeat(false, 6).ToList()), 6).ToList(); List<BoolRow> rows = Enumerable.Repeat(new BoolRow(Enumerable.Repeat(false, 6).ToList()), 6).ToList();
ShapeScannerConfiguration configuration = new ShapeScannerConfiguration(6, 100, rows); ShapeScannerConfiguration configuration = new ShapeScannerConfiguration(6, 100, rows);
InitializeConfiguration(configuration); InitializeConfiguration(configuration);
@@ -200,8 +206,8 @@ public class ShapeScanner : MonoBehaviour
public void DecrementCorrectRayCount() public void DecrementCorrectRayCount()
{ {
correctRayStates--; correctRayCount--;
UpdateDisplay(calculateCorrectPercentage()); UpdateDisplay(CalculateCorrectPercentage());
} }
private void UpdateDisplay(float percentage) private void UpdateDisplay(float percentage)
@@ -233,6 +239,6 @@ public class ShapeScanner : MonoBehaviour
// Create line renderer from shape scanner to door card reader // Create line renderer from shape scanner to door card reader
lineRenderer.enabled = true; lineRenderer.enabled = true;
OnShapeScannerCompleted?.Invoke(); OnAllCompleted?.Invoke();
} }
} }

View File

@@ -40,9 +40,10 @@ public class ShapeScannerRay : MonoBehaviour
private void OnTriggerEnter(Collider other) private void OnTriggerEnter(Collider other)
{ {
if (other.gameObject.tag == scannableTag) if (other.gameObject.CompareTag(scannableTag))
{ {
collidingObjects.Add(other.gameObject); GameObject parent = other.transform.parent.gameObject;
collidingObjects.Add(parent);
// Only activate when this was the first object that entered collision // Only activate when this was the first object that entered collision
if (collidingObjects.Count == 1) if (collidingObjects.Count == 1)
{ {
@@ -64,9 +65,10 @@ public class ShapeScannerRay : MonoBehaviour
private void OnTriggerExit(Collider other) private void OnTriggerExit(Collider other)
{ {
if (other.gameObject.tag == "ShapeScannable") if (other.gameObject.CompareTag(scannableTag))
{ {
collidingObjects.Remove(other.gameObject); GameObject parent = other.transform.parent.gameObject;
collidingObjects.Remove(parent);
if (collidingObjects.Count == 0) if (collidingObjects.Count == 0)
{ {
foreach (MeshRenderer meshRenderer in meshRenderers) foreach (MeshRenderer meshRenderer in meshRenderers)

View File

@@ -32,7 +32,6 @@ public class TwoHandScaleGrabInteractable : XRGrabInteractable
protected override void OnSelectExited(SelectExitEventArgs args) protected override void OnSelectExited(SelectExitEventArgs args)
{ {
Debug.Log("current local scale: " + transform.localScale);
base.OnSelectExited(args); base.OnSelectExited(args);
UpdateTwoHandState(); UpdateTwoHandState();
} }

Some files were not shown because too many files have changed in this diff Show More