前提・実現したいこと
Unityでカメラの位置を取得し、そこからシェーダをスタートさせたい
カスタムシェーダーをマイクから入力したボリュームの音声データによって
カメラの位置から実行するようにしたいです
今はマウスの位置でスタートするようになっていますが
カメラの位置を取得しそこから実行するには、シェーダー実行のスクリプトにどのように書けばいいか悩んでいます…
声を入力→一定数以上のボリュームでシェーダスタート までは実現できています。
初心者で、拙い質問申し訳ないのですがアドバイスいただけると幸いです
###シェーダコントローラー
C#
1using UnityEngine; 2 3public class EcholocationController : MonoBehaviour 4{ 5 private static readonly int Center = Shader.PropertyToID("_Center"); 6 private static readonly int Radius = Shader.PropertyToID("_Radius"); 7 8 // ここにインスペクター上でEcholocationマテリアルをセットしておく 9 [SerializeField] private Material material; 10 11 // 半径が大きくなるスピード 12 [SerializeField][Min(0.0f)] private float speed = 5.0f; 13 14 // 現在の半径 15 private float radius; 16 17 // 半径の初期値は無限大としておく 18 private void OnEnable() 19 { 20 this.radius = Mathf.Infinity; 21 } 22 23 // 毎フレーム半径のセットおよび拡張を行う 24 private void Update() 25 { 26 this.material.SetFloat(Radius, this.radius); 27 this.radius += this.speed * Time.deltaTime; 28 } 29 30 // 他のスクリプトからEmitCallを実行することで 31 // 中心点を設定し、半径を0にリセットする 32 public void EmitCall(Vector3 position) 33 { 34 this.radius = 0.0f; 35 this.material.SetVector(Center, position); 36 } 37}
シェーダー実行
C#
1using UnityEngine; 2using System.Linq; 3 4[RequireComponent(typeof(EcholocationController))] 5public class EcholocationTest : MonoBehaviour 6{ 7 private EcholocationController controller; 8 private Camera mainCamera; 9 public static AudioSource aud; 10private void Start() 11 { 12 this.mainCamera = Camera.main; 13 this.controller = this.GetComponent<EcholocationController>(); 14 15 aud = GetComponent<AudioSource>(); 16 aud.clip = Microphone.Start(null, true, 999, 44100); 17 // マイクからのAudio-InをAudioSourceに流す 18 aud.loop = true; 19 // ループ再生にしておく 20 21 // マイクからの入力音なので音を流す必要がない 22 while (!(Microphone.GetPosition("") > 0)){} 23 // マイクが取れるまで待つ。空文字でデフォルトのマイクを探してくれる 24 aud.Play(); 25 // 再生する 26 } 27 private float[] waveData_ = new float[1024]; 28 29 float GetAveragedVolume(AudioSource aud) { 30 float[] data = new float[256]; 31 float a = 0; 32 aud.GetOutputData(data,0); 33 foreach(float s in data) { a += Mathf.Abs(s); } return a/256.0f; 34} 35 private void Update() 36 37 { 38 float vol = GetAveragedVolume(aud); 39 AudioListener.GetOutputData(waveData_, 1); 40 var volume = waveData_.Select(x => x*x).Sum() / waveData_.Length; 41 42 if (vol > 0.03 && Physics.Raycast(this.mainCamera.ScreenPointToRay(Input.mousePosition), out var hitInfo)) 43 { 44 45 Debug.Log("success"); 46 this.controller.EmitCall(hitInfo.point); 47 48 } 49 50
補足情報(FW/ツールのバージョンなど)
Oculus Integration
MacOS BigSur バージョン11.2.3
unityバージョン2021.1.15fi
ヘッドセット・ OculusQuest2
あなたの回答
tips
プレビュー