1
0
forked from cgvr/DeltaVR

archery range mic emits particles + recording is clearer to player

This commit is contained in:
2026-03-06 18:16:45 +02:00
parent c0e7f292a0
commit 08c9febd98
6 changed files with 4864 additions and 21 deletions

View File

@@ -6,21 +6,20 @@
* speech-to-text: * speech-to-text:
* 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 * proovida suuremat Whisperi mudelit, äkki töötab mürases keskkonnas paremini
* igal pool, kus mängija peab rääkima, peaks olema:
* helilained räägitava heli amplituudi põhjal
* "loading" dünaamiline ikoon kui mängija ootab protsessimise järel
* npc character: * npc character:
* klaas on näha temast eespool * klaas on näha temast eespool
* voicelines: list listidest, mille hulgast saab valida * voicelines: list listidest, mille hulgast saab valida
* shape detection: * shape detection:
* professor võiks öelda "good job, continue..." pärast esimest successi * professor võiks öelda "good job, continue..." pärast esimest successi
* kui kõik configurationid tehtud, siis professor ütleb "thank you" * kui kõik configurationid tehtud, siis professor ütleb "thank you"
* particle effectid 3d printerile
* particle effectid shape scannerile, kui config success
* 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
* archery range: * archery range:
* mikrofon peaks lõpetama protsessimise ka siis kui mängija läheb ära mikri juurest
* 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..." * kui archery range läbi, võiks npc öelda "good job, try again..."
* particle effectid model display'le
* kui midagi laeb (wire aktiivne), siis particle'id võiks voolata mööda toru * kui midagi laeb (wire aktiivne), siis particle'id võiks voolata mööda toru
* highscore json tühjaks * highscore json tühjaks
* cafe: * cafe:

File diff suppressed because it is too large Load Diff

View File

@@ -10,58 +10,72 @@ public class MicrophoneStand : MonoBehaviour
public FMODWhisperBridge fmodWhisperBridge; public FMODWhisperBridge fmodWhisperBridge;
public delegate void OnPlayerFinishedSpeakingDelegate(); public delegate void OnPlayerUsedMicrophoneDelegate();
public event OnPlayerFinishedSpeakingDelegate OnPlayerFinishedSpeaking; public event OnPlayerUsedMicrophoneDelegate OnPlayerUsedMicrophone;
[Header("Particle System Config")]
public ParticleSystem particles;
public float baseEmissionRate = 3;
public float maxExtraEmissionRate = 50;
private ParticleSystem.EmissionModule particleEmission;
// Start is called before the first frame update // Start is called before the first frame update
void Start() void Start()
{ {
microphoneOffStatus.SetActive(true); microphoneOffStatus.SetActive(true);
microphoneOnStatus.SetActive(false); microphoneOnStatus.SetActive(false);
particleEmission = particles.emission;
particleEmission.enabled = false;
} }
// Update is called once per frame // Update is called once per frame
void Update() void Update()
{ {
if (particleEmission.enabled)
{
particleEmission.rateOverTime = baseEmissionRate + fmodWhisperBridge.GetNormalizedVolume01() * maxExtraEmissionRate;
}
} }
public void OnPlayerApproach() public void OnPlayerApproach()
{ {
fmodWhisperBridge.ActivateRecording();
fmodWhisperBridge.OnWhisperSegmentUpdated += OnPlayerSpeechUpdated; fmodWhisperBridge.OnWhisperSegmentUpdated += OnPlayerSpeechUpdated;
fmodWhisperBridge.OnWhisperSegmentFinished += OnPlayerSpeechFinished; fmodWhisperBridge.OnWhisperSegmentFinished += OnPlayerSpeechFinished;
microphoneOffStatus.SetActive(false); microphoneOffStatus.SetActive(false);
microphoneOnStatus.SetActive(true); microphoneOnStatus.SetActive(true);
particleEmission.enabled = true;
AudioManager.Instance.PlayAttachedInstance(FMODEvents.Instance.RadioButton, gameObject); AudioManager.Instance.PlayAttachedInstance(FMODEvents.Instance.RadioButton, gameObject);
fmodWhisperBridge.ActivateRecording();
} }
public void OnPlayerLeave() public void OnPlayerLeave()
{ {
fmodWhisperBridge.OnWhisperSegmentUpdated -= OnPlayerSpeechUpdated; fmodWhisperBridge.OnWhisperSegmentUpdated -= OnPlayerSpeechUpdated;
fmodWhisperBridge.OnWhisperSegmentFinished -= OnPlayerSpeechFinished; fmodWhisperBridge.OnWhisperSegmentFinished -= OnPlayerSpeechFinished;
fmodWhisperBridge.DeactivateRecording();
microphoneOffStatus.SetActive(true); microphoneOffStatus.SetActive(true);
microphoneOnStatus.SetActive(false); microphoneOnStatus.SetActive(false);
particleEmission.enabled = false;
AudioManager.Instance.PlayAttachedInstance(FMODEvents.Instance.RadioButton, gameObject); AudioManager.Instance.PlayAttachedInstance(FMODEvents.Instance.RadioButton, gameObject);
fmodWhisperBridge.DeactivateRecording();
} }
private void OnPlayerSpeechUpdated(string text) private void OnPlayerSpeechUpdated(string text)
{ {
outputText.text = text; outputText.text = text;
OnPlayerFinishedSpeaking?.Invoke(); OnPlayerUsedMicrophone?.Invoke();
} }
private void OnPlayerSpeechFinished(string playerText) private void OnPlayerSpeechFinished(string text)
{ {
OnPlayerFinishedSpeaking?.Invoke(); outputText.text = text;
OnPlayerUsedMicrophone?.Invoke();
} }
public string GetTextOutput() public string GetTextOutput()
{ {
return outputText.text; return outputText.text;
} }
} }

View File

@@ -34,7 +34,7 @@ public class ArcheryRangeNPC : NPCController
private void Start() private void Start()
{ {
microphoneStand.OnPlayerFinishedSpeaking += OnPlayerUsedMicrophone; microphoneStand.OnPlayerUsedMicrophone += OnPlayerUsedMicrophone;
imageGenerationButton.OnButtonPressed += OnImageGenerationButtonPressed; imageGenerationButton.OnButtonPressed += OnImageGenerationButtonPressed;
modelGenerationButton.OnButtonPressed += OnModelGenerationButtonPressed; modelGenerationButton.OnButtonPressed += OnModelGenerationButtonPressed;
} }

View File

@@ -38,11 +38,9 @@ public class RadioTransmitter : XRGrabInteractable
// Update is called once per frame // Update is called once per frame
void Update() void Update()
{ {
if (particles.emission.enabled) if (particleEmission.enabled)
{ {
particles.transform.LookAt(computerScreen.transform.position); particles.transform.LookAt(computerScreen.transform.position);
Debug.Log("speech volume normalized: " + fmodWhisperBridge.GetNormalizedVolume01());
Debug.Log("speech volume decibels: " + fmodWhisperBridge.GetCurrentVolumeDb());
particleEmission.rateOverTime = baseEmissionRate + fmodWhisperBridge.GetNormalizedVolume01() * maxExtraEmissionRate; particleEmission.rateOverTime = baseEmissionRate + fmodWhisperBridge.GetNormalizedVolume01() * maxExtraEmissionRate;
} }
} }