1
0
forked from cgvr/DeltaVR

moved archery range model generation logic to npc script, added corresponding voicelines

This commit is contained in:
2026-02-08 12:28:59 +02:00
parent 53295a60ed
commit dc55e8d884
12 changed files with 323 additions and 145 deletions

View File

@@ -1,15 +1,118 @@
using System;
using UnityEngine;
using UnityEngine.UI;
using FMOD.Studio;
using System.Threading.Tasks;
public class ArcheryRangeNPC : NPCController
{
protected override void OnPlayerApproach()
[Header("Archery Range Config")]
public MicrophoneStand microphoneStand;
public PushableButton imageGenerationButton;
public PushableButton modelGenerationButton;
public Image imageDisplay;
public ModelDisplay modelDisplay;
private Texture2D GeneratedTexture;
private EventInstance printingSound;
// states:
// 0 - idle
// 1 - player approached
// 2 - player used microphone
// 3 - player pressed the image generation button
// 4 - player pressed the model generation button
// 5 - model spawned into the game
private int state;
private void Awake()
{
Debug.Log("Alien NPC: player approached");
SpeakVoiceLine(0);
state = 0;
}
private void Start()
{
microphoneStand.OnPlayerFinishedSpeaking += OnPlayerUsedMicrophone;
imageGenerationButton.OnButtonPressed += OnImageGenerationButtonPressed;
modelGenerationButton.OnButtonPressed += OnModelGenerationButtonPressed;
printingSound = AudioManager.Instance.CreateInstance(FMODEvents.Instance.Printing);
printingSound.setParameterByName("3DPrinterPrintingJob", 1);
}
protected async override void OnPlayerApproach()
{
if (state == 0)
{
SpeakVoiceLine(0);
await Task.Delay(2000);
SpeakVoiceLine(1);
await Task.Delay(6500);
SpeakVoiceLine(2);
await Task.Delay(3000);
state = 1;
}
}
protected override void OnPlayerLeave()
{
Debug.Log("Alien NPC: player left");
}
private void OnPlayerUsedMicrophone()
{
if (state == 1)
{
SpeakVoiceLine(3);
state = 2;
}
}
private async void OnImageGenerationButtonPressed()
{
if (state == 2)
{
state = 3;
}
string inputPrompt = microphoneStand.GetTextOutput();
byte[] imageBytes = await InvokeAiClient.Instance.GenerateImage(inputPrompt);
GeneratedTexture = ModelGenerationUtils.CreateTexture(imageBytes);
Sprite sprite = ModelGenerationUtils.CreateSprite(GeneratedTexture);
imageDisplay.sprite = sprite;
imageGenerationButton.Deactivate();
if (state == 3)
{
modelGenerationButton.Deactivate();
SpeakVoiceLine(4);
}
}
private async void OnModelGenerationButtonPressed()
{
if (state == 3)
{
state = 4;
}
printingSound.start();
printingSound.setParameterByName("3DPrinterPrintingJob", 0);
string encodedTexture = Convert.ToBase64String(GeneratedTexture.EncodeToJPG());
byte[] encodedModel = await TrellisClient.Instance.GenerateModel(encodedTexture);
GameObject spawnedObject = await ModelGenerationUtils.Instance.SpawnModel(encodedModel);
modelDisplay.DisplayModel(spawnedObject);
if (state == 4)
{
SpeakVoiceLine(5);
state = 5;
}
printingSound.setParameterByName("3DPrinterPrintingJob", 1);
modelGenerationButton.Deactivate();
}
}