1
0
forked from cgvr/DeltaVR

34 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
9fbd08eb25 archery range spawned objects are rotated towards the player 2026-03-11 17:08:16 +02:00
c19026c0ac made archery range rounds shorter (30 sec) 2026-03-11 17:02:12 +02:00
530 changed files with 2814 additions and 302 deletions

3
.gitignore vendored
View File

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

View File

@@ -1,29 +1,24 @@
### TODO
* korralik teleportation minigame'idesse, kasutades TeleportProviderit, nagu button
* quest marker peaks jätma nähtavad noolekesed enda liikumise teele
* teha build kus archery range'is spawnitud objektid
* fix FMOD ChannelControl errors
* Unity crash after stopping the game - most likely due to FMOD trying to do something with invalid audio instances
* pidev krabamise heli, kui kahe käega korraga krabada: "(Un)requesting ownership of Cube"
* FMOD ChannelControl errorid
* keyboard numbrid ei tööta pärast minigame'i completemist?
* 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
* proovida suuremat Whisperi mudelit, äkki töötab mürases keskkonnas paremini
* npc character:
* klaas on näha temast eespool
* voicelines: list listidest, mille hulgast saab valida
* 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
* prinditud objekti scale'imisele min ja max size limiit
* 3d printerile soft particle'id, et ei oleks teravaid ääri seina sisse minnes
* archery range:
* õigesti pöörata spawnitud objekte, et nad tuleksid esipoolega
* timer lühemaks (30 sec)
* archery targetite rework, et buildis ka töötaks
* 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:
* võiks saada hinnata saadud tellimust
* npc võiks olla keeratud sinu poole juba kaugelt
* "order again" nupp
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**
@@ -37,3 +32,8 @@ Can't/Won't Do:
* 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)
* 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
GAIN = 1.0 # multiply RMS values (set to e.g. 30.0 if you want larger values)
EXTENSION = ".txt" # output file extension
OVERWRITE = False # set True to regenerate even if .txt exists
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}")
# Load audio
@@ -29,7 +37,6 @@ def process_wav(filepath):
rms = rms * GAIN
# Save to .txt
out_path = os.path.splitext(filepath)[0] + EXTENSION
np.savetxt(out_path, rms, fmt="%.8f")
print(f"Saved RMS → {out_path}")
@@ -49,4 +56,4 @@ def process_folder(folder_path):
# === Run script ===
if __name__ == "__main__":
folder = input("Enter folder path: ").strip()
process_folder(folder)
process_folder(folder)

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
guid: d9e3dd6a9520c354e998bd0ad3a81f46
guid: 38bc01876ee396a46b03ca91e612e687
DefaultImporter:
externalObjects: {}
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
if (exitedPlayer == _scoredPlayer) keyboardManager.DeActivate(); // If the player <20>refuses to enter their name.
}
@@ -145,6 +144,7 @@ public class ArcheryRange : NetworkBehaviour
targetObject = Instantiate(modelDisplay.Model, randomPos, Quaternion.identity, null);
InitializeArcheryTargetObject(targetObject);
}
targetObject.transform.rotation = targetStartPosition.rotation;
ArcheryTarget target = targetObject.GetComponent<ArcheryTarget>();
target.endPosition = targetEndPosition.position;

View File

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

View File

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

View File

@@ -168,20 +168,14 @@ public class TutorialAudioListener : MonoBehaviour
private EventReference GetGrabEvent(GrabSoundType type)
{
switch (type)
return type switch
{
case GrabSoundType.Bow:
return FMODEvents.Instance.BowGrab;
case GrabSoundType.Sprayer:
return FMODEvents.Instance.SprayerGrab;
GrabSoundType.Bow => FMODEvents.Instance.BowGrab,
GrabSoundType.Sprayer => FMODEvents.Instance.SprayerGrab,
//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
default:
return FMODEvents.Instance.DefaultGrab;
}
_ => FMODEvents.Instance.DefaultGrab,
};
}
private void HandleGrab(XRGrabInteractable grab)
@@ -195,10 +189,6 @@ public class TutorialAudioListener : MonoBehaviour
: GrabSoundType.Default;
EventReference grabEvent = GetGrabEvent(type);
Debug.Log(grabEvent);
AudioManager.Instance.PlayAttachedInstance(grabEvent, grab.gameObject);
}
}

View File

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

View File

@@ -93,6 +93,7 @@ GameObject:
- component: {fileID: 7699707098595015193}
- component: {fileID: 1413215456818694348}
- component: {fileID: 483845010817450077}
- component: {fileID: 8646891389811022226}
m_Layer: 0
m_Name: ArcheryRangeNPC
m_TagString: Untagged
@@ -267,7 +268,7 @@ MonoBehaviour:
_initializeOrder: 0
_defaultDespawnType: 0
NetworkObserver: {fileID: 0}
<PrefabId>k__BackingField: 18
<PrefabId>k__BackingField: 6
<SpawnableCollectionId>k__BackingField: 0
_scenePathHash: 0
<SceneId>k__BackingField: 0
@@ -465,6 +466,27 @@ MonoBehaviour:
X: 0
Y: 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
GameObject:
m_ObjectHideFlags: 0

View File

@@ -195,6 +195,7 @@ GameObject:
- component: {fileID: 7699707098595015193}
- component: {fileID: 1413215456818694348}
- component: {fileID: 483845010817450077}
- component: {fileID: 8270600859684143550}
m_Layer: 0
m_Name: CafeWaiterNPC
m_TagString: Untagged
@@ -270,7 +271,7 @@ MonoBehaviour:
m_FallbackScreenDPI: 96
m_DefaultSpriteDPI: 96
m_DynamicPixelsPerUnit: 1
m_PresetInfoIsWorld: 1
m_PresetInfoIsWorld: 0
--- !u!114 &6105090838799004608
MonoBehaviour:
m_ObjectHideFlags: 0
@@ -569,6 +570,27 @@ MonoBehaviour:
X: 0
Y: 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
GameObject:
m_ObjectHideFlags: 0

View File

@@ -93,6 +93,7 @@ GameObject:
- component: {fileID: 1653195237934660084}
- component: {fileID: 1413215456818694348}
- component: {fileID: 483845010817450077}
- component: {fileID: 1179918406964740421}
m_Layer: 0
m_Name: ShapeDetectionNPC
m_TagString: Untagged
@@ -233,10 +234,14 @@ MonoBehaviour:
questMarker: {fileID: 0}
radio: {fileID: 0}
computerKeyboardKey: {fileID: 0}
computerPrinter: {fileID: 0}
printerInsertionHole: {fileID: 0}
computerPrinter: {fileID: 0}
shapeScanner: {fileID: 0}
staticRadio: {fileID: 0}
questMarkerPoint: {fileID: 0}
radioAmount: 1
movementPath: []
moveSpeedPerSecond: 2
--- !u!114 &1413215456818694348
MonoBehaviour:
m_ObjectHideFlags: 0
@@ -459,6 +464,27 @@ MonoBehaviour:
X: 0
Y: 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
GameObject:
m_ObjectHideFlags: 0

View File

@@ -29,7 +29,7 @@ Transform:
m_GameObject: {fileID: 1659788510314838016}
m_LocalRotation: {x: 0, y: 0, z: 0, w: 1}
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_Children:
- {fileID: 4211436824399037528}
@@ -149,7 +149,7 @@ Transform:
m_PrefabAsset: {fileID: 0}
m_GameObject: {fileID: 4039766663692926199}
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_ConstrainProportionsScale: 0
m_Children: []

View File

@@ -4,9 +4,9 @@ using System.Runtime.InteropServices;
using UnityEngine;
using FMOD;
using FMODUnity;
using Whisper; // WhisperManager, WhisperStream, WhisperResult
using Whisper;
using Whisper.Utils;
using Debug = UnityEngine.Debug; // AudioChunk
using Debug = UnityEngine.Debug;
/// <summary>
/// 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;
[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 event OnWhisperSegmentUpdatedDelegate OnWhisperSegmentUpdated;
@@ -44,7 +38,6 @@ public class FMODWhisperBridge : MonoBehaviour
private FMOD.System _core;
private Sound _recSound;
private Channel _playChannel;
private ChannelGroup _masterGroup;
private uint _soundPcmLength; // in samples
private int _nativeRate;
private int _nativeChannels;
@@ -54,7 +47,6 @@ public class FMODWhisperBridge : MonoBehaviour
// Whisper
private WhisperStream _stream;
private bool _streamStarted;
// temp conversion buffer
private float[] _floatTmp = new float[0];
@@ -138,24 +130,6 @@ public class FMODWhisperBridge : MonoBehaviour
_core.getRecordPosition(recordDriverId, out _lastRecordPos);
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().
await System.Threading.Tasks.Task.Yield();
}
@@ -179,6 +153,11 @@ public class FMODWhisperBridge : MonoBehaviour
int rate = (_nativeRate > 0) ? _nativeRate : desiredSampleRate;
if (_stream != null)
{
_stream.StopStream();
}
try
{
_stream = await whisper.CreateStream(rate, _nativeChannels);
@@ -187,7 +166,6 @@ public class FMODWhisperBridge : MonoBehaviour
{
Debug.LogError($"[FMOD→Whisper] CreateStream exception: {e}");
_stream = null;
_streamStarted = false;
return;
}
@@ -208,16 +186,6 @@ public class FMODWhisperBridge : MonoBehaviour
whisper.useVad = useVadInStream;
_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
_core.getRecordPosition(recordDriverId, out _lastRecordPos);
@@ -225,13 +193,8 @@ public class FMODWhisperBridge : MonoBehaviour
// Well skip feeding for one frame to guarantee a clean start
_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;
Debug.Log("[FMOD→Whisper] Stream activated (buffer cleared; reading from current head).");
}
/// <summary>
@@ -239,24 +202,10 @@ public class FMODWhisperBridge : MonoBehaviour
/// </summary>
public void DeactivateRecording()
{
if (!isRecordingActivated && !_streamStarted)
if (!isRecordingActivated)
return;
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>
@@ -281,7 +230,6 @@ public class FMODWhisperBridge : MonoBehaviour
return Mathf.Clamp01(Mathf.InverseLerp(-60f, -15f, db));
}
private void Update()
{
// Always tick FMOD
@@ -289,8 +237,7 @@ public class FMODWhisperBridge : MonoBehaviour
if (!_recSound.hasHandle()) return;
// Compute how many samples recorded since last frame.
uint recPos;
_core.getRecordPosition(recordDriverId, out recPos);
_core.getRecordPosition(recordDriverId, out uint recPos);
uint deltaSamples = (recPos >= _lastRecordPos)
? (recPos - _lastRecordPos)
@@ -303,10 +250,6 @@ public class FMODWhisperBridge : MonoBehaviour
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)
uint bytesToRead = deltaSamples * (uint)_nativeChannels * 2; // 2 bytes per sample
uint startBytes = _lastRecordPos * (uint)_nativeChannels * 2;
@@ -323,7 +266,6 @@ public class FMODWhisperBridge : MonoBehaviour
try
{
float rmsAccumulator = 0f;
int rmsSampleCount = 0;
@@ -345,11 +287,21 @@ public class FMODWhisperBridge : MonoBehaviour
currentVolumeRms = Mathf.Lerp(currentVolumeRms, rms, 1f - Mathf.Pow(1f - volumeSmoothing, Time.deltaTime * 60f));
}
// 2) Feed audio to Whisper ONLY when active
if (shouldFeed && !_skipOneFeedFrame)
// 2) Feed audio to Whisper
if (_stream != null)
{
if (len1 > 0) CopyPcm16ToFloatAndFeed(p1, len1);
if (len2 > 0) CopyPcm16ToFloatAndFeed(p2, len2);
if (isRecordingActivated && !_skipOneFeedFrame)
{
// 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.
@@ -362,12 +314,30 @@ public class FMODWhisperBridge : MonoBehaviour
if (_skipOneFeedFrame) _skipOneFeedFrame = false;
_lastRecordPos = recPos;
}
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)
@@ -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>
/// Computes RMS (root mean square) from a PCM16 block using only safe code.
/// Uses the shared _shortOverlay buffer (no allocations).

View File

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

View File

@@ -15,6 +15,7 @@ public class ArcheryRangeNPC : NPCController
public ModelDisplay modelDisplay;
public float modelDisplaySize = 0.75f;
public Transform startTargetQuestMarkerPoint;
public KeyboardManager keyboardManager;
private Texture2D GeneratedTexture;
@@ -25,6 +26,8 @@ public class ArcheryRangeNPC : NPCController
// 3 - player pressed the image generation button
// 4 - player pressed the model generation button
// 5 - model spawned into the game
// 6 - round completed
// 7 - name submitted
private int state;
private void Awake()
@@ -37,6 +40,8 @@ public class ArcheryRangeNPC : NPCController
microphoneStand.OnPlayerUsedMicrophone += OnPlayerUsedMicrophone;
imageGenerationButton.OnButtonPressed += OnImageGenerationButtonPressed;
modelGenerationButton.OnButtonPressed += OnModelGenerationButtonPressed;
keyboardManager.OnActivate += OnRoundComplete;
keyboardManager.OnSubmit += OnNameSubmitted;
}
protected async override void OnPlayerApproach()
@@ -119,4 +124,23 @@ public class ArcheryRangeNPC : NPCController
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)
{
fmodWhisperBridge.DeactivateRecording();
bool positiveAnswer = playerText.ToLower().Contains("ye") || playerText.ToLower().Contains("correct") | playerText.ToLower().Contains("right");
bool positiveAnswer = IsPlayerAnswerPositive(playerText);
SpeakVoiceLine(positiveAnswer ? 2 : 3);
// Flip notepad back
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()
{
@@ -193,6 +204,7 @@ public class CafeWaiterNPC : NPCController
private void InitializeSpawnedObject(GameObject spawnedObject)
{
Rigidbody rigidbody = spawnedObject.AddComponent<Rigidbody>();
rigidbody.collisionDetectionMode = CollisionDetectionMode.ContinuousDynamic;
//spawnedObject.AddComponent<NetworkObject>();
//spawnedObject.AddComponent<NetworkTransform>();

View File

@@ -26,25 +26,13 @@ public abstract class NPCController : MonoBehaviour
private float[] rmsCurve;
private EventInstance currentVoicelineEvent;
private bool isSpeaking;
private float smoothed;
// If you change RMS window in Python, update this
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
void Update()
{
@@ -65,7 +53,7 @@ public abstract class NPCController : MonoBehaviour
}
}
if (isSpeaking && rmsCurve != null && currentVoicelineEvent.isValid())
if (rmsCurve != null && currentVoicelineEvent.isValid())
{
AnimateMouth();
}
@@ -105,30 +93,14 @@ public abstract class NPCController : MonoBehaviour
mouth.localScale = s;
}
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;
public void PlayerApproach() {
OnPlayerApproach();
}
public void PlayerLeave()
{
playerTransform = null;
OnPlayerLeave();
}
@@ -136,6 +108,22 @@ public abstract class NPCController : MonoBehaviour
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)
{
if (voiceLineId < 0 || voiceLineId >= voiceLineKeys.Length)
@@ -152,21 +140,15 @@ public abstract class NPCController : MonoBehaviour
LoadCurve(key); // load RMS data
emitter = emitter ?? gameObject;
emitter = emitter != null ? emitter : gameObject;
currentVoicelineEvent = AudioManager.Instance.PlayDialogue(characterSpecificFolder + "/" + key, emitter, radioAmount);
if (!currentVoicelineEvent.isValid())
{
Debug.LogError("Failed to start dialogue event.");
return;
}
isSpeaking = true;
// Stop mouth on end
float voicelineDuration = rmsCurve.Length * FRAME_DURATION;
Invoke(nameof(StopSpeaking), voicelineDuration + 0.1f);
}
// ---------------------------
// Load RMS Timeline (.txt)
// ---------------------------

View File

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

View File

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

View File

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

View File

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

View File

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

View File

@@ -40,9 +40,10 @@ public class ShapeScannerRay : MonoBehaviour
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
if (collidingObjects.Count == 1)
{
@@ -64,9 +65,10 @@ public class ShapeScannerRay : MonoBehaviour
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)
{
foreach (MeshRenderer meshRenderer in meshRenderers)

View File

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

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