From b065df958817ae3d7dd17b28d49473a4d681eed3 Mon Sep 17 00:00:00 2001 From: Geoff Moore Date: Tue, 8 Feb 2022 11:12:05 -0500 Subject: [PATCH 1/8] Checks for valid token before calling SetVoice. Prevents Unity crashes if no voice found. --- .gitignore | 9 +++++ .../UAP/NativePlugins~/WindowsTTS/dllmain.cpp | 40 ++++++++++--------- .../UAP/NativePlugins~/WindowsTTS/framework.h | 5 +++ Assets/UAP/NativePlugins~/WindowsTTS/pch.cpp | 5 +++ Assets/UAP/NativePlugins~/WindowsTTS/pch.h | 13 ++++++ 5 files changed, 53 insertions(+), 19 deletions(-) create mode 100644 .gitignore create mode 100644 Assets/UAP/NativePlugins~/WindowsTTS/framework.h create mode 100644 Assets/UAP/NativePlugins~/WindowsTTS/pch.cpp create mode 100644 Assets/UAP/NativePlugins~/WindowsTTS/pch.h diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..041d111 --- /dev/null +++ b/.gitignore @@ -0,0 +1,9 @@ +################################################################################ +# This .gitignore file was automatically created by Microsoft(R) Visual Studio. +################################################################################ + +/.vs +UnityAccessibilityPlugin.sln +*.vcxproj* +/Assets/UAP/NativePlugins~/WindowsTTS/x64/* +/x64/Release diff --git a/Assets/UAP/NativePlugins~/WindowsTTS/dllmain.cpp b/Assets/UAP/NativePlugins~/WindowsTTS/dllmain.cpp index eadb2e4..465dd76 100644 --- a/Assets/UAP/NativePlugins~/WindowsTTS/dllmain.cpp +++ b/Assets/UAP/NativePlugins~/WindowsTTS/dllmain.cpp @@ -4,26 +4,26 @@ #include "pch.h" #include "WindowsTTS.h" -#include -#include #include #include +#include +#include -namespace WindowsVoice +namespace WindowsVoice { int Volume = 100; int Rate = 0; bool IsSpeaking = false; - ISpVoice * pVoice = NULL; + ISpVoice* pVoice = NULL; void SpeechThreadFunc() { //SpeechSynthesizer* synth = new SpeechSynthesizer(); - SPVOICESTATUS *pStatus = new SPVOICESTATUS(); + SPVOICESTATUS* pStatus = new SPVOICESTATUS(); if (FAILED(::CoInitializeEx(NULL, COINITBASE_MULTITHREADED))) { @@ -31,7 +31,7 @@ namespace WindowsVoice return; } - HRESULT hr = CoCreateInstance(CLSID_SpVoice, NULL, CLSCTX_ALL, IID_ISpVoice, (void **)&pVoice); + HRESULT hr = CoCreateInstance(CLSID_SpVoice, NULL, CLSCTX_ALL, IID_ISpVoice, (void**)&pVoice); pVoice->SetRate(Rate); pVoice->SetVolume(Volume); if (!SUCCEEDED(hr)) @@ -86,10 +86,10 @@ namespace WindowsVoice if (wText) { //SetNotifyCallbackFunction - pVoice->Speak(wText, SPF_IS_NOT_XML | SPF_ASYNC, NULL); - // Sleep(250); - delete[] priorText; - priorText = wText; + pVoice->Speak(wText, SPF_IS_NOT_XML | SPF_ASYNC, NULL); + // Sleep(250); + delete[] priorText; + priorText = wText; } } pVoice->Release(); @@ -103,7 +103,7 @@ namespace WindowsVoice if (text) { int len = strlen(text) + 1; - wchar_t *wText = new wchar_t[len]; + wchar_t* wText = new wchar_t[len]; memset(wText, 0, len); ::MultiByteToWideChar(CP_ACP, NULL, text, -1, wText, len); @@ -182,20 +182,22 @@ namespace WindowsVoice { // convert char to WCHAR int len = strlen(voiceDescription) + 1; - wchar_t *wText = new wchar_t[len]; + wchar_t* wText = new wchar_t[len]; memset(wText, 0, len); ::MultiByteToWideChar(CP_ACP, NULL, voiceDescription, -1, wText, len); // Try to find a matching voice ISpObjectToken* cpToken(NULL); - SpFindBestToken(SPCAT_VOICES, wText, L"", &cpToken); - - // Set the voice - theMutex.lock(); - pVoice->SetVoice(cpToken); - theMutex.unlock(); + HRESULT hr = SpFindBestToken(SPCAT_VOICES, wText, L"", &cpToken); - cpToken->Release(); + //if there's a valid token + if (cpToken) { + // Set the voice + theMutex.lock(); + pVoice->SetVoice(cpToken); + theMutex.unlock(); + cpToken->Release(); + } } } diff --git a/Assets/UAP/NativePlugins~/WindowsTTS/framework.h b/Assets/UAP/NativePlugins~/WindowsTTS/framework.h new file mode 100644 index 0000000..54b83e9 --- /dev/null +++ b/Assets/UAP/NativePlugins~/WindowsTTS/framework.h @@ -0,0 +1,5 @@ +#pragma once + +#define WIN32_LEAN_AND_MEAN // Exclude rarely-used stuff from Windows headers +// Windows Header Files +#include diff --git a/Assets/UAP/NativePlugins~/WindowsTTS/pch.cpp b/Assets/UAP/NativePlugins~/WindowsTTS/pch.cpp new file mode 100644 index 0000000..64b7eef --- /dev/null +++ b/Assets/UAP/NativePlugins~/WindowsTTS/pch.cpp @@ -0,0 +1,5 @@ +// pch.cpp: source file corresponding to the pre-compiled header + +#include "pch.h" + +// When you are using pre-compiled headers, this source file is necessary for compilation to succeed. diff --git a/Assets/UAP/NativePlugins~/WindowsTTS/pch.h b/Assets/UAP/NativePlugins~/WindowsTTS/pch.h new file mode 100644 index 0000000..885d5d6 --- /dev/null +++ b/Assets/UAP/NativePlugins~/WindowsTTS/pch.h @@ -0,0 +1,13 @@ +// pch.h: This is a precompiled header file. +// Files listed below are compiled only once, improving build performance for future builds. +// This also affects IntelliSense performance, including code completion and many code browsing features. +// However, files listed here are ALL re-compiled if any one of them is updated between builds. +// Do not add files here that you will be updating frequently as this negates the performance advantage. + +#ifndef PCH_H +#define PCH_H + +// add headers that you want to pre-compile here +#include "framework.h" + +#endif //PCH_H From b7a7b9ee041983f3369f0287a2ceb869610cfb54 Mon Sep 17 00:00:00 2001 From: Geoff Moore Date: Tue, 8 Feb 2022 11:29:47 -0500 Subject: [PATCH 2/8] Update dllmain.cpp HResult to SPFindBestToken unused. --- Assets/UAP/NativePlugins~/WindowsTTS/dllmain.cpp | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/Assets/UAP/NativePlugins~/WindowsTTS/dllmain.cpp b/Assets/UAP/NativePlugins~/WindowsTTS/dllmain.cpp index 465dd76..6b2e07c 100644 --- a/Assets/UAP/NativePlugins~/WindowsTTS/dllmain.cpp +++ b/Assets/UAP/NativePlugins~/WindowsTTS/dllmain.cpp @@ -4,10 +4,10 @@ #include "pch.h" #include "WindowsTTS.h" -#include -#include #include #include +#include +#include namespace WindowsVoice @@ -188,7 +188,7 @@ namespace WindowsVoice // Try to find a matching voice ISpObjectToken* cpToken(NULL); - HRESULT hr = SpFindBestToken(SPCAT_VOICES, wText, L"", &cpToken); + SpFindBestToken(SPCAT_VOICES, wText, L"", &cpToken); //if there's a valid token if (cpToken) { From 3fe7fcd16e93c5d22113cf7502a48cf772e3c16b Mon Sep 17 00:00:00 2001 From: Geoff Moore Date: Tue, 8 Feb 2022 11:37:46 -0500 Subject: [PATCH 3/8] Add SetVoice Adds function to change the voice to the WindowsTTS class when using the Windows SAPI API. --- Assets/UAP/Plugins/x86_64/WindowsTTS.cs | 323 +++++++++++++----------- 1 file changed, 169 insertions(+), 154 deletions(-) diff --git a/Assets/UAP/Plugins/x86_64/WindowsTTS.cs b/Assets/UAP/Plugins/x86_64/WindowsTTS.cs index 732a375..b0a5529 100644 --- a/Assets/UAP/Plugins/x86_64/WindowsTTS.cs +++ b/Assets/UAP/Plugins/x86_64/WindowsTTS.cs @@ -5,159 +5,174 @@ public class WindowsTTS : MonoBehaviour { #if UNITY_STANDALONE_WIN || UNITY_EDITOR_WIN - [DllImport("WindowsTTS")] - public static extern void Initialize(); - [DllImport("WindowsTTS")] - public static extern void DestroySpeech(); - [DllImport("WindowsTTS")] - public static extern void StopSpeech(); - [DllImport("WindowsTTS")] - public static extern void AddToSpeechQueue(string s); - //[DllImport("WindowsTTS")] - //public static extern void SetVolume(int volume); - //[DllImport("WindowsTTS")] - //public static extern void SetRate(int rate); - [DllImport("WindowsTTS")] - public static extern bool IsVoiceSpeaking(); - - [DllImport("nvdaControllerClient")] - internal static extern int nvdaController_testIfRunning(); - - [DllImport("nvdaControllerClient", CharSet = CharSet.Auto)] - internal static extern int nvdaController_speakText(string text); - - [DllImport("nvdaControllerClient")] - internal static extern int nvdaController_cancelSpeech(); - - //[DllImport("nvdaControllerClient")] - //internal static extern int nvdaController_isSpeaking(); - - public static WindowsTTS instance = null; - private static bool m_UseNVDA = false; - private static float m_NVDAIsSpeakingTimer = -1.0f; - - ////////////////////////////////////////////////////////////////////////// - - void Awake() - { - // Test every game start whether NVDA is present - m_UseNVDA = nvdaController_testIfRunning() == 0; - } - - ////////////////////////////////////////////////////////////////////////// - - public static bool IsScreenReaderDetected() - { - m_UseNVDA = nvdaController_testIfRunning() == 0; - return m_UseNVDA; - } - - ////////////////////////////////////////////////////////////////////////// - - void Start() - { - if (instance == null) - { - instance = this; - Initialize(); - - // No longer needed, because this is now a child of the Accessibility Manager, which is already set to DontDestroyOnLoad - //DontDestroyOnLoad(gameObject); - } - else - { - Debug.LogError("[Accessibility] Trying to create another Windows TTS instance, when there already is one."); - DestroyImmediate(gameObject); - return; - } - - //Debug.Log("[Accessibility] TTS: NVDA " + (m_UseNVDA ? "detected." : "not detected")); - - //bool isWindows = Application.platform == RuntimePlatform.WindowsEditor || Application.platform == RuntimePlatform.WindowsPlayer; - //Debug.Log("[Accessibility] TTS: Window SAPI " + (isWindows ? "detected." : "not detected")); - } - - ////////////////////////////////////////////////////////////////////////// - - public static void Speak(string msg) - { - if (m_UseNVDA) - { - nvdaController_speakText(msg); - m_NVDAIsSpeakingTimer += (msg.Length / 16.0f); - } - else - { - AddToSpeechQueue(msg); - } - } - - ////////////////////////////////////////////////////////////////////////// - - public static void Stop() - { - if (m_UseNVDA) - { - nvdaController_cancelSpeech(); - m_NVDAIsSpeakingTimer = 0.0f; - } - else - { - StopSpeech(); - } - } - - ////////////////////////////////////////////////////////////////////////// - - public static bool IsSpeaking() - { - if (!Application.isPlaying) - return false; - - if (m_UseNVDA) - { - return m_NVDAIsSpeakingTimer > 0.0f; - //return nvdaController_isSpeaking() > 0; - } - else - { - return IsVoiceSpeaking(); - } - } - - ////////////////////////////////////////////////////////////////////////// - - void Update() - { - if (m_NVDAIsSpeakingTimer > 0.0f) - m_NVDAIsSpeakingTimer -= Time.unscaledDeltaTime; - } - -/* - ////////////////////////////////////////////////////////////////////////// - - public static void SetSpeechVolume(int volume) - { - SetVolume(volume); - } - - ////////////////////////////////////////////////////////////////////////// - - public static void SetSpeechRate(int rate) - { - SetRate(rate); - } -*/ - - ////////////////////////////////////////////////////////////////////////// - - void OnDestroy() - { - if (instance == this) - { - DestroySpeech(); - instance = null; - } - } + [DllImport("WindowsTTS")] + public static extern void Initialize(); + [DllImport("WindowsTTS")] + public static extern void DestroySpeech(); + [DllImport("WindowsTTS")] + public static extern void StopSpeech(); + [DllImport("WindowsTTS")] + public static extern void AddToSpeechQueue(string s); + //[DllImport("WindowsTTS")] + //public static extern void SetVolume(int volume); + //[DllImport("WindowsTTS")] + //public static extern void SetRate(int rate); + [DllImport("WindowsTTS")] + public static extern bool IsVoiceSpeaking(); + [DllImport("WindowsTTS")] + public static extern void SetVoiceSAPI(string s); + + [DllImport("nvdaControllerClient")] + internal static extern int nvdaController_testIfRunning(); + + [DllImport("nvdaControllerClient", CharSet = CharSet.Auto)] + internal static extern int nvdaController_speakText(string text); + + [DllImport("nvdaControllerClient")] + internal static extern int nvdaController_cancelSpeech(); + + //[DllImport("nvdaControllerClient")] + //internal static extern int nvdaController_isSpeaking(); + + public static WindowsTTS instance = null; + private static bool m_UseNVDA = false; + private static float m_NVDAIsSpeakingTimer = -1.0f; + + ////////////////////////////////////////////////////////////////////////// + + void Awake() + { + // Test every game start whether NVDA is present + m_UseNVDA = nvdaController_testIfRunning() == 0; + } + + ////////////////////////////////////////////////////////////////////////// + + public static bool IsScreenReaderDetected() + { + m_UseNVDA = nvdaController_testIfRunning() == 0; + return m_UseNVDA; + } + + ////////////////////////////////////////////////////////////////////////// + + void Start() + { + if (instance == null) + { + instance = this; + Initialize(); + + // No longer needed, because this is now a child of the Accessibility Manager, which is already set to DontDestroyOnLoad + //DontDestroyOnLoad(gameObject); + } + else + { + Debug.LogError("[Accessibility] Trying to create another Windows TTS instance, when there already is one."); + DestroyImmediate(gameObject); + return; + } + + //Debug.Log("[Accessibility] TTS: NVDA " + (m_UseNVDA ? "detected." : "not detected")); + + //bool isWindows = Application.platform == RuntimePlatform.WindowsEditor || Application.platform == RuntimePlatform.WindowsPlayer; + //Debug.Log("[Accessibility] TTS: Window SAPI " + (isWindows ? "detected." : "not detected")); + } + + ////////////////////////////////////////////////////////////////////////// + + public static void Speak(string msg) + { + if (m_UseNVDA) + { + nvdaController_speakText(msg); + m_NVDAIsSpeakingTimer += (msg.Length / 16.0f); + } + else + { + AddToSpeechQueue(msg); + } + } + + ////////////////////////////////////////////////////////////////////////// + /// + /// Sets the voice used by the SAPI API + /// + /// Name of the voice to be used. Can be found under HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Speech\Voices\Tokens\[voice]\Attributes. + public static void SetVoice(string name) + { + if (!m_UseNVDA) + { + SetVoiceSAPI("Name=" + name); + } + } + + ////////////////////////////////////////////////////////////////////////// + + public static void Stop() + { + if (m_UseNVDA) + { + nvdaController_cancelSpeech(); + m_NVDAIsSpeakingTimer = 0.0f; + } + else + { + StopSpeech(); + } + } + + ////////////////////////////////////////////////////////////////////////// + + public static bool IsSpeaking() + { + if (!Application.isPlaying) + return false; + + if (m_UseNVDA) + { + return m_NVDAIsSpeakingTimer > 0.0f; + //return nvdaController_isSpeaking() > 0; + } + else + { + return IsVoiceSpeaking(); + } + } + + ////////////////////////////////////////////////////////////////////////// + + void Update() + { + if (m_NVDAIsSpeakingTimer > 0.0f) + m_NVDAIsSpeakingTimer -= Time.unscaledDeltaTime; + } + + /* + ////////////////////////////////////////////////////////////////////////// + + public static void SetSpeechVolume(int volume) + { + SetVolume(volume); + } + + ////////////////////////////////////////////////////////////////////////// + + public static void SetSpeechRate(int rate) + { + SetRate(rate); + } + */ + + ////////////////////////////////////////////////////////////////////////// + + void OnDestroy() + { + if (instance == this) + { + DestroySpeech(); + instance = null; + } + } #endif } From 4175836f0c24b0a81883d87bafe3517d37ee9036 Mon Sep 17 00:00:00 2001 From: Geoff Moore Date: Tue, 8 Feb 2022 11:43:26 -0500 Subject: [PATCH 4/8] Add WindowsTTS dll to plugins --- Assets/UAP/Plugins/x86_64/WindowsTTS.dll | Bin 0 -> 68608 bytes 1 file changed, 0 insertions(+), 0 deletions(-) create mode 100644 Assets/UAP/Plugins/x86_64/WindowsTTS.dll diff --git a/Assets/UAP/Plugins/x86_64/WindowsTTS.dll b/Assets/UAP/Plugins/x86_64/WindowsTTS.dll new file mode 100644 index 0000000000000000000000000000000000000000..dd623aea26c5afb60a8ad924907162496632be6c GIT binary patch literal 68608 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 literal 0 HcmV?d00001 From d639053b0a164863144ec88e514d2ff471c73650 Mon Sep 17 00:00:00 2001 From: Geoff Moore Date: Tue, 8 Feb 2022 11:58:09 -0500 Subject: [PATCH 5/8] Update WindowsTTS.cs Formatting to match upstream. Should clean up diff. --- Assets/UAP/Plugins/x86_64/WindowsTTS.cs | 311 ++++++++++++------------ 1 file changed, 156 insertions(+), 155 deletions(-) diff --git a/Assets/UAP/Plugins/x86_64/WindowsTTS.cs b/Assets/UAP/Plugins/x86_64/WindowsTTS.cs index b0a5529..2099659 100644 --- a/Assets/UAP/Plugins/x86_64/WindowsTTS.cs +++ b/Assets/UAP/Plugins/x86_64/WindowsTTS.cs @@ -5,96 +5,97 @@ public class WindowsTTS : MonoBehaviour { #if UNITY_STANDALONE_WIN || UNITY_EDITOR_WIN - [DllImport("WindowsTTS")] - public static extern void Initialize(); - [DllImport("WindowsTTS")] - public static extern void DestroySpeech(); - [DllImport("WindowsTTS")] - public static extern void StopSpeech(); - [DllImport("WindowsTTS")] - public static extern void AddToSpeechQueue(string s); - //[DllImport("WindowsTTS")] - //public static extern void SetVolume(int volume); - //[DllImport("WindowsTTS")] - //public static extern void SetRate(int rate); - [DllImport("WindowsTTS")] - public static extern bool IsVoiceSpeaking(); - [DllImport("WindowsTTS")] + [DllImport("WindowsTTS")] + public static extern void Initialize(); + [DllImport("WindowsTTS")] + public static extern void DestroySpeech(); + [DllImport("WindowsTTS")] + public static extern void StopSpeech(); + [DllImport("WindowsTTS")] + public static extern void AddToSpeechQueue(string s); + //[DllImport("WindowsTTS")] + //public static extern void SetVolume(int volume); + //[DllImport("WindowsTTS")] + //public static extern void SetRate(int rate); + [DllImport("WindowsTTS")] + public static extern bool IsVoiceSpeaking(); + [DllImport("WindowsTTS")] public static extern void SetVoiceSAPI(string s); - [DllImport("nvdaControllerClient")] - internal static extern int nvdaController_testIfRunning(); - - [DllImport("nvdaControllerClient", CharSet = CharSet.Auto)] - internal static extern int nvdaController_speakText(string text); - - [DllImport("nvdaControllerClient")] - internal static extern int nvdaController_cancelSpeech(); - - //[DllImport("nvdaControllerClient")] - //internal static extern int nvdaController_isSpeaking(); - - public static WindowsTTS instance = null; - private static bool m_UseNVDA = false; - private static float m_NVDAIsSpeakingTimer = -1.0f; - - ////////////////////////////////////////////////////////////////////////// - - void Awake() - { - // Test every game start whether NVDA is present - m_UseNVDA = nvdaController_testIfRunning() == 0; - } - - ////////////////////////////////////////////////////////////////////////// - - public static bool IsScreenReaderDetected() - { - m_UseNVDA = nvdaController_testIfRunning() == 0; - return m_UseNVDA; - } - - ////////////////////////////////////////////////////////////////////////// - - void Start() - { - if (instance == null) - { - instance = this; - Initialize(); - - // No longer needed, because this is now a child of the Accessibility Manager, which is already set to DontDestroyOnLoad - //DontDestroyOnLoad(gameObject); - } - else - { - Debug.LogError("[Accessibility] Trying to create another Windows TTS instance, when there already is one."); - DestroyImmediate(gameObject); - return; - } - - //Debug.Log("[Accessibility] TTS: NVDA " + (m_UseNVDA ? "detected." : "not detected")); - - //bool isWindows = Application.platform == RuntimePlatform.WindowsEditor || Application.platform == RuntimePlatform.WindowsPlayer; - //Debug.Log("[Accessibility] TTS: Window SAPI " + (isWindows ? "detected." : "not detected")); - } - - ////////////////////////////////////////////////////////////////////////// - - public static void Speak(string msg) - { - if (m_UseNVDA) - { - nvdaController_speakText(msg); - m_NVDAIsSpeakingTimer += (msg.Length / 16.0f); - } - else - { - AddToSpeechQueue(msg); - } - } - - ////////////////////////////////////////////////////////////////////////// + [DllImport("nvdaControllerClient")] + internal static extern int nvdaController_testIfRunning(); + + [DllImport("nvdaControllerClient", CharSet = CharSet.Auto)] + internal static extern int nvdaController_speakText(string text); + + [DllImport("nvdaControllerClient")] + internal static extern int nvdaController_cancelSpeech(); + + //[DllImport("nvdaControllerClient")] + //internal static extern int nvdaController_isSpeaking(); + + public static WindowsTTS instance = null; + private static bool m_UseNVDA = false; + private static float m_NVDAIsSpeakingTimer = -1.0f; + + ////////////////////////////////////////////////////////////////////////// + + void Awake() + { + // Test every game start whether NVDA is present + m_UseNVDA = nvdaController_testIfRunning() == 0; + } + + ////////////////////////////////////////////////////////////////////////// + + public static bool IsScreenReaderDetected() + { + m_UseNVDA = nvdaController_testIfRunning() == 0; + return m_UseNVDA; + } + + ////////////////////////////////////////////////////////////////////////// + + void Start() + { + if (instance == null) + { + instance = this; + Initialize(); + + // No longer needed, because this is now a child of the Accessibility Manager, which is already set to DontDestroyOnLoad + //DontDestroyOnLoad(gameObject); + } + else + { + Debug.LogError("[Accessibility] Trying to create another Windows TTS instance, when there already is one."); + DestroyImmediate(gameObject); + return; + } + + //Debug.Log("[Accessibility] TTS: NVDA " + (m_UseNVDA ? "detected." : "not detected")); + + //bool isWindows = Application.platform == RuntimePlatform.WindowsEditor || Application.platform == RuntimePlatform.WindowsPlayer; + //Debug.Log("[Accessibility] TTS: Window SAPI " + (isWindows ? "detected." : "not detected")); + } + + ////////////////////////////////////////////////////////////////////////// + + public static void Speak(string msg) + { + if (m_UseNVDA) + { + nvdaController_speakText(msg); + m_NVDAIsSpeakingTimer += (msg.Length / 16.0f); + } + else + { + AddToSpeechQueue(msg); + } + } + + ////////////////////////////////////////////////////////////////////////// + /// /// Sets the voice used by the SAPI API /// @@ -107,72 +108,72 @@ public static void SetVoice(string name) } } - ////////////////////////////////////////////////////////////////////////// - - public static void Stop() - { - if (m_UseNVDA) - { - nvdaController_cancelSpeech(); - m_NVDAIsSpeakingTimer = 0.0f; - } - else - { - StopSpeech(); - } - } - - ////////////////////////////////////////////////////////////////////////// - - public static bool IsSpeaking() - { - if (!Application.isPlaying) - return false; - - if (m_UseNVDA) - { - return m_NVDAIsSpeakingTimer > 0.0f; - //return nvdaController_isSpeaking() > 0; - } - else - { - return IsVoiceSpeaking(); - } - } - - ////////////////////////////////////////////////////////////////////////// - - void Update() - { - if (m_NVDAIsSpeakingTimer > 0.0f) - m_NVDAIsSpeakingTimer -= Time.unscaledDeltaTime; - } - - /* - ////////////////////////////////////////////////////////////////////////// - - public static void SetSpeechVolume(int volume) - { - SetVolume(volume); - } - - ////////////////////////////////////////////////////////////////////////// - - public static void SetSpeechRate(int rate) - { - SetRate(rate); - } - */ - - ////////////////////////////////////////////////////////////////////////// - - void OnDestroy() - { - if (instance == this) - { - DestroySpeech(); - instance = null; - } - } + ////////////////////////////////////////////////////////////////////////// + + public static void Stop() + { + if (m_UseNVDA) + { + nvdaController_cancelSpeech(); + m_NVDAIsSpeakingTimer = 0.0f; + } + else + { + StopSpeech(); + } + } + + ////////////////////////////////////////////////////////////////////////// + + public static bool IsSpeaking() + { + if (!Application.isPlaying) + return false; + + if (m_UseNVDA) + { + return m_NVDAIsSpeakingTimer > 0.0f; + //return nvdaController_isSpeaking() > 0; + } + else + { + return IsVoiceSpeaking(); + } + } + + ////////////////////////////////////////////////////////////////////////// + + void Update() + { + if (m_NVDAIsSpeakingTimer > 0.0f) + m_NVDAIsSpeakingTimer -= Time.unscaledDeltaTime; + } + +/* + ////////////////////////////////////////////////////////////////////////// + + public static void SetSpeechVolume(int volume) + { + SetVolume(volume); + } + + ////////////////////////////////////////////////////////////////////////// + + public static void SetSpeechRate(int rate) + { + SetRate(rate); + } +*/ + + ////////////////////////////////////////////////////////////////////////// + + void OnDestroy() + { + if (instance == this) + { + DestroySpeech(); + instance = null; + } + } #endif } From 9b189aa0da508b72c32372c09567a055b94f6b3a Mon Sep 17 00:00:00 2001 From: Geoff Moore Date: Wed, 9 Feb 2022 15:45:20 -0500 Subject: [PATCH 6/8] Enables rate changes when using Windows SAPI API --- .../UAP/NativePlugins~/WindowsTTS/dllmain.cpp | 1 + Assets/UAP/Plugins/x86_64/WindowsTTS.cs | 266 +++++++++--------- Assets/UAP/Plugins/x86_64/WindowsTTS.dll | Bin 68608 -> 68608 bytes 3 files changed, 138 insertions(+), 129 deletions(-) diff --git a/Assets/UAP/NativePlugins~/WindowsTTS/dllmain.cpp b/Assets/UAP/NativePlugins~/WindowsTTS/dllmain.cpp index 6b2e07c..a1f31bd 100644 --- a/Assets/UAP/NativePlugins~/WindowsTTS/dllmain.cpp +++ b/Assets/UAP/NativePlugins~/WindowsTTS/dllmain.cpp @@ -159,6 +159,7 @@ namespace WindowsVoice { theMutex.lock(); Rate = rate; + pVoice->SetRate(Rate); theMutex.unlock(); } diff --git a/Assets/UAP/Plugins/x86_64/WindowsTTS.cs b/Assets/UAP/Plugins/x86_64/WindowsTTS.cs index 2099659..c25c838 100644 --- a/Assets/UAP/Plugins/x86_64/WindowsTTS.cs +++ b/Assets/UAP/Plugins/x86_64/WindowsTTS.cs @@ -5,97 +5,97 @@ public class WindowsTTS : MonoBehaviour { #if UNITY_STANDALONE_WIN || UNITY_EDITOR_WIN - [DllImport("WindowsTTS")] - public static extern void Initialize(); - [DllImport("WindowsTTS")] - public static extern void DestroySpeech(); - [DllImport("WindowsTTS")] - public static extern void StopSpeech(); - [DllImport("WindowsTTS")] - public static extern void AddToSpeechQueue(string s); - //[DllImport("WindowsTTS")] - //public static extern void SetVolume(int volume); - //[DllImport("WindowsTTS")] - //public static extern void SetRate(int rate); - [DllImport("WindowsTTS")] - public static extern bool IsVoiceSpeaking(); - [DllImport("WindowsTTS")] + [DllImport("WindowsTTS")] + public static extern void Initialize(); + [DllImport("WindowsTTS")] + public static extern void DestroySpeech(); + [DllImport("WindowsTTS")] + public static extern void StopSpeech(); + [DllImport("WindowsTTS")] + public static extern void AddToSpeechQueue(string s); + //[DllImport("WindowsTTS")] + //public static extern void SetVolume(int volume); + [DllImport("WindowsTTS")] + public static extern void SetRate(int rate); + [DllImport("WindowsTTS")] + public static extern bool IsVoiceSpeaking(); + [DllImport("WindowsTTS")] public static extern void SetVoiceSAPI(string s); - [DllImport("nvdaControllerClient")] - internal static extern int nvdaController_testIfRunning(); + [DllImport("nvdaControllerClient")] + internal static extern int nvdaController_testIfRunning(); - [DllImport("nvdaControllerClient", CharSet = CharSet.Auto)] - internal static extern int nvdaController_speakText(string text); + [DllImport("nvdaControllerClient", CharSet = CharSet.Auto)] + internal static extern int nvdaController_speakText(string text); - [DllImport("nvdaControllerClient")] - internal static extern int nvdaController_cancelSpeech(); + [DllImport("nvdaControllerClient")] + internal static extern int nvdaController_cancelSpeech(); - //[DllImport("nvdaControllerClient")] - //internal static extern int nvdaController_isSpeaking(); + //[DllImport("nvdaControllerClient")] + //internal static extern int nvdaController_isSpeaking(); - public static WindowsTTS instance = null; - private static bool m_UseNVDA = false; - private static float m_NVDAIsSpeakingTimer = -1.0f; + public static WindowsTTS instance = null; + private static bool m_UseNVDA = false; + private static float m_NVDAIsSpeakingTimer = -1.0f; - ////////////////////////////////////////////////////////////////////////// + ////////////////////////////////////////////////////////////////////////// - void Awake() - { - // Test every game start whether NVDA is present - m_UseNVDA = nvdaController_testIfRunning() == 0; - } + void Awake() + { + // Test every game start whether NVDA is present + m_UseNVDA = nvdaController_testIfRunning() == 0; + } - ////////////////////////////////////////////////////////////////////////// + ////////////////////////////////////////////////////////////////////////// - public static bool IsScreenReaderDetected() - { - m_UseNVDA = nvdaController_testIfRunning() == 0; - return m_UseNVDA; - } + public static bool IsScreenReaderDetected() + { + m_UseNVDA = nvdaController_testIfRunning() == 0; + return m_UseNVDA; + } - ////////////////////////////////////////////////////////////////////////// + ////////////////////////////////////////////////////////////////////////// - void Start() - { - if (instance == null) - { - instance = this; - Initialize(); + void Start() + { + if (instance == null) + { + instance = this; + Initialize(); - // No longer needed, because this is now a child of the Accessibility Manager, which is already set to DontDestroyOnLoad - //DontDestroyOnLoad(gameObject); - } - else - { - Debug.LogError("[Accessibility] Trying to create another Windows TTS instance, when there already is one."); - DestroyImmediate(gameObject); - return; - } + // No longer needed, because this is now a child of the Accessibility Manager, which is already set to DontDestroyOnLoad + //DontDestroyOnLoad(gameObject); + } + else + { + Debug.LogError("[Accessibility] Trying to create another Windows TTS instance, when there already is one."); + DestroyImmediate(gameObject); + return; + } - //Debug.Log("[Accessibility] TTS: NVDA " + (m_UseNVDA ? "detected." : "not detected")); + //Debug.Log("[Accessibility] TTS: NVDA " + (m_UseNVDA ? "detected." : "not detected")); - //bool isWindows = Application.platform == RuntimePlatform.WindowsEditor || Application.platform == RuntimePlatform.WindowsPlayer; - //Debug.Log("[Accessibility] TTS: Window SAPI " + (isWindows ? "detected." : "not detected")); - } + //bool isWindows = Application.platform == RuntimePlatform.WindowsEditor || Application.platform == RuntimePlatform.WindowsPlayer; + //Debug.Log("[Accessibility] TTS: Window SAPI " + (isWindows ? "detected." : "not detected")); + } - ////////////////////////////////////////////////////////////////////////// - - public static void Speak(string msg) - { - if (m_UseNVDA) - { - nvdaController_speakText(msg); - m_NVDAIsSpeakingTimer += (msg.Length / 16.0f); - } - else - { - AddToSpeechQueue(msg); - } - } + ////////////////////////////////////////////////////////////////////////// + + public static void Speak(string msg) + { + if (m_UseNVDA) + { + nvdaController_speakText(msg); + m_NVDAIsSpeakingTimer += (msg.Length / 16.0f); + } + else + { + AddToSpeechQueue(msg); + } + } + + ////////////////////////////////////////////////////////////////////////// - ////////////////////////////////////////////////////////////////////////// - /// /// Sets the voice used by the SAPI API /// @@ -108,72 +108,80 @@ public static void SetVoice(string name) } } - ////////////////////////////////////////////////////////////////////////// + ////////////////////////////////////////////////////////////////////////// - public static void Stop() - { - if (m_UseNVDA) - { - nvdaController_cancelSpeech(); - m_NVDAIsSpeakingTimer = 0.0f; - } - else - { - StopSpeech(); - } - } + public static void Stop() + { + if (m_UseNVDA) + { + nvdaController_cancelSpeech(); + m_NVDAIsSpeakingTimer = 0.0f; + } + else + { + StopSpeech(); + } + } - ////////////////////////////////////////////////////////////////////////// + ////////////////////////////////////////////////////////////////////////// - public static bool IsSpeaking() - { - if (!Application.isPlaying) - return false; + public static bool IsSpeaking() + { + if (!Application.isPlaying) + return false; - if (m_UseNVDA) - { - return m_NVDAIsSpeakingTimer > 0.0f; - //return nvdaController_isSpeaking() > 0; - } - else + if (m_UseNVDA) + { + return m_NVDAIsSpeakingTimer > 0.0f; + //return nvdaController_isSpeaking() > 0; + } + else + { + return IsVoiceSpeaking(); + } + } + + ////////////////////////////////////////////////////////////////////////// + + void Update() + { + if (m_NVDAIsSpeakingTimer > 0.0f) + m_NVDAIsSpeakingTimer -= Time.unscaledDeltaTime; + } + + /* + ////////////////////////////////////////////////////////////////////////// + + public static void SetSpeechVolume(int volume) { - return IsVoiceSpeaking(); + SetVolume(volume); } - } - - ////////////////////////////////////////////////////////////////////////// - void Update() - { - if (m_NVDAIsSpeakingTimer > 0.0f) - m_NVDAIsSpeakingTimer -= Time.unscaledDeltaTime; - } + */ -/* - ////////////////////////////////////////////////////////////////////////// + ////////////////////////////////////////////////////////////////////////// - public static void SetSpeechVolume(int volume) - { - SetVolume(volume); - } + public static void SetSpeechRate(int rate) + { + //if using SAPI + if (!m_UseNVDA) + { + //normalize the rate to -10 to 10 range + rate = -10 + (rate - 1) * 20 / 99; + } + SetRate(rate); + } - ////////////////////////////////////////////////////////////////////////// - public static void SetSpeechRate(int rate) - { - SetRate(rate); - } -*/ - - ////////////////////////////////////////////////////////////////////////// + ////////////////////////////////////////////////////////////////////////// - void OnDestroy() - { - if (instance == this) - { - DestroySpeech(); - instance = null; - } - } + void OnDestroy() + { + if (instance == this) + { + DestroySpeech(); + instance = null; + } + } #endif } diff --git a/Assets/UAP/Plugins/x86_64/WindowsTTS.dll b/Assets/UAP/Plugins/x86_64/WindowsTTS.dll index dd623aea26c5afb60a8ad924907162496632be6c..3a2411ff91f2046ba6f6846ae7665d3ac8a972d6 100644 GIT binary patch delta 149 zcmZpe!O}2;WrF}CbFvD{W?{xB+J>4Q-Mo@}7#O-Qcgk`CX^(Ek{}UcC02#f!njn7j z5rycNQA|J;Ctkz@sm&U?`HV(dKy8(~7#R4s1NB90h3fkN(boZ#fau!^6aebm2c$Ni d)H9yN$g=tGiTQGjnv>@~*JnJn`RsFJ6#x{uG$a53 delta 124 zcmZpe!O}2;WrF}Cv(7B0&BBaNwB^M;dU+l9Ffeq=asx?^<|7KxFLRg}7`jiqC Date: Wed, 16 Feb 2022 15:55:20 -0500 Subject: [PATCH 7/8] Adds x86 dlls. SetVoice and SetRate from UAP_AccessibilityManager --- Assets/UAP/Plugins/x86/WindowsTTS.dll | Bin 0 -> 57856 bytes Assets/UAP/Plugins/x86_64/WindowsTTS.cs | 4 +-- Assets/UAP/Plugins/x86_64/WindowsTTS.dll | Bin 68608 -> 68608 bytes .../Scripts/Core/UAP_AccessibilityManager.cs | 16 +++++++++ Assets/UAP/Scripts/Core/UAP_AudioQueue.cs | 32 ++++++++++++++++++ 5 files changed, 50 insertions(+), 2 deletions(-) create mode 100644 Assets/UAP/Plugins/x86/WindowsTTS.dll diff --git a/Assets/UAP/Plugins/x86/WindowsTTS.dll b/Assets/UAP/Plugins/x86/WindowsTTS.dll new file mode 100644 index 0000000000000000000000000000000000000000..ea5e55275091be7155f66faf6aed3cdac49465e5 GIT binary patch literal 57856 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 BfXx5^ literal 0 HcmV?d00001 diff --git a/Assets/UAP/Plugins/x86_64/WindowsTTS.cs b/Assets/UAP/Plugins/x86_64/WindowsTTS.cs index c25c838..c8430c2 100644 --- a/Assets/UAP/Plugins/x86_64/WindowsTTS.cs +++ b/Assets/UAP/Plugins/x86_64/WindowsTTS.cs @@ -166,8 +166,8 @@ public static void SetSpeechRate(int rate) //if using SAPI if (!m_UseNVDA) { - //normalize the rate to -10 to 10 range - rate = -10 + (rate - 1) * 20 / 99; + //normalize the standard 1-100 rate to SAPI -10 to 10 range + rate = -10 + (int)((rate - 1) * 0.202); } SetRate(rate); } diff --git a/Assets/UAP/Plugins/x86_64/WindowsTTS.dll b/Assets/UAP/Plugins/x86_64/WindowsTTS.dll index 3a2411ff91f2046ba6f6846ae7665d3ac8a972d6..435951511052581d3cdfb470139ab033cb5530af 100644 GIT binary patch delta 77 zcmV-T0J8spm;`{B1h5bR1A{jWvl9V?Egu(1jSZo?004;{TeScHNQ1;6Tj|UI004`~ j=+OWG0F!|S8k0aC2D8>KCYk{Sv;D}=9s#$r&F3>D(Y+hA delta 88 zcmZpe!O}2;WrF}CbFvD{W?{w_T_Y`zZr;jW3=I6+FL%mDY-M2Z=w|#s;R6GZ(aYNb pl<;Uiq7eOZCs3gK#EX4EYV%1w<5`R>oBy6TFUNRl^V#RdDgX)YAVB~C diff --git a/Assets/UAP/Scripts/Core/UAP_AccessibilityManager.cs b/Assets/UAP/Scripts/Core/UAP_AccessibilityManager.cs index 9c61b0f..b07ba27 100644 --- a/Assets/UAP/Scripts/Core/UAP_AccessibilityManager.cs +++ b/Assets/UAP/Scripts/Core/UAP_AccessibilityManager.cs @@ -4704,6 +4704,22 @@ static public void StopSpeaking() instance.m_AudioQueue.Stop(); } + ////////////////////////////////////////////////////////////////////////// + + /// + /// Set the voice used by the screen reader. + /// Only works with the Windows SAPI TTS + /// Available voices can be found in the registry under HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Speech\Voices\Tokens\[voice]\Attributes\Name + /// + /// Name of the voice to be used + /// + static public string SetVoice(string voice) + { + Initialize(); + return instance.m_AudioQueue.SetVoice(voice); + } + + ////////////////////////////////////////////////////////////////////////// /// diff --git a/Assets/UAP/Scripts/Core/UAP_AudioQueue.cs b/Assets/UAP/Scripts/Core/UAP_AudioQueue.cs index 4d95fef..05bc51e 100644 --- a/Assets/UAP/Scripts/Core/UAP_AudioQueue.cs +++ b/Assets/UAP/Scripts/Core/UAP_AudioQueue.cs @@ -1,6 +1,7 @@ using UnityEngine; using System.Collections; using System.Collections.Generic; +using System.Text.RegularExpressions; [RequireComponent(typeof(AudioSource))] [AddComponentMenu("Accessibility/Core/UAP Audio Queue")] @@ -28,6 +29,11 @@ public class UAP_AudioQueue : MonoBehaviour /// private int m_SpeechRate = 65; + /// + /// The name of the current screen reader voice + /// + private string m_SpeechVoice = ""; + private AudioSource m_AudioPlayer = null; private Queue m_AudioQueue = new Queue(); private SAudioEntry m_ActiveEntry = null; @@ -622,6 +628,14 @@ public int SetSpeechRate(int speechRate) if (m_SpeechRate > 100) m_SpeechRate = 100; + #if UNITY_STANDALONE_WIN || UNITY_EDITOR_WIN + if (UAP_AccessibilityManager.UseWindowsTTS() && WindowsTTS.instance != null) + { + //use WindowsTTS to set the rate + WindowsTTS.SetSpeechRate(m_SpeechRate); + } + #endif + PlayerPrefs.SetInt("Accessibility_Speech_Rate", m_SpeechRate); PlayerPrefs.Save(); @@ -630,6 +644,24 @@ public int SetSpeechRate(int speechRate) ////////////////////////////////////////////////////////////////////////// + public string SetVoice(string newVoice) + { + m_SpeechVoice = newVoice; + + #if UNITY_STANDALONE_WIN || UNITY_EDITOR_WIN + if (UAP_AccessibilityManager.UseWindowsTTS() && WindowsTTS.instance != null) + { + //use WindowsTTS to set the rate + WindowsTTS.SetVoice(m_SpeechVoice); + } + #endif + + return m_SpeechVoice; + } + + ////////////////////////////////////////////////////////////////////////// + + /// /// This function is used to activate third-party custom Text-to-Speech engines. /// From c954d2141c43fb6059bf8ac37fc1fc47807b6042 Mon Sep 17 00:00:00 2001 From: Geoff Moore Date: Tue, 18 Apr 2023 14:05:18 -0400 Subject: [PATCH 8/8] Adds Example for Microsoft SAPI Voice Changes --- .gitignore | 1 + Assets/UAP/Examples/Voice Change Example.meta | 8 + .../Voice Change Example/Scripts.meta | 8 + .../Scripts/VoiceChangeController.cs | 121 ++ .../Scripts/VoiceChangeController.cs.meta | 11 + .../Voice Change Demo.unity | 1683 +++++++++++++++++ .../Voice Change Demo.unity.meta | 7 + 7 files changed, 1839 insertions(+) create mode 100644 Assets/UAP/Examples/Voice Change Example.meta create mode 100644 Assets/UAP/Examples/Voice Change Example/Scripts.meta create mode 100644 Assets/UAP/Examples/Voice Change Example/Scripts/VoiceChangeController.cs create mode 100644 Assets/UAP/Examples/Voice Change Example/Scripts/VoiceChangeController.cs.meta create mode 100644 Assets/UAP/Examples/Voice Change Example/Voice Change Demo.unity create mode 100644 Assets/UAP/Examples/Voice Change Example/Voice Change Demo.unity.meta diff --git a/.gitignore b/.gitignore index 041d111..55a5d3a 100644 --- a/.gitignore +++ b/.gitignore @@ -7,3 +7,4 @@ UnityAccessibilityPlugin.sln *.vcxproj* /Assets/UAP/NativePlugins~/WindowsTTS/x64/* /x64/Release +.DS_Store diff --git a/Assets/UAP/Examples/Voice Change Example.meta b/Assets/UAP/Examples/Voice Change Example.meta new file mode 100644 index 0000000..2bb93ec --- /dev/null +++ b/Assets/UAP/Examples/Voice Change Example.meta @@ -0,0 +1,8 @@ +fileFormatVersion: 2 +guid: dc6eaa1240b9a4cee96e2c3e68755296 +folderAsset: yes +DefaultImporter: + externalObjects: {} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/UAP/Examples/Voice Change Example/Scripts.meta b/Assets/UAP/Examples/Voice Change Example/Scripts.meta new file mode 100644 index 0000000..c56e3c8 --- /dev/null +++ b/Assets/UAP/Examples/Voice Change Example/Scripts.meta @@ -0,0 +1,8 @@ +fileFormatVersion: 2 +guid: adc0b25d6779e40078be07ded2aa17eb +folderAsset: yes +DefaultImporter: + externalObjects: {} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/UAP/Examples/Voice Change Example/Scripts/VoiceChangeController.cs b/Assets/UAP/Examples/Voice Change Example/Scripts/VoiceChangeController.cs new file mode 100644 index 0000000..6b35290 --- /dev/null +++ b/Assets/UAP/Examples/Voice Change Example/Scripts/VoiceChangeController.cs @@ -0,0 +1,121 @@ +using System.Collections; +using System.Collections.Generic; +using UnityEngine; +using UnityEngine.Localization; +using UnityEngine.Localization.Settings; +using TMPro; +using System; + +public class VoiceChangeController : MonoBehaviour +{ + /// + /// Enum with all available languages + /// + public enum languages { English, Spanish } + + [Tooltip("The voice to use for English")] + public string englishVoice = "Microsoft David Desktop"; + [Tooltip("The voice to use for Spanish")] + public string spanishVoice = "Microsoft Sabina Desktop"; + //SAPI voice to use for each language + private Dictionary voices = new Dictionary(); + //the currently active voice + private string activeVoice = ""; + [Tooltip("The TextMesh component where current voice will be displayed")] + public TextMeshProUGUI voiceDisplay; + + /* Called once each frame */ + private void Update() + { + //Escape key to toggle UAP on and off + if (Input.GetKeyDown(KeyCode.Escape))EnableUAP(); + + } + + private static VoiceChangeController _instance = null; + public static VoiceChangeController Instance + { + get + { + if (_instance == null) + { + _instance = FindObjectOfType(); + if (_instance == null) + { + GameObject go = new GameObject(typeof(VoiceChangeController).ToString()); + _instance = go.AddComponent(); + } + } + return _instance; + } + } + + /* when the scene first runs, make sure that there is only one */ + private void Awake() + { + if (Instance != this) + { + Destroy(this); + } + else + { + DontDestroyOnLoad(gameObject); + + //initialize localization + LocalizationSettings.InitializationOperation.WaitForCompletion(); + + UAP_AccessibilityManager.SetLanguage("English"); + //prepare the voices dictionary + voices[languages.English] = englishVoice; + voices[languages.Spanish] = spanishVoice; + } + } + + + #region Change Language + /// + /// Changes the language + /// + /// Which language to change to + public void ChangeLanguage(string newLanguage) + { + //switch the UAP language + UAP_AccessibilityManager.SetLanguage(newLanguage); + languages newLangEnum; + //convert the language string to the languages enum + bool validLang = Enum.TryParse(newLanguage, out newLangEnum); + //if the language string was valid + if (validLang) { + //change the voice + activeVoice = UAP_AccessibilityManager.SetVoice(voices[newLangEnum]); + //Say what language this is + UAP_AccessibilityManager.Say(newLanguage, true); + //display the current voice + voiceDisplay.text = activeVoice; + } + else { + //create a list of languages + string[] langArr= Enum.GetNames(typeof(languages)); + string langList = langArr[0]; + for (int i = 1; i < langArr.Length; i++) langList += $" {langArr[i]}"; + + throw new Exception($"Language string {newLanguage} is not a valid language. Valid languages are {langList}"); + } + + } + #endregion + + + + /// + /// Enables UAP + /// + public void EnableUAP() + { + //if accessibility not already enabled enable it + if (!UAP_AccessibilityManager.IsEnabled()) UAP_AccessibilityManager.EnableAccessibility(true); + //otherwise disable it + else UAP_AccessibilityManager.EnableAccessibility(false); + + } +} diff --git a/Assets/UAP/Examples/Voice Change Example/Scripts/VoiceChangeController.cs.meta b/Assets/UAP/Examples/Voice Change Example/Scripts/VoiceChangeController.cs.meta new file mode 100644 index 0000000..0e070eb --- /dev/null +++ b/Assets/UAP/Examples/Voice Change Example/Scripts/VoiceChangeController.cs.meta @@ -0,0 +1,11 @@ +fileFormatVersion: 2 +guid: bda77c0651b0a4ace9a715960f67298a +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/UAP/Examples/Voice Change Example/Voice Change Demo.unity b/Assets/UAP/Examples/Voice Change Example/Voice Change Demo.unity new file mode 100644 index 0000000..617a385 --- /dev/null +++ b/Assets/UAP/Examples/Voice Change Example/Voice Change Demo.unity @@ -0,0 +1,1683 @@ +%YAML 1.1 +%TAG !u! tag:unity3d.com,2011: +--- !u!29 &1 +OcclusionCullingSettings: + m_ObjectHideFlags: 0 + serializedVersion: 2 + m_OcclusionBakeSettings: + smallestOccluder: 5 + smallestHole: 0.25 + backfaceThreshold: 100 + m_SceneGUID: 00000000000000000000000000000000 + m_OcclusionCullingData: {fileID: 0} +--- !u!104 &2 +RenderSettings: + m_ObjectHideFlags: 0 + serializedVersion: 9 + m_Fog: 0 + m_FogColor: {r: 0.5, g: 0.5, b: 0.5, a: 1} + m_FogMode: 3 + m_FogDensity: 0.01 + m_LinearFogStart: 0 + m_LinearFogEnd: 300 + m_AmbientSkyColor: {r: 0.212, g: 0.227, b: 0.259, a: 1} + m_AmbientEquatorColor: {r: 0.114, g: 0.125, b: 0.133, a: 1} + m_AmbientGroundColor: {r: 0.047, g: 0.043, b: 0.035, a: 1} + m_AmbientIntensity: 1 + m_AmbientMode: 3 + m_SubtractiveShadowColor: {r: 0.42, g: 0.478, b: 0.627, a: 1} + m_SkyboxMaterial: {fileID: 0} + m_HaloStrength: 0.5 + m_FlareStrength: 1 + m_FlareFadeSpeed: 3 + m_HaloTexture: {fileID: 0} + m_SpotCookie: {fileID: 10001, guid: 0000000000000000e000000000000000, type: 0} + m_DefaultReflectionMode: 0 + m_DefaultReflectionResolution: 128 + m_ReflectionBounces: 1 + m_ReflectionIntensity: 1 + m_CustomReflection: {fileID: 0} + m_Sun: {fileID: 0} + m_IndirectSpecularColor: {r: 0, g: 0, b: 0, a: 1} + m_UseRadianceAmbientProbe: 0 +--- !u!157 &3 +LightmapSettings: + m_ObjectHideFlags: 0 + serializedVersion: 12 + m_GIWorkflowMode: 1 + m_GISettings: + serializedVersion: 2 + m_BounceScale: 1 + m_IndirectOutputScale: 1 + m_AlbedoBoost: 1 + m_EnvironmentLightingMode: 0 + m_EnableBakedLightmaps: 0 + m_EnableRealtimeLightmaps: 0 + m_LightmapEditorSettings: + serializedVersion: 12 + m_Resolution: 2 + m_BakeResolution: 40 + m_AtlasSize: 1024 + m_AO: 0 + m_AOMaxDistance: 1 + m_CompAOExponent: 1 + m_CompAOExponentDirect: 0 + m_ExtractAmbientOcclusion: 0 + m_Padding: 2 + m_LightmapParameters: {fileID: 0} + m_LightmapsBakeMode: 1 + m_TextureCompression: 1 + m_FinalGather: 0 + m_FinalGatherFiltering: 1 + m_FinalGatherRayCount: 256 + m_ReflectionCompression: 2 + m_MixedBakeMode: 2 + m_BakeBackend: 1 + m_PVRSampling: 1 + m_PVRDirectSampleCount: 32 + m_PVRSampleCount: 512 + m_PVRBounces: 2 + m_PVREnvironmentSampleCount: 256 + m_PVREnvironmentReferencePointCount: 2048 + m_PVRFilteringMode: 1 + m_PVRDenoiserTypeDirect: 1 + m_PVRDenoiserTypeIndirect: 1 + m_PVRDenoiserTypeAO: 1 + m_PVRFilterTypeDirect: 0 + m_PVRFilterTypeIndirect: 0 + m_PVRFilterTypeAO: 0 + m_PVREnvironmentMIS: 1 + m_PVRCulling: 1 + m_PVRFilteringGaussRadiusDirect: 1 + m_PVRFilteringGaussRadiusIndirect: 5 + m_PVRFilteringGaussRadiusAO: 2 + m_PVRFilteringAtrousPositionSigmaDirect: 0.5 + m_PVRFilteringAtrousPositionSigmaIndirect: 2 + m_PVRFilteringAtrousPositionSigmaAO: 1 + m_ExportTrainingData: 0 + m_TrainingDataDestination: TrainingData + m_LightProbeSampleCountMultiplier: 4 + m_LightingDataAsset: {fileID: 0} + m_LightingSettings: {fileID: 0} +--- !u!196 &4 +NavMeshSettings: + serializedVersion: 2 + m_ObjectHideFlags: 0 + m_BuildSettings: + serializedVersion: 2 + agentTypeID: 0 + agentRadius: 0.5 + agentHeight: 2 + agentSlope: 45 + agentClimb: 0.4 + ledgeDropHeight: 0 + maxJumpAcrossDistance: 0 + minRegionArea: 2 + manualCellSize: 0 + cellSize: 0.16666667 + manualTileSize: 0 + tileSize: 256 + accuratePlacement: 0 + maxJobWorkers: 0 + preserveTilesOutsideBounds: 0 + debug: + m_Flags: 0 + m_NavMeshData: {fileID: 0} +--- !u!1 &488019971 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 488019972} + - component: {fileID: 488019974} + - component: {fileID: 488019973} + m_Layer: 5 + m_Name: Text (TMP) + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!224 &488019972 +RectTransform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 488019971} + m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} + m_LocalPosition: {x: 0, y: 0, z: 0} + m_LocalScale: {x: 1, y: 1, z: 1} + m_ConstrainProportionsScale: 0 + m_Children: [] + m_Father: {fileID: 1674689331} + m_RootOrder: 0 + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} + m_AnchorMin: {x: 0.057741456, y: 0.15428624} + m_AnchorMax: {x: 0.94225854, y: 0.84571373} + m_AnchoredPosition: {x: 0, y: 0} + m_SizeDelta: {x: 0, y: 0} + m_Pivot: {x: 0.5, y: 0.5} +--- !u!114 &488019973 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 488019971} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: f4688fdb7df04437aeb418b961361dc5, type: 3} + m_Name: + m_EditorClassIdentifier: + m_Material: {fileID: 0} + m_Color: {r: 1, g: 1, b: 1, a: 1} + m_RaycastTarget: 1 + m_RaycastPadding: {x: 0, y: 0, z: 0, w: 0} + m_Maskable: 1 + m_OnCullStateChanged: + m_PersistentCalls: + m_Calls: [] + m_text: Set English Voice + m_isRightToLeft: 0 + m_fontAsset: {fileID: 11400000, guid: 8f586378b4e144a9851e7b34d9b748ee, type: 2} + m_sharedMaterial: {fileID: 2180264, guid: 8f586378b4e144a9851e7b34d9b748ee, type: 2} + m_fontSharedMaterials: [] + m_fontMaterial: {fileID: 0} + m_fontMaterials: [] + m_fontColor32: + serializedVersion: 2 + rgba: 4281479730 + m_fontColor: {r: 0.19607843, g: 0.19607843, b: 0.19607843, a: 1} + m_enableVertexGradient: 0 + m_colorMode: 3 + m_fontColorGradient: + topLeft: {r: 1, g: 1, b: 1, a: 1} + topRight: {r: 1, g: 1, b: 1, a: 1} + bottomLeft: {r: 1, g: 1, b: 1, a: 1} + bottomRight: {r: 1, g: 1, b: 1, a: 1} + m_fontColorGradientPreset: {fileID: 0} + m_spriteAsset: {fileID: 0} + m_tintAllSprites: 0 + m_StyleSheet: {fileID: 0} + m_TextStyleHashCode: -1183493901 + m_overrideHtmlColors: 0 + m_faceColor: + serializedVersion: 2 + rgba: 4294967295 + m_fontSize: 17.6 + m_fontSizeBase: 24 + m_fontWeight: 400 + m_enableAutoSizing: 1 + m_fontSizeMin: 4 + m_fontSizeMax: 28 + m_fontStyle: 1 + m_HorizontalAlignment: 2 + m_VerticalAlignment: 512 + m_textAlignment: 65535 + m_characterSpacing: 0 + m_wordSpacing: 0 + m_lineSpacing: 0 + m_lineSpacingMax: 0 + m_paragraphSpacing: 0 + m_charWidthMaxAdj: 0 + m_enableWordWrapping: 1 + m_wordWrappingRatios: 0.4 + m_overflowMode: 0 + m_linkedTextComponent: {fileID: 0} + parentLinkedComponent: {fileID: 0} + m_enableKerning: 1 + m_enableExtraPadding: 0 + checkPaddingRequired: 0 + m_isRichText: 1 + m_parseCtrlCharacters: 1 + m_isOrthographic: 1 + m_isCullingEnabled: 0 + m_horizontalMapping: 0 + m_verticalMapping: 0 + m_uvLineOffset: 0 + m_geometrySortingOrder: 0 + m_IsTextObjectScaleStatic: 0 + m_VertexBufferAutoSizeReduction: 1 + m_useMaxVisibleDescender: 1 + m_pageToDisplay: 1 + m_margin: {x: 0, y: 0, z: 0, w: 0} + m_isUsingLegacyAnimationComponent: 0 + m_isVolumetricText: 0 + m_hasFontAssetChanged: 0 + m_baseMaterial: {fileID: 0} + m_maskOffset: {x: 0, y: 0, z: 0, w: 0} +--- !u!222 &488019974 +CanvasRenderer: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 488019971} + m_CullTransparentMesh: 1 +--- !u!1 &1039475145 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 1039475146} + - component: {fileID: 1039475149} + - component: {fileID: 1039475148} + - component: {fileID: 1039475147} + m_Layer: 5 + m_Name: Panel + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!224 &1039475146 +RectTransform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1039475145} + m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} + m_LocalPosition: {x: 0, y: 0, z: 0} + m_LocalScale: {x: 1, y: 1, z: 1} + m_ConstrainProportionsScale: 0 + m_Children: + - {fileID: 1845676055} + m_Father: {fileID: 1277800744} + m_RootOrder: 0 + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} + m_AnchorMin: {x: 0, y: 0} + m_AnchorMax: {x: 0, y: 0} + m_AnchoredPosition: {x: 0, y: 0} + m_SizeDelta: {x: 0, y: 0} + m_Pivot: {x: 0.5, y: 0.5} +--- !u!114 &1039475147 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1039475145} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: 86710e43de46f6f4bac7c8e50813a599, type: 3} + m_Name: + m_EditorClassIdentifier: + m_AspectMode: 3 + m_AspectRatio: 1.7773224 +--- !u!114 &1039475148 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1039475145} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: fe87c0e1cc204ed48ad3b37840f39efc, type: 3} + m_Name: + m_EditorClassIdentifier: + m_Material: {fileID: 0} + m_Color: {r: 0.06666667, g: 0.14117648, b: 0.29411766, a: 1} + m_RaycastTarget: 1 + m_RaycastPadding: {x: 0, y: 0, z: 0, w: 0} + m_Maskable: 1 + m_OnCullStateChanged: + m_PersistentCalls: + m_Calls: [] + m_Sprite: {fileID: 0} + m_Type: 1 + m_PreserveAspect: 0 + m_FillCenter: 1 + m_FillMethod: 4 + m_FillAmount: 1 + m_FillClockwise: 1 + m_FillOrigin: 0 + m_UseSpriteMesh: 0 + m_PixelsPerUnitMultiplier: 1 +--- !u!222 &1039475149 +CanvasRenderer: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1039475145} + m_CullTransparentMesh: 1 +--- !u!1 &1118581225 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 1118581226} + - component: {fileID: 1118581229} + - component: {fileID: 1118581228} + m_Layer: 5 + m_Name: Current Voice Label + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!224 &1118581226 +RectTransform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1118581225} + m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} + m_LocalPosition: {x: 0, y: 0, z: 0} + m_LocalScale: {x: 1, y: 1, z: 1} + m_ConstrainProportionsScale: 0 + m_Children: [] + m_Father: {fileID: 1845676055} + m_RootOrder: 1 + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} + m_AnchorMin: {x: 0.06392408, y: 0.6583543} + m_AnchorMax: {x: 0.9748031, y: 0.77325195} + m_AnchoredPosition: {x: 0, y: 0} + m_SizeDelta: {x: 0, y: 0.0000076293945} + m_Pivot: {x: 0.5, y: 0.5} +--- !u!114 &1118581228 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1118581225} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: f4688fdb7df04437aeb418b961361dc5, type: 3} + m_Name: + m_EditorClassIdentifier: + m_Material: {fileID: 0} + m_Color: {r: 1, g: 1, b: 1, a: 1} + m_RaycastTarget: 1 + m_RaycastPadding: {x: 0, y: 0, z: 0, w: 0} + m_Maskable: 1 + m_OnCullStateChanged: + m_PersistentCalls: + m_Calls: [] + m_text: Not set yet + m_isRightToLeft: 0 + m_fontAsset: {fileID: 11400000, guid: 8f586378b4e144a9851e7b34d9b748ee, type: 2} + m_sharedMaterial: {fileID: 2180264, guid: 8f586378b4e144a9851e7b34d9b748ee, type: 2} + m_fontSharedMaterials: [] + m_fontMaterial: {fileID: 0} + m_fontMaterials: [] + m_fontColor32: + serializedVersion: 2 + rgba: 4294967295 + m_fontColor: {r: 1, g: 1, b: 1, a: 1} + m_enableVertexGradient: 0 + m_colorMode: 3 + m_fontColorGradient: + topLeft: {r: 1, g: 1, b: 1, a: 1} + topRight: {r: 1, g: 1, b: 1, a: 1} + bottomLeft: {r: 1, g: 1, b: 1, a: 1} + bottomRight: {r: 1, g: 1, b: 1, a: 1} + m_fontColorGradientPreset: {fileID: 0} + m_spriteAsset: {fileID: 0} + m_tintAllSprites: 0 + m_StyleSheet: {fileID: 0} + m_TextStyleHashCode: -1183493901 + m_overrideHtmlColors: 0 + m_faceColor: + serializedVersion: 2 + rgba: 4294967295 + m_fontSize: 27.65 + m_fontSizeBase: 36 + m_fontWeight: 400 + m_enableAutoSizing: 1 + m_fontSizeMin: 4 + m_fontSizeMax: 32 + m_fontStyle: 1 + m_HorizontalAlignment: 1 + m_VerticalAlignment: 512 + m_textAlignment: 65535 + m_characterSpacing: 0 + m_wordSpacing: 0 + m_lineSpacing: 0 + m_lineSpacingMax: 0 + m_paragraphSpacing: 0 + m_charWidthMaxAdj: 0 + m_enableWordWrapping: 1 + m_wordWrappingRatios: 0.4 + m_overflowMode: 0 + m_linkedTextComponent: {fileID: 0} + parentLinkedComponent: {fileID: 0} + m_enableKerning: 1 + m_enableExtraPadding: 0 + checkPaddingRequired: 0 + m_isRichText: 1 + m_parseCtrlCharacters: 1 + m_isOrthographic: 1 + m_isCullingEnabled: 0 + m_horizontalMapping: 0 + m_verticalMapping: 0 + m_uvLineOffset: 0 + m_geometrySortingOrder: 0 + m_IsTextObjectScaleStatic: 0 + m_VertexBufferAutoSizeReduction: 1 + m_useMaxVisibleDescender: 1 + m_pageToDisplay: 1 + m_margin: {x: 0, y: 0, z: 0, w: 0} + m_isUsingLegacyAnimationComponent: 0 + m_isVolumetricText: 0 + m_hasFontAssetChanged: 0 + m_baseMaterial: {fileID: 0} + m_maskOffset: {x: 0, y: 0, z: 0, w: 0} +--- !u!222 &1118581229 +CanvasRenderer: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1118581225} + m_CullTransparentMesh: 1 +--- !u!1 &1132674862 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 1132674863} + - component: {fileID: 1132674867} + - component: {fileID: 1132674866} + - component: {fileID: 1132674865} + - component: {fileID: 1132674864} + m_Layer: 5 + m_Name: Spanish Button + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!224 &1132674863 +RectTransform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1132674862} + m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} + m_LocalPosition: {x: 0, y: 0, z: 0} + m_LocalScale: {x: 1, y: 1, z: 1} + m_ConstrainProportionsScale: 0 + m_Children: + - {fileID: 1723429722} + m_Father: {fileID: 1845676055} + m_RootOrder: 3 + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} + m_AnchorMin: {x: 0.063927755, y: 0.056377616} + m_AnchorMax: {x: 0.5744559, y: 0.18564543} + m_AnchoredPosition: {x: -0.0012817383, y: 60} + m_SizeDelta: {x: 0, y: 0} + m_Pivot: {x: 0.5, y: 0.5} +--- !u!114 &1132674864 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1132674862} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: 093d8d6245e39e64dbd48d45cc3c40c9, type: 3} + m_Name: + m_EditorClassIdentifier: + m_OnInteractionStart: + m_PersistentCalls: + m_Calls: [] + m_OnInteractionEnd: + m_PersistentCalls: + m_Calls: [] + m_OnInteractionAbort: + m_PersistentCalls: + m_Calls: [] + m_ForceStartHere: 0 + m_ManualPositionOrder: -1 + m_ManualPositionParent: {fileID: 0} + m_UseTargetForOutline: 0 + m_PositionOrder: 0 + m_SecondaryOrder: 0 + m_Pos: {x: 0, y: 0} + m_TextAsAudio: {fileID: 0} + m_Prefix: + m_PrefixIsLocalizationKey: 0 + m_PrefixIsPostFix: 0 + m_FilterText: 1 + m_Text: Set Spanish Voice + m_NameLabel: {fileID: 1723429721} + m_AdditionalNameLabels: [] + m_TestList: [] + m_IsLocalizationKey: 0 + m_TryToReadLabel: 1 + m_ReferenceElement: {fileID: 0} + m_AllowVoiceOver: 1 + m_ReadType: 1 + m_WasJustAdded: 1 + m_Type: 1 + m_CustomHint: 0 + m_HintAsAudio: {fileID: 0} + m_Hint: + m_HintIsLocalizationKey: 0 + m_IsInsideScrollView: 0 + m_IsInitialized: 1 + m_CallbackOnHighlight: + m_PersistentCalls: + m_Calls: [] +--- !u!114 &1132674865 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1132674862} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: 4e29b1a8efbd4b44bb3f3716e73f07ff, type: 3} + m_Name: + m_EditorClassIdentifier: + m_Navigation: + m_Mode: 3 + m_WrapAround: 0 + m_SelectOnUp: {fileID: 0} + m_SelectOnDown: {fileID: 0} + m_SelectOnLeft: {fileID: 0} + m_SelectOnRight: {fileID: 0} + m_Transition: 1 + m_Colors: + m_NormalColor: {r: 1, g: 1, b: 1, a: 1} + m_HighlightedColor: {r: 0.9607843, g: 0.9607843, b: 0.9607843, a: 1} + m_PressedColor: {r: 0.78431374, g: 0.78431374, b: 0.78431374, a: 1} + m_SelectedColor: {r: 0.9607843, g: 0.9607843, b: 0.9607843, a: 1} + m_DisabledColor: {r: 0.78431374, g: 0.78431374, b: 0.78431374, a: 0.5019608} + m_ColorMultiplier: 1 + m_FadeDuration: 0.1 + m_SpriteState: + m_HighlightedSprite: {fileID: 0} + m_PressedSprite: {fileID: 0} + m_SelectedSprite: {fileID: 0} + m_DisabledSprite: {fileID: 0} + m_AnimationTriggers: + m_NormalTrigger: Normal + m_HighlightedTrigger: Highlighted + m_PressedTrigger: Pressed + m_SelectedTrigger: Selected + m_DisabledTrigger: Disabled + m_Interactable: 1 + m_TargetGraphic: {fileID: 1132674866} + m_OnClick: + m_PersistentCalls: + m_Calls: + - m_Target: {fileID: 1850112069} + m_TargetAssemblyTypeName: VoiceChangeController, Assembly-CSharp + m_MethodName: ChangeLanguage + m_Mode: 5 + m_Arguments: + m_ObjectArgument: {fileID: 0} + m_ObjectArgumentAssemblyTypeName: UnityEngine.Object, UnityEngine + m_IntArgument: 0 + m_FloatArgument: 0 + m_StringArgument: Spanish + m_BoolArgument: 0 + m_CallState: 2 +--- !u!114 &1132674866 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1132674862} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: fe87c0e1cc204ed48ad3b37840f39efc, type: 3} + m_Name: + m_EditorClassIdentifier: + m_Material: {fileID: 0} + m_Color: {r: 1, g: 1, b: 1, a: 1} + m_RaycastTarget: 1 + m_RaycastPadding: {x: 0, y: 0, z: 0, w: 0} + m_Maskable: 1 + m_OnCullStateChanged: + m_PersistentCalls: + m_Calls: [] + m_Sprite: {fileID: 10905, guid: 0000000000000000f000000000000000, type: 0} + m_Type: 1 + m_PreserveAspect: 0 + m_FillCenter: 1 + m_FillMethod: 4 + m_FillAmount: 1 + m_FillClockwise: 1 + m_FillOrigin: 0 + m_UseSpriteMesh: 0 + m_PixelsPerUnitMultiplier: 1 +--- !u!222 &1132674867 +CanvasRenderer: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1132674862} + m_CullTransparentMesh: 1 +--- !u!1 &1168379404 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 1168379407} + - component: {fileID: 1168379406} + - component: {fileID: 1168379405} + m_Layer: 0 + m_Name: EventSystem + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!114 &1168379405 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1168379404} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: 4f231c4fb786f3946a6b90b886c48677, type: 3} + m_Name: + m_EditorClassIdentifier: + m_SendPointerHoverToParent: 1 + m_HorizontalAxis: Horizontal + m_VerticalAxis: Vertical + m_SubmitButton: Submit + m_CancelButton: Cancel + m_InputActionsPerSecond: 10 + m_RepeatDelay: 0.5 + m_ForceModuleActive: 0 +--- !u!114 &1168379406 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1168379404} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: 76c392e42b5098c458856cdf6ecaaaa1, type: 3} + m_Name: + m_EditorClassIdentifier: + m_FirstSelected: {fileID: 0} + m_sendNavigationEvents: 1 + m_DragThreshold: 10 +--- !u!4 &1168379407 +Transform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1168379404} + m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} + m_LocalPosition: {x: 0, y: 0, z: 0} + m_LocalScale: {x: 1, y: 1, z: 1} + m_ConstrainProportionsScale: 0 + m_Children: [] + m_Father: {fileID: 0} + m_RootOrder: 3 + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} +--- !u!1 &1182583406 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 1182583407} + - component: {fileID: 1182583410} + - component: {fileID: 1182583409} + - component: {fileID: 1182583408} + m_Layer: 5 + m_Name: Header Label + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!224 &1182583407 +RectTransform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1182583406} + m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} + m_LocalPosition: {x: 0, y: 0, z: 0} + m_LocalScale: {x: 1, y: 1, z: 1} + m_ConstrainProportionsScale: 0 + m_Children: [] + m_Father: {fileID: 1845676055} + m_RootOrder: 0 + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} + m_AnchorMin: {x: 0.06532015, y: 0.8128223} + m_AnchorMax: {x: 0.9761991, y: 0.95182717} + m_AnchoredPosition: {x: 0, y: 0} + m_SizeDelta: {x: 0, y: -0.0000019073486} + m_Pivot: {x: 0.5, y: 0.5} +--- !u!114 &1182583408 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1182583406} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: 3d52c398d6e508e428bb1c7d8f0083e5, type: 3} + m_Name: + m_EditorClassIdentifier: + m_OnInteractionStart: + m_PersistentCalls: + m_Calls: [] + m_OnInteractionEnd: + m_PersistentCalls: + m_Calls: [] + m_OnInteractionAbort: + m_PersistentCalls: + m_Calls: [] + m_ForceStartHere: 0 + m_ManualPositionOrder: -1 + m_ManualPositionParent: {fileID: 0} + m_UseTargetForOutline: 0 + m_PositionOrder: 0 + m_SecondaryOrder: 0 + m_Pos: {x: 0, y: 0} + m_TextAsAudio: {fileID: 0} + m_Prefix: + m_PrefixIsLocalizationKey: 0 + m_PrefixIsPostFix: 0 + m_FilterText: 1 + m_Text: Settings Menu + m_NameLabel: {fileID: 1182583406} + m_AdditionalNameLabels: [] + m_TestList: [] + m_IsLocalizationKey: 0 + m_TryToReadLabel: 1 + m_ReferenceElement: {fileID: 0} + m_AllowVoiceOver: 1 + m_ReadType: 1 + m_WasJustAdded: 1 + m_Type: 2 + m_CustomHint: 0 + m_HintAsAudio: {fileID: 0} + m_Hint: + m_HintIsLocalizationKey: 0 + m_IsInsideScrollView: 0 + m_IsInitialized: 1 + m_CallbackOnHighlight: + m_PersistentCalls: + m_Calls: [] +--- !u!114 &1182583409 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1182583406} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: f4688fdb7df04437aeb418b961361dc5, type: 3} + m_Name: + m_EditorClassIdentifier: + m_Material: {fileID: 0} + m_Color: {r: 1, g: 1, b: 1, a: 1} + m_RaycastTarget: 1 + m_RaycastPadding: {x: 0, y: 0, z: 0, w: 0} + m_Maskable: 1 + m_OnCullStateChanged: + m_PersistentCalls: + m_Calls: [] + m_text: Current Voice + m_isRightToLeft: 0 + m_fontAsset: {fileID: 11400000, guid: 8f586378b4e144a9851e7b34d9b748ee, type: 2} + m_sharedMaterial: {fileID: 2180264, guid: 8f586378b4e144a9851e7b34d9b748ee, type: 2} + m_fontSharedMaterials: [] + m_fontMaterial: {fileID: 0} + m_fontMaterials: [] + m_fontColor32: + serializedVersion: 2 + rgba: 4294967295 + m_fontColor: {r: 1, g: 1, b: 1, a: 1} + m_enableVertexGradient: 0 + m_colorMode: 3 + m_fontColorGradient: + topLeft: {r: 1, g: 1, b: 1, a: 1} + topRight: {r: 1, g: 1, b: 1, a: 1} + bottomLeft: {r: 1, g: 1, b: 1, a: 1} + bottomRight: {r: 1, g: 1, b: 1, a: 1} + m_fontColorGradientPreset: {fileID: 0} + m_spriteAsset: {fileID: 0} + m_tintAllSprites: 0 + m_StyleSheet: {fileID: 0} + m_TextStyleHashCode: -1183493901 + m_overrideHtmlColors: 0 + m_faceColor: + serializedVersion: 2 + rgba: 4294967295 + m_fontSize: 33.5 + m_fontSizeBase: 36 + m_fontWeight: 400 + m_enableAutoSizing: 1 + m_fontSizeMin: 4 + m_fontSizeMax: 48 + m_fontStyle: 1 + m_HorizontalAlignment: 1 + m_VerticalAlignment: 512 + m_textAlignment: 65535 + m_characterSpacing: 0 + m_wordSpacing: 0 + m_lineSpacing: 0 + m_lineSpacingMax: 0 + m_paragraphSpacing: 0 + m_charWidthMaxAdj: 0 + m_enableWordWrapping: 1 + m_wordWrappingRatios: 0.4 + m_overflowMode: 0 + m_linkedTextComponent: {fileID: 0} + parentLinkedComponent: {fileID: 0} + m_enableKerning: 1 + m_enableExtraPadding: 0 + checkPaddingRequired: 0 + m_isRichText: 1 + m_parseCtrlCharacters: 1 + m_isOrthographic: 1 + m_isCullingEnabled: 0 + m_horizontalMapping: 0 + m_verticalMapping: 0 + m_uvLineOffset: 0 + m_geometrySortingOrder: 0 + m_IsTextObjectScaleStatic: 0 + m_VertexBufferAutoSizeReduction: 1 + m_useMaxVisibleDescender: 1 + m_pageToDisplay: 1 + m_margin: {x: 0, y: 0, z: 0, w: 0} + m_isUsingLegacyAnimationComponent: 0 + m_isVolumetricText: 0 + m_hasFontAssetChanged: 0 + m_baseMaterial: {fileID: 0} + m_maskOffset: {x: 0, y: 0, z: 0, w: 0} +--- !u!222 &1182583410 +CanvasRenderer: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1182583406} + m_CullTransparentMesh: 1 +--- !u!1 &1277800739 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 1277800744} + - component: {fileID: 1277800743} + - component: {fileID: 1277800742} + - component: {fileID: 1277800741} + - component: {fileID: 1277800740} + m_Layer: 5 + m_Name: Canvas + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!114 &1277800740 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1277800739} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: 61b8ed8a1982c3745b6fb7dd1a6cce2d, type: 3} + m_Name: + m_EditorClassIdentifier: + m_PopUp: 0 + m_AllowExternalJoining: 0 + m_AutoRead: 0 + m_Priority: 0 + m_ContainerName: + m_IsLocalizationKey: 0 + m_2DNavigation: 0 + m_ConstrainToContainerUp: 0 + m_ConstrainToContainerDown: 0 + m_ConstrainToContainerLeft: 0 + m_ConstrainToContainerRight: 0 + m_AllowTouchExplore: 1 + m_DoubleCheckUIElementsPositions: 1 +--- !u!114 &1277800741 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1277800739} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: dc42784cf147c0c48a680349fa168899, type: 3} + m_Name: + m_EditorClassIdentifier: + m_IgnoreReversedGraphics: 1 + m_BlockingObjects: 0 + m_BlockingMask: + serializedVersion: 2 + m_Bits: 4294967295 +--- !u!114 &1277800742 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1277800739} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: 0cd44c1031e13a943bb63640046fad76, type: 3} + m_Name: + m_EditorClassIdentifier: + m_UiScaleMode: 1 + m_ReferencePixelsPerUnit: 100 + m_ScaleFactor: 1 + m_ReferenceResolution: {x: 1280, y: 1280} + m_ScreenMatchMode: 0 + m_MatchWidthOrHeight: 0.5 + m_PhysicalUnit: 3 + m_FallbackScreenDPI: 96 + m_DefaultSpriteDPI: 96 + m_DynamicPixelsPerUnit: 1 + m_PresetInfoIsWorld: 0 +--- !u!223 &1277800743 +Canvas: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1277800739} + m_Enabled: 1 + serializedVersion: 3 + m_RenderMode: 0 + m_Camera: {fileID: 0} + m_PlaneDistance: 100 + m_PixelPerfect: 0 + m_ReceivesEvents: 1 + m_OverrideSorting: 0 + m_OverridePixelPerfect: 0 + m_SortingBucketNormalizedSize: 0 + m_AdditionalShaderChannelsFlag: 25 + m_SortingLayerID: 0 + m_SortingOrder: 0 + m_TargetDisplay: 0 +--- !u!224 &1277800744 +RectTransform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1277800739} + m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} + m_LocalPosition: {x: 0, y: 0, z: 0} + m_LocalScale: {x: 0, y: 0, z: 0} + m_ConstrainProportionsScale: 0 + m_Children: + - {fileID: 1039475146} + m_Father: {fileID: 0} + m_RootOrder: 2 + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} + m_AnchorMin: {x: 0, y: 0} + m_AnchorMax: {x: 0, y: 0} + m_AnchoredPosition: {x: 0, y: 0} + m_SizeDelta: {x: 0, y: 0} + m_Pivot: {x: 0, y: 0} +--- !u!1 &1649692708 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 1649692711} + - component: {fileID: 1649692710} + - component: {fileID: 1649692709} + m_Layer: 0 + m_Name: Main Camera + m_TagString: MainCamera + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!81 &1649692709 +AudioListener: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1649692708} + m_Enabled: 1 +--- !u!20 &1649692710 +Camera: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1649692708} + m_Enabled: 1 + serializedVersion: 2 + m_ClearFlags: 1 + m_BackGroundColor: {r: 0.19215687, g: 0.3019608, b: 0.4745098, a: 0} + m_projectionMatrixMode: 1 + m_GateFitMode: 2 + m_FOVAxisMode: 0 + m_SensorSize: {x: 36, y: 24} + m_LensShift: {x: 0, y: 0} + m_FocalLength: 50 + m_NormalizedViewPortRect: + serializedVersion: 2 + x: 0 + y: 0 + width: 1 + height: 1 + near clip plane: 0.3 + far clip plane: 1000 + field of view: 60 + orthographic: 1 + orthographic size: 5 + m_Depth: -1 + m_CullingMask: + serializedVersion: 2 + m_Bits: 4294967295 + m_RenderingPath: -1 + m_TargetTexture: {fileID: 0} + m_TargetDisplay: 0 + m_TargetEye: 3 + m_HDR: 1 + m_AllowMSAA: 1 + m_AllowDynamicResolution: 0 + m_ForceIntoRT: 0 + m_OcclusionCulling: 1 + m_StereoConvergence: 10 + m_StereoSeparation: 0.022 +--- !u!4 &1649692711 +Transform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1649692708} + m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} + m_LocalPosition: {x: 0, y: 0, z: -10} + m_LocalScale: {x: 1, y: 1, z: 1} + m_ConstrainProportionsScale: 0 + m_Children: [] + m_Father: {fileID: 0} + m_RootOrder: 0 + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} +--- !u!1 &1674689330 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 1674689331} + - component: {fileID: 1674689335} + - component: {fileID: 1674689334} + - component: {fileID: 1674689333} + - component: {fileID: 1674689332} + m_Layer: 5 + m_Name: English Button + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!224 &1674689331 +RectTransform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1674689330} + m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} + m_LocalPosition: {x: 0, y: 0, z: 0} + m_LocalScale: {x: 1, y: 1, z: 1} + m_ConstrainProportionsScale: 0 + m_Children: + - {fileID: 488019972} + m_Father: {fileID: 1845676055} + m_RootOrder: 2 + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} + m_AnchorMin: {x: 0.063927755, y: 0.056377616} + m_AnchorMax: {x: 0.5744559, y: 0.18564543} + m_AnchoredPosition: {x: -0.0012817383, y: 109.8} + m_SizeDelta: {x: 0, y: 0} + m_Pivot: {x: 0.5, y: 0.5} +--- !u!114 &1674689332 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1674689330} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: 093d8d6245e39e64dbd48d45cc3c40c9, type: 3} + m_Name: + m_EditorClassIdentifier: + m_OnInteractionStart: + m_PersistentCalls: + m_Calls: [] + m_OnInteractionEnd: + m_PersistentCalls: + m_Calls: [] + m_OnInteractionAbort: + m_PersistentCalls: + m_Calls: [] + m_ForceStartHere: 0 + m_ManualPositionOrder: -1 + m_ManualPositionParent: {fileID: 0} + m_UseTargetForOutline: 0 + m_PositionOrder: 0 + m_SecondaryOrder: 0 + m_Pos: {x: 0, y: 0} + m_TextAsAudio: {fileID: 0} + m_Prefix: + m_PrefixIsLocalizationKey: 0 + m_PrefixIsPostFix: 0 + m_FilterText: 1 + m_Text: Set English Voice + m_NameLabel: {fileID: 488019971} + m_AdditionalNameLabels: [] + m_TestList: [] + m_IsLocalizationKey: 0 + m_TryToReadLabel: 1 + m_ReferenceElement: {fileID: 0} + m_AllowVoiceOver: 1 + m_ReadType: 1 + m_WasJustAdded: 1 + m_Type: 1 + m_CustomHint: 0 + m_HintAsAudio: {fileID: 0} + m_Hint: + m_HintIsLocalizationKey: 0 + m_IsInsideScrollView: 0 + m_IsInitialized: 1 + m_CallbackOnHighlight: + m_PersistentCalls: + m_Calls: [] +--- !u!114 &1674689333 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1674689330} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: 4e29b1a8efbd4b44bb3f3716e73f07ff, type: 3} + m_Name: + m_EditorClassIdentifier: + m_Navigation: + m_Mode: 3 + m_WrapAround: 0 + m_SelectOnUp: {fileID: 0} + m_SelectOnDown: {fileID: 0} + m_SelectOnLeft: {fileID: 0} + m_SelectOnRight: {fileID: 0} + m_Transition: 1 + m_Colors: + m_NormalColor: {r: 1, g: 1, b: 1, a: 1} + m_HighlightedColor: {r: 0.9607843, g: 0.9607843, b: 0.9607843, a: 1} + m_PressedColor: {r: 0.78431374, g: 0.78431374, b: 0.78431374, a: 1} + m_SelectedColor: {r: 0.9607843, g: 0.9607843, b: 0.9607843, a: 1} + m_DisabledColor: {r: 0.78431374, g: 0.78431374, b: 0.78431374, a: 0.5019608} + m_ColorMultiplier: 1 + m_FadeDuration: 0.1 + m_SpriteState: + m_HighlightedSprite: {fileID: 0} + m_PressedSprite: {fileID: 0} + m_SelectedSprite: {fileID: 0} + m_DisabledSprite: {fileID: 0} + m_AnimationTriggers: + m_NormalTrigger: Normal + m_HighlightedTrigger: Highlighted + m_PressedTrigger: Pressed + m_SelectedTrigger: Selected + m_DisabledTrigger: Disabled + m_Interactable: 1 + m_TargetGraphic: {fileID: 1674689334} + m_OnClick: + m_PersistentCalls: + m_Calls: + - m_Target: {fileID: 1850112069} + m_TargetAssemblyTypeName: VoiceChangeController, Assembly-CSharp + m_MethodName: ChangeLanguage + m_Mode: 5 + m_Arguments: + m_ObjectArgument: {fileID: 0} + m_ObjectArgumentAssemblyTypeName: UnityEngine.Object, UnityEngine + m_IntArgument: 0 + m_FloatArgument: 0 + m_StringArgument: English + m_BoolArgument: 0 + m_CallState: 2 +--- !u!114 &1674689334 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1674689330} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: fe87c0e1cc204ed48ad3b37840f39efc, type: 3} + m_Name: + m_EditorClassIdentifier: + m_Material: {fileID: 0} + m_Color: {r: 1, g: 1, b: 1, a: 1} + m_RaycastTarget: 1 + m_RaycastPadding: {x: 0, y: 0, z: 0, w: 0} + m_Maskable: 1 + m_OnCullStateChanged: + m_PersistentCalls: + m_Calls: [] + m_Sprite: {fileID: 10905, guid: 0000000000000000f000000000000000, type: 0} + m_Type: 1 + m_PreserveAspect: 0 + m_FillCenter: 1 + m_FillMethod: 4 + m_FillAmount: 1 + m_FillClockwise: 1 + m_FillOrigin: 0 + m_UseSpriteMesh: 0 + m_PixelsPerUnitMultiplier: 1 +--- !u!222 &1674689335 +CanvasRenderer: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1674689330} + m_CullTransparentMesh: 1 +--- !u!1 &1723429721 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 1723429722} + - component: {fileID: 1723429724} + - component: {fileID: 1723429723} + m_Layer: 5 + m_Name: Text (TMP) + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!224 &1723429722 +RectTransform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1723429721} + m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} + m_LocalPosition: {x: 0, y: 0, z: 0} + m_LocalScale: {x: 1, y: 1, z: 1} + m_ConstrainProportionsScale: 0 + m_Children: [] + m_Father: {fileID: 1132674863} + m_RootOrder: 0 + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} + m_AnchorMin: {x: 0.057741456, y: 0.15428624} + m_AnchorMax: {x: 0.94225854, y: 0.84571373} + m_AnchoredPosition: {x: 0, y: 0} + m_SizeDelta: {x: 0, y: 0} + m_Pivot: {x: 0.5, y: 0.5} +--- !u!114 &1723429723 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1723429721} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: f4688fdb7df04437aeb418b961361dc5, type: 3} + m_Name: + m_EditorClassIdentifier: + m_Material: {fileID: 0} + m_Color: {r: 1, g: 1, b: 1, a: 1} + m_RaycastTarget: 1 + m_RaycastPadding: {x: 0, y: 0, z: 0, w: 0} + m_Maskable: 1 + m_OnCullStateChanged: + m_PersistentCalls: + m_Calls: [] + m_text: Set Spanish Voice + m_isRightToLeft: 0 + m_fontAsset: {fileID: 11400000, guid: 8f586378b4e144a9851e7b34d9b748ee, type: 2} + m_sharedMaterial: {fileID: 2180264, guid: 8f586378b4e144a9851e7b34d9b748ee, type: 2} + m_fontSharedMaterials: [] + m_fontMaterial: {fileID: 0} + m_fontMaterials: [] + m_fontColor32: + serializedVersion: 2 + rgba: 4281479730 + m_fontColor: {r: 0.19607843, g: 0.19607843, b: 0.19607843, a: 1} + m_enableVertexGradient: 0 + m_colorMode: 3 + m_fontColorGradient: + topLeft: {r: 1, g: 1, b: 1, a: 1} + topRight: {r: 1, g: 1, b: 1, a: 1} + bottomLeft: {r: 1, g: 1, b: 1, a: 1} + bottomRight: {r: 1, g: 1, b: 1, a: 1} + m_fontColorGradientPreset: {fileID: 0} + m_spriteAsset: {fileID: 0} + m_tintAllSprites: 0 + m_StyleSheet: {fileID: 0} + m_TextStyleHashCode: -1183493901 + m_overrideHtmlColors: 0 + m_faceColor: + serializedVersion: 2 + rgba: 4294967295 + m_fontSize: 16.95 + m_fontSizeBase: 24 + m_fontWeight: 400 + m_enableAutoSizing: 1 + m_fontSizeMin: 4 + m_fontSizeMax: 28 + m_fontStyle: 1 + m_HorizontalAlignment: 2 + m_VerticalAlignment: 512 + m_textAlignment: 65535 + m_characterSpacing: 0 + m_wordSpacing: 0 + m_lineSpacing: 0 + m_lineSpacingMax: 0 + m_paragraphSpacing: 0 + m_charWidthMaxAdj: 0 + m_enableWordWrapping: 1 + m_wordWrappingRatios: 0.4 + m_overflowMode: 0 + m_linkedTextComponent: {fileID: 0} + parentLinkedComponent: {fileID: 0} + m_enableKerning: 1 + m_enableExtraPadding: 0 + checkPaddingRequired: 0 + m_isRichText: 1 + m_parseCtrlCharacters: 1 + m_isOrthographic: 1 + m_isCullingEnabled: 0 + m_horizontalMapping: 0 + m_verticalMapping: 0 + m_uvLineOffset: 0 + m_geometrySortingOrder: 0 + m_IsTextObjectScaleStatic: 0 + m_VertexBufferAutoSizeReduction: 1 + m_useMaxVisibleDescender: 1 + m_pageToDisplay: 1 + m_margin: {x: 0, y: 0, z: 0, w: 0} + m_isUsingLegacyAnimationComponent: 0 + m_isVolumetricText: 0 + m_hasFontAssetChanged: 0 + m_baseMaterial: {fileID: 0} + m_maskOffset: {x: 0, y: 0, z: 0, w: 0} +--- !u!222 &1723429724 +CanvasRenderer: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1723429721} + m_CullTransparentMesh: 1 +--- !u!1 &1845676054 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 1845676055} + - component: {fileID: 1845676057} + - component: {fileID: 1845676056} + m_Layer: 5 + m_Name: DialogBox + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!224 &1845676055 +RectTransform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1845676054} + m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} + m_LocalPosition: {x: 0, y: 0, z: 0} + m_LocalScale: {x: 1, y: 1, z: 1} + m_ConstrainProportionsScale: 0 + m_Children: + - {fileID: 1182583407} + - {fileID: 1118581226} + - {fileID: 1674689331} + - {fileID: 1132674863} + m_Father: {fileID: 1039475146} + m_RootOrder: 0 + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} + m_AnchorMin: {x: 0.31887183, y: 0.2507667} + m_AnchorMax: {x: 0.6811281, y: 0.7492333} + m_AnchoredPosition: {x: 0, y: 0} + m_SizeDelta: {x: 0, y: 0} + m_Pivot: {x: 0.5, y: 0.5} +--- !u!114 &1845676056 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1845676054} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: fe87c0e1cc204ed48ad3b37840f39efc, type: 3} + m_Name: + m_EditorClassIdentifier: + m_Material: {fileID: 0} + m_Color: {r: 0.121568635, g: 0.3372549, b: 0.70980394, a: 1} + m_RaycastTarget: 1 + m_RaycastPadding: {x: 0, y: 0, z: 0, w: 0} + m_Maskable: 1 + m_OnCullStateChanged: + m_PersistentCalls: + m_Calls: [] + m_Sprite: {fileID: 10907, guid: 0000000000000000f000000000000000, type: 0} + m_Type: 1 + m_PreserveAspect: 0 + m_FillCenter: 1 + m_FillMethod: 4 + m_FillAmount: 1 + m_FillClockwise: 1 + m_FillOrigin: 0 + m_UseSpriteMesh: 0 + m_PixelsPerUnitMultiplier: 1 +--- !u!222 &1845676057 +CanvasRenderer: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1845676054} + m_CullTransparentMesh: 1 +--- !u!1 &1850112066 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 1850112068} + - component: {fileID: 1850112067} + - component: {fileID: 1850112069} + m_Layer: 0 + m_Name: VoiceChangeController + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!114 &1850112067 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1850112066} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: a8c40cfbb9f5f482a9e9ef40279ce8a0, type: 3} + m_Name: + m_EditorClassIdentifier: +--- !u!4 &1850112068 +Transform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1850112066} + m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} + m_LocalPosition: {x: -5.7029533, y: 0.33969283, z: -20.625456} + m_LocalScale: {x: 1, y: 1, z: 1} + m_ConstrainProportionsScale: 0 + m_Children: [] + m_Father: {fileID: 0} + m_RootOrder: 4 + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} +--- !u!114 &1850112069 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1850112066} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: bda77c0651b0a4ace9a715960f67298a, type: 3} + m_Name: + m_EditorClassIdentifier: + englishVoice: Microsoft David Desktop + spanishVoice: Microsoft Zira Desktop + voiceDisplay: {fileID: 1118581228} +--- !u!1001 &1961772457 +PrefabInstance: + m_ObjectHideFlags: 0 + serializedVersion: 2 + m_Modification: + m_TransformParent: {fileID: 0} + m_Modifications: + - target: {fileID: 123566, guid: 89f4a0ae7ea3fa84ea56c91291d7bd87, type: 3} + propertyPath: m_Name + value: Accessibility Manager + objectReference: {fileID: 0} + - target: {fileID: 11475380, guid: 89f4a0ae7ea3fa84ea56c91291d7bd87, type: 3} + propertyPath: m_DefaultState + value: 1 + objectReference: {fileID: 0} + - target: {fileID: 11475380, guid: 89f4a0ae7ea3fa84ea56c91291d7bd87, type: 3} + propertyPath: m_EditorOverride + value: 1 + objectReference: {fileID: 0} + - target: {fileID: 11475380, guid: 89f4a0ae7ea3fa84ea56c91291d7bd87, type: 3} + propertyPath: m_EditorEnabledState + value: 1 + objectReference: {fileID: 0} + - target: {fileID: 22474968, guid: 89f4a0ae7ea3fa84ea56c91291d7bd87, type: 3} + propertyPath: m_AnchoredPosition.x + value: 0.14300537 + objectReference: {fileID: 0} + - target: {fileID: 22474968, guid: 89f4a0ae7ea3fa84ea56c91291d7bd87, type: 3} + propertyPath: m_AnchoredPosition.y + value: -1.5 + objectReference: {fileID: 0} + - target: {fileID: 4973883477652662, guid: 89f4a0ae7ea3fa84ea56c91291d7bd87, type: 3} + propertyPath: m_RootOrder + value: 1 + objectReference: {fileID: 0} + - target: {fileID: 4973883477652662, guid: 89f4a0ae7ea3fa84ea56c91291d7bd87, type: 3} + propertyPath: m_LocalPosition.x + value: -46.724373 + objectReference: {fileID: 0} + - target: {fileID: 4973883477652662, guid: 89f4a0ae7ea3fa84ea56c91291d7bd87, type: 3} + propertyPath: m_LocalPosition.y + value: -48.229156 + objectReference: {fileID: 0} + - target: {fileID: 4973883477652662, guid: 89f4a0ae7ea3fa84ea56c91291d7bd87, type: 3} + propertyPath: m_LocalPosition.z + value: 0 + objectReference: {fileID: 0} + - target: {fileID: 4973883477652662, guid: 89f4a0ae7ea3fa84ea56c91291d7bd87, type: 3} + propertyPath: m_LocalRotation.w + value: 1 + objectReference: {fileID: 0} + - target: {fileID: 4973883477652662, guid: 89f4a0ae7ea3fa84ea56c91291d7bd87, type: 3} + propertyPath: m_LocalRotation.x + value: 0 + objectReference: {fileID: 0} + - target: {fileID: 4973883477652662, guid: 89f4a0ae7ea3fa84ea56c91291d7bd87, type: 3} + propertyPath: m_LocalRotation.y + value: 0 + objectReference: {fileID: 0} + - target: {fileID: 4973883477652662, guid: 89f4a0ae7ea3fa84ea56c91291d7bd87, type: 3} + propertyPath: m_LocalRotation.z + value: 0 + objectReference: {fileID: 0} + - target: {fileID: 4973883477652662, guid: 89f4a0ae7ea3fa84ea56c91291d7bd87, type: 3} + propertyPath: m_LocalEulerAnglesHint.x + value: 0 + objectReference: {fileID: 0} + - target: {fileID: 4973883477652662, guid: 89f4a0ae7ea3fa84ea56c91291d7bd87, type: 3} + propertyPath: m_LocalEulerAnglesHint.y + value: 0 + objectReference: {fileID: 0} + - target: {fileID: 4973883477652662, guid: 89f4a0ae7ea3fa84ea56c91291d7bd87, type: 3} + propertyPath: m_LocalEulerAnglesHint.z + value: 0 + objectReference: {fileID: 0} + m_RemovedComponents: [] + m_SourcePrefab: {fileID: 100100000, guid: 89f4a0ae7ea3fa84ea56c91291d7bd87, type: 3} diff --git a/Assets/UAP/Examples/Voice Change Example/Voice Change Demo.unity.meta b/Assets/UAP/Examples/Voice Change Example/Voice Change Demo.unity.meta new file mode 100644 index 0000000..1c0a231 --- /dev/null +++ b/Assets/UAP/Examples/Voice Change Example/Voice Change Demo.unity.meta @@ -0,0 +1,7 @@ +fileFormatVersion: 2 +guid: 80870f56717814961a40ab714c3b5c33 +DefaultImporter: + externalObjects: {} + userData: + assetBundleName: + assetBundleVariant: