sphere speaking

This commit is contained in:
2023-05-14 19:04:46 +02:00
parent e2699061da
commit 48742e7d14
5 changed files with 72 additions and 9 deletions

View File

@@ -1,19 +1,41 @@
using EscapeRoomEngine.VR.Runtime;
using System;
using System.Linq;
using EscapeRoomEngine.VR.Runtime;
using NaughtyAttributes;
using UnityEngine;
namespace Station46.Environments.Intro_Sphere.Scripts
{
public class FollowSphere : MonoBehaviour
{
public float minDistance = 0.001f;
public float speed = 200;
private const int AverageLength = 3;
private static readonly int FresnelPower = Shader.PropertyToID("_FresnelPower");
public float
minDistance = 0.001f,
speed = 200,
sizeFactor = 1,
brightnessFactor = 1;
[SerializeField] private Transform target;
[BoxGroup("Internal")] [SerializeField] private AudioSource audioSource;
[BoxGroup("Internal")] [SerializeField] private Transform centerTransform;
[BoxGroup("Internal")] [SerializeField] private MeshRenderer sphereRenderer;
private float[] _audioSamples;
private float[] _samplesAverage = new float[AverageLength];
private int averageIndex;
private float _initialBrightness;
private Material _sphereMaterial;
private Rigidbody _rigidbody;
private void Awake()
{
var clip = audioSource.clip;
_audioSamples = new float[clip.samples*clip.channels];
clip.GetData(_audioSamples, 0);
_sphereMaterial = sphereRenderer.material;
_initialBrightness = _sphereMaterial.GetFloat(FresnelPower);
_rigidbody = GetComponent<Rigidbody>();
target = Player.Instance.sphereFollow;
}
@@ -27,5 +49,21 @@ namespace Station46.Environments.Intro_Sphere.Scripts
_rigidbody.AddForce(speed * (followPosition - position));
}
}
private void Update()
{
if (audioSource.isPlaying)
{
_samplesAverage[averageIndex] = Mathf.Abs(_audioSamples[audioSource.timeSamples]);
averageIndex = (averageIndex + 1) % AverageLength;
var average = _samplesAverage.Average();
SetCenterSize(1 + sizeFactor * average);
SetSphereMaterialBrightness(_initialBrightness - brightnessFactor * average);
}
}
private void SetCenterSize(float size) => centerTransform.localScale = new Vector3(size, size, size);
private void SetSphereMaterialBrightness(float brightness) => _sphereMaterial.SetFloat(FresnelPower, brightness);
}
}