clean project
This commit is contained in:
8
Assets/Oculus/Voice/Demo/Scripts/BuiltinDemo.meta
Normal file
8
Assets/Oculus/Voice/Demo/Scripts/BuiltinDemo.meta
Normal file
@@ -0,0 +1,8 @@
|
||||
fileFormatVersion: 2
|
||||
guid: 820d90595e7544215bde6c6f43664cb1
|
||||
folderAsset: yes
|
||||
DefaultImporter:
|
||||
externalObjects: {}
|
||||
userData:
|
||||
assetBundleName:
|
||||
assetBundleVariant:
|
||||
244
Assets/Oculus/Voice/Demo/Scripts/BuiltinDemo/TimerController.cs
Normal file
244
Assets/Oculus/Voice/Demo/Scripts/BuiltinDemo/TimerController.cs
Normal file
@@ -0,0 +1,244 @@
|
||||
/**************************************************************************************************
|
||||
* Copyright : Copyright (c) Facebook Technologies, LLC and its affiliates. All rights reserved.
|
||||
*
|
||||
* Your use of this SDK or tool is subject to the Oculus SDK License Agreement, available at
|
||||
* https://developer.oculus.com/licenses/oculussdk/
|
||||
*
|
||||
* Unless required by applicable law or agreed to in writing, the Utilities SDK distributed
|
||||
* under the License is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF
|
||||
* ANY KIND, either express or implied. See the License for the specific language governing
|
||||
* permissions and limitations under the License.
|
||||
**************************************************************************************************/
|
||||
|
||||
using System;
|
||||
using UnityEngine;
|
||||
using UnityEngine.UI;
|
||||
|
||||
namespace Oculus.Voice.Demo.BuiltInDemo
|
||||
{
|
||||
/// <summary>
|
||||
/// Represents a countdown timer.
|
||||
/// </summary>
|
||||
public class TimerController : MonoBehaviour
|
||||
{
|
||||
private float _time = 0; // [sec] current time of the countdown timer.
|
||||
private bool _timerExist = false;
|
||||
private bool _timerRunning = false;
|
||||
|
||||
[Tooltip("The UI text element to show app messages.")]
|
||||
public Text logText;
|
||||
|
||||
[Tooltip("The timer ring sound.")] public AudioClip buzzSound;
|
||||
|
||||
// Update is called once per frame
|
||||
void Update()
|
||||
{
|
||||
if (_timerExist && _timerRunning)
|
||||
{
|
||||
_time -= Time.deltaTime;
|
||||
if (_time < 0)
|
||||
{
|
||||
// Raise a ring.
|
||||
OnElapsedTime();
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
private void Log(string msg)
|
||||
{
|
||||
Debug.Log(msg);
|
||||
logText.text = msg;
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Buzzes and resets the timer.
|
||||
/// </summary>
|
||||
private void OnElapsedTime()
|
||||
{
|
||||
_time = 0;
|
||||
_timerRunning = false;
|
||||
_timerExist = false;
|
||||
Log("Buzz!");
|
||||
AudioSource.PlayClipAtPoint(buzzSound, Vector3.zero);
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Deletes the timer. It corresponds to the wit intent "wit$delete_timer"
|
||||
/// </summary>
|
||||
public void DeleteTimer()
|
||||
{
|
||||
if (!_timerExist)
|
||||
{
|
||||
Log("Error: There is no timer to delete.");
|
||||
return;
|
||||
}
|
||||
|
||||
_timerExist = false;
|
||||
_time = 0;
|
||||
_timerRunning = false;
|
||||
Log("Timer deleted.");
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Creates a timer. It corresponds to the wit intent "wit$create_timer"
|
||||
/// </summary>
|
||||
/// <param name="entityValues">countdown in minutes.</param>
|
||||
public void CreateTimer(string[] entityValues)
|
||||
{
|
||||
if (_timerExist)
|
||||
{
|
||||
Log("A timer already exist.");
|
||||
return;
|
||||
}
|
||||
|
||||
if (ParseTime(entityValues, out _time))
|
||||
{
|
||||
_timerExist = true;
|
||||
_timerRunning = true;
|
||||
Log($"Countdown Timer is set for {entityValues[0]} {entityValues[1]}(s).");
|
||||
}
|
||||
else
|
||||
{
|
||||
Log("Error in CreateTimer(): Could not parse wit reply.");
|
||||
}
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Displays current timer value. It corresponds to "wit$get_timer".
|
||||
/// </summary>
|
||||
public void GetTimerIntent()
|
||||
{
|
||||
// Show the remaining time of the countdown timer.
|
||||
var msg = GetFormattedTimeFromSeconds();
|
||||
Log(msg);
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Pauses the timer. It corresponds to the wit intent "wit$pause_timer"
|
||||
/// </summary>
|
||||
public void PauseTimer()
|
||||
{
|
||||
_timerRunning = false;
|
||||
Log("Timer paused.");
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// It corresponds to the wit intent "wit$resume_timer"
|
||||
/// </summary>
|
||||
public void ResumeTimer()
|
||||
{
|
||||
_timerRunning = true;
|
||||
Log("Timer resumed.");
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Subtracts time from the timer. It corresponds to the wit intent "wit$subtract_time_timer".
|
||||
/// </summary>
|
||||
/// <param name="entityValues"></param>
|
||||
public void SubtractTimeTimer(string[] entityValues)
|
||||
{
|
||||
if (!_timerExist)
|
||||
{
|
||||
Log("Error: No Timer is created.");
|
||||
return;
|
||||
}
|
||||
|
||||
if (ParseTime(entityValues, out var time))
|
||||
{
|
||||
var msg = $"{entityValues[0]} {entityValues[1]}(s) were subtracted from the timer.";
|
||||
_time -= time;
|
||||
if (_time < 0)
|
||||
{
|
||||
_time = 0;
|
||||
Log(msg);
|
||||
return;
|
||||
}
|
||||
|
||||
Log(msg);
|
||||
}
|
||||
else
|
||||
{
|
||||
Log("Error in Subtract_time_timer(): Could not parse the wit reply.");
|
||||
}
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Adds time to the timer. It corresponds to the wit intent "wit$add_time_timer".
|
||||
/// </summary>
|
||||
/// <param name="entityValues"></param>
|
||||
public void AddTimeToTimer(string[] entityValues)
|
||||
{
|
||||
if (!_timerExist)
|
||||
{
|
||||
Log("Error: No Timer is created.");
|
||||
return;
|
||||
}
|
||||
|
||||
if (ParseTime(entityValues, out var time))
|
||||
{
|
||||
_time += time;
|
||||
var msg = $"{entityValues[0]} {entityValues[1]}(s) were added to the timer.";
|
||||
Log(msg);
|
||||
}
|
||||
else
|
||||
{
|
||||
Log("Error in AddTimeToTimer(): Could not parse with reply.");
|
||||
}
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Returns the remaining time (in sec) of the countdown timer.
|
||||
/// </summary>
|
||||
/// <returns></returns>
|
||||
public float GetRemainingTime()
|
||||
{
|
||||
return _time;
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Returns time in the format of min:sec.
|
||||
/// </summary>
|
||||
/// <returns></returns>
|
||||
public string GetFormattedTimeFromSeconds()
|
||||
{
|
||||
return TimeSpan.FromSeconds(_time).ToString();
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Parses entity values to get a resulting time value in seconds
|
||||
/// </summary>
|
||||
/// <param name="entityValues">The entity value results from a Response Handler</param>
|
||||
/// <param name="time">The parsed time</param>
|
||||
/// <returns>The parsed time in seconds or the current value of _time</returns>
|
||||
/// <exception cref="ArgumentException"></exception>
|
||||
private bool ParseTime(string[] entityValues, out float time)
|
||||
{
|
||||
time = _time;
|
||||
if (entityValues.Length > 0 && float.TryParse(entityValues[0], out time))
|
||||
{
|
||||
if (entityValues.Length < 2)
|
||||
{
|
||||
throw new ArgumentException("Entities being parsed must include time value and unit.");
|
||||
}
|
||||
|
||||
// If entity was not included in the result it will be empty, but the array will still be size 2
|
||||
if (!string.IsNullOrEmpty(entityValues[1]))
|
||||
{
|
||||
switch (entityValues[1])
|
||||
{
|
||||
case "minute":
|
||||
time *= 60;
|
||||
break;
|
||||
case "hour":
|
||||
time *= 60 * 60;
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
return true;
|
||||
}
|
||||
|
||||
return false;
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,11 @@
|
||||
fileFormatVersion: 2
|
||||
guid: eb4fe076c92383b438b557433015250e
|
||||
MonoImporter:
|
||||
externalObjects: {}
|
||||
serializedVersion: 2
|
||||
defaultReferences: []
|
||||
executionOrder: 0
|
||||
icon: {instanceID: 0}
|
||||
userData:
|
||||
assetBundleName:
|
||||
assetBundleVariant:
|
||||
37
Assets/Oculus/Voice/Demo/Scripts/BuiltinDemo/TimerDisplay.cs
Normal file
37
Assets/Oculus/Voice/Demo/Scripts/BuiltinDemo/TimerDisplay.cs
Normal file
@@ -0,0 +1,37 @@
|
||||
/**************************************************************************************************
|
||||
* Copyright : Copyright (c) Facebook Technologies, LLC and its affiliates. All rights reserved.
|
||||
*
|
||||
* Your use of this SDK or tool is subject to the Oculus SDK License Agreement, available at
|
||||
* https://developer.oculus.com/licenses/oculussdk/
|
||||
*
|
||||
* Unless required by applicable law or agreed to in writing, the Utilities SDK distributed
|
||||
* under the License is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF
|
||||
* ANY KIND, either express or implied. See the License for the specific language governing
|
||||
* permissions and limitations under the License.
|
||||
**************************************************************************************************/
|
||||
|
||||
using UnityEngine;
|
||||
using UnityEngine.UI;
|
||||
|
||||
namespace Oculus.Voice.Demo.BuiltInDemo
|
||||
{
|
||||
public class TimerDisplay : MonoBehaviour
|
||||
{
|
||||
public TimerController timer;
|
||||
|
||||
private Text _uiText;
|
||||
|
||||
// Start is called before the first frame update
|
||||
void Start()
|
||||
{
|
||||
_uiText = GetComponent<Text>();
|
||||
}
|
||||
|
||||
// Update is called once per frame
|
||||
void Update()
|
||||
{
|
||||
// Note: This is not optimized and you should avoid updating time each frame.
|
||||
_uiText.text = timer.GetFormattedTimeFromSeconds();
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,11 @@
|
||||
fileFormatVersion: 2
|
||||
guid: dacc4d06eebcecb4a846759a3ac9f6e9
|
||||
MonoImporter:
|
||||
externalObjects: {}
|
||||
serializedVersion: 2
|
||||
defaultReferences: []
|
||||
executionOrder: 0
|
||||
icon: {instanceID: 0}
|
||||
userData:
|
||||
assetBundleName:
|
||||
assetBundleVariant:
|
||||
@@ -0,0 +1,49 @@
|
||||
/**************************************************************************************************
|
||||
* Copyright : Copyright (c) Facebook Technologies, LLC and its affiliates. All rights reserved.
|
||||
*
|
||||
* Your use of this SDK or tool is subject to the Oculus SDK License Agreement, available at
|
||||
* https://developer.oculus.com/licenses/oculussdk/
|
||||
*
|
||||
* Unless required by applicable law or agreed to in writing, the Utilities SDK distributed
|
||||
* under the License is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF
|
||||
* ANY KIND, either express or implied. See the License for the specific language governing
|
||||
* permissions and limitations under the License.
|
||||
**************************************************************************************************/
|
||||
|
||||
using UnityEngine;
|
||||
|
||||
namespace Oculus.Voice.Demo.BuiltInDemo
|
||||
{
|
||||
public class WitActivation : MonoBehaviour
|
||||
{
|
||||
[SerializeField] private AppVoiceExperience voiceExperience;
|
||||
|
||||
private void OnValidate()
|
||||
{
|
||||
if (!voiceExperience) voiceExperience = GetComponent<AppVoiceExperience>();
|
||||
}
|
||||
|
||||
private void Start()
|
||||
{
|
||||
voiceExperience = GetComponent<AppVoiceExperience>();
|
||||
}
|
||||
|
||||
private void Update()
|
||||
{
|
||||
// Make it possible to activate wit in the Unity Editor without the need to deploy to the headset.
|
||||
if (Input.GetKeyDown(KeyCode.Space))
|
||||
{
|
||||
print("*** Pressed Space bar ***");
|
||||
ActivateWit();
|
||||
}
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Activates Wit i.e. start listening to the user.
|
||||
/// </summary>
|
||||
public void ActivateWit()
|
||||
{
|
||||
voiceExperience.Activate();
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,11 @@
|
||||
fileFormatVersion: 2
|
||||
guid: 3699a21444dc7164289344371a620e0d
|
||||
MonoImporter:
|
||||
externalObjects: {}
|
||||
serializedVersion: 2
|
||||
defaultReferences: []
|
||||
executionOrder: 0
|
||||
icon: {instanceID: 0}
|
||||
userData:
|
||||
assetBundleName:
|
||||
assetBundleVariant:
|
||||
86
Assets/Oculus/Voice/Demo/Scripts/InteractionHandler.cs
Normal file
86
Assets/Oculus/Voice/Demo/Scripts/InteractionHandler.cs
Normal file
@@ -0,0 +1,86 @@
|
||||
/**************************************************************************************************
|
||||
* Copyright : Copyright (c) Facebook Technologies, LLC and its affiliates. All rights reserved.
|
||||
*
|
||||
* Your use of this SDK or tool is subject to the Oculus SDK License Agreement, available at
|
||||
* https://developer.oculus.com/licenses/oculussdk/
|
||||
*
|
||||
* Unless required by applicable law or agreed to in writing, the Utilities SDK distributed
|
||||
* under the License is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF
|
||||
* ANY KIND, either express or implied. See the License for the specific language governing
|
||||
* permissions and limitations under the License.
|
||||
**************************************************************************************************/
|
||||
|
||||
using Facebook.WitAi;
|
||||
using Facebook.WitAi.Lib;
|
||||
using UnityEngine;
|
||||
using UnityEngine.UI;
|
||||
|
||||
namespace Oculus.Voice.Demo.UIShapesDemo
|
||||
{
|
||||
public class InteractionHandler : MonoBehaviour
|
||||
{
|
||||
[Header("Default States"), Multiline]
|
||||
[SerializeField] private string freshStateText = "Try pressing the Activate button and saying \"Make the cube red\"";
|
||||
|
||||
[Header("UI")]
|
||||
[SerializeField] private Text textArea;
|
||||
[SerializeField] private bool showJson;
|
||||
|
||||
[Header("Voice")]
|
||||
[SerializeField] private AppVoiceExperience appVoiceExperience;
|
||||
|
||||
private string pendingText;
|
||||
|
||||
private void OnEnable()
|
||||
{
|
||||
appVoiceExperience.events.OnRequestCreated.AddListener(OnRequestStarted);
|
||||
}
|
||||
|
||||
private void OnDisable()
|
||||
{
|
||||
appVoiceExperience.events.OnRequestCreated.RemoveListener(OnRequestStarted);
|
||||
}
|
||||
|
||||
private void OnRequestStarted(WitRequest r)
|
||||
{
|
||||
// The raw response comes back on a different thread. We store the
|
||||
// message received for display on the next frame.
|
||||
if (showJson) r.onRawResponse = (response) => pendingText = response;
|
||||
}
|
||||
|
||||
private void Update()
|
||||
{
|
||||
if (null != pendingText)
|
||||
{
|
||||
textArea.text = pendingText;
|
||||
pendingText = null;
|
||||
}
|
||||
}
|
||||
|
||||
public void OnResponse(WitResponseNode response)
|
||||
{
|
||||
if (!string.IsNullOrEmpty(response["text"]))
|
||||
{
|
||||
textArea.text = "I heard: " + response["text"];
|
||||
}
|
||||
else
|
||||
{
|
||||
textArea.text = freshStateText;
|
||||
}
|
||||
}
|
||||
|
||||
public void OnError(string error, string message)
|
||||
{
|
||||
textArea.text = $"<color=\"red\">Error: {error}\n\n{message}</color>";
|
||||
}
|
||||
|
||||
public void ToggleActivation()
|
||||
{
|
||||
if (appVoiceExperience.Active) appVoiceExperience.Deactivate();
|
||||
else
|
||||
{
|
||||
appVoiceExperience.Activate();
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
11
Assets/Oculus/Voice/Demo/Scripts/InteractionHandler.cs.meta
Normal file
11
Assets/Oculus/Voice/Demo/Scripts/InteractionHandler.cs.meta
Normal file
@@ -0,0 +1,11 @@
|
||||
fileFormatVersion: 2
|
||||
guid: abf7a75ccc7b2ef43bde5b4c73de6e65
|
||||
MonoImporter:
|
||||
externalObjects: {}
|
||||
serializedVersion: 2
|
||||
defaultReferences: []
|
||||
executionOrder: 0
|
||||
icon: {instanceID: 0}
|
||||
userData:
|
||||
assetBundleName:
|
||||
assetBundleVariant:
|
||||
8
Assets/Oculus/Voice/Demo/Scripts/UIShapesDemo.meta
Normal file
8
Assets/Oculus/Voice/Demo/Scripts/UIShapesDemo.meta
Normal file
@@ -0,0 +1,8 @@
|
||||
fileFormatVersion: 2
|
||||
guid: 12df1a1211c7e46b3bed480404376c50
|
||||
folderAsset: yes
|
||||
DefaultImporter:
|
||||
externalObjects: {}
|
||||
userData:
|
||||
assetBundleName:
|
||||
assetBundleVariant:
|
||||
@@ -0,0 +1,86 @@
|
||||
/**************************************************************************************************
|
||||
* Copyright : Copyright (c) Facebook Technologies, LLC and its affiliates. All rights reserved.
|
||||
*
|
||||
* Your use of this SDK or tool is subject to the Oculus SDK License Agreement, available at
|
||||
* https://developer.oculus.com/licenses/oculussdk/
|
||||
*
|
||||
* Unless required by applicable law or agreed to in writing, the Utilities SDK distributed
|
||||
* under the License is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF
|
||||
* ANY KIND, either express or implied. See the License for the specific language governing
|
||||
* permissions and limitations under the License.
|
||||
**************************************************************************************************/
|
||||
|
||||
using System;
|
||||
using Facebook.WitAi;
|
||||
using Facebook.WitAi.Lib;
|
||||
using UnityEngine;
|
||||
|
||||
namespace Oculus.Voice.Demo.UIShapesDemo
|
||||
{
|
||||
public class ColorChanger : MonoBehaviour
|
||||
{
|
||||
/// <summary>
|
||||
/// Sets the color of the specified transform.
|
||||
/// </summary>
|
||||
/// <param name="trans"></param>
|
||||
/// <param name="color"></param>
|
||||
private void SetColor(Transform trans, Color color)
|
||||
{
|
||||
trans.GetComponent<Renderer>().material.color = color;
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Directly processes a command result getting the slots with WitResult utilities
|
||||
/// </summary>
|
||||
/// <param name="commandResult">Result data from Wit.ai activation to be processed</param>
|
||||
public void UpdateColor(WitResponseNode commandResult)
|
||||
{
|
||||
string colorName = commandResult.GetFirstEntityValue("color:color");
|
||||
string shape = commandResult.GetFirstEntityValue("shape:shape");
|
||||
UpdateColor(colorName, shape);
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Processes the values of a result handler with a color and shape filter.
|
||||
/// </summary>
|
||||
/// <param name="results">Results from result handler [0] color name, [1] shape</param>
|
||||
public void UpdateColor(string[] results)
|
||||
{
|
||||
var colorName = results[0];
|
||||
var shape = results[1];
|
||||
|
||||
UpdateColor(colorName, shape);
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Updates the color of a shape or all shapes
|
||||
/// </summary>
|
||||
/// <param name="colorName">The name of a color to be processed</param>
|
||||
/// <param name="shape">The shape name or if empty all shapes</param>
|
||||
public void UpdateColor(string colorName, string shape)
|
||||
{
|
||||
if (!ColorUtility.TryParseHtmlString(colorName, out var color)) return;
|
||||
|
||||
if (string.IsNullOrEmpty(shape) || shape == "color")
|
||||
{
|
||||
for (int i = 0; i < transform.childCount; i++)
|
||||
{
|
||||
SetColor(transform.GetChild(i), color);
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
for (int i = 0; i < transform.childCount; i++)
|
||||
{
|
||||
Transform child = transform.GetChild(i);
|
||||
if (String.Equals(shape, child.name,
|
||||
StringComparison.CurrentCultureIgnoreCase))
|
||||
{
|
||||
SetColor(child, color);
|
||||
break;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,11 @@
|
||||
fileFormatVersion: 2
|
||||
guid: d86bf3f91fb7d4d41855107fcab470d2
|
||||
MonoImporter:
|
||||
externalObjects: {}
|
||||
serializedVersion: 2
|
||||
defaultReferences: []
|
||||
executionOrder: 0
|
||||
icon: {instanceID: 0}
|
||||
userData:
|
||||
assetBundleName:
|
||||
assetBundleVariant:
|
||||
182
Assets/Oculus/Voice/Demo/Scripts/UIShapesDemo/Instructions.cs
Normal file
182
Assets/Oculus/Voice/Demo/Scripts/UIShapesDemo/Instructions.cs
Normal file
@@ -0,0 +1,182 @@
|
||||
using Facebook.WitAi;
|
||||
using Facebook.WitAi.Data.Configuration;
|
||||
using UnityEngine;
|
||||
using UnityEngine.UI;
|
||||
|
||||
#if UNITY_EDITOR
|
||||
using UnityEditor;
|
||||
#endif
|
||||
|
||||
namespace Oculus.Voice.Demo.UIShapesDemo
|
||||
{
|
||||
[ExecuteAlways]
|
||||
public class Instructions : MonoBehaviour
|
||||
{
|
||||
internal enum Step
|
||||
{
|
||||
SetupWit = 0,
|
||||
MissingServerToken,
|
||||
MissingClientToken,
|
||||
AddConfig,
|
||||
AddVoiceExperiences,
|
||||
SetConfig,
|
||||
Ready
|
||||
}
|
||||
|
||||
static readonly string[] steps = new string[]
|
||||
{
|
||||
"Create an application at https://wit.ai. You can import the \"shapes_demo - Wit.ai Config.zip\" in the Demo/Data directory to create it for you.\n\nConnect to the Wit.ai app by clicking Oculus>Voice SDK>Settings and copy the Server Access Token from the Wit.ai app's settings page.Next, create a new Wit configuration by clicking Create.",
|
||||
"Copy the Server Access Token from the Wit.ai app's settings page and paste it in field found in Oculus/Voice SDK/Settings.",
|
||||
"Wit configuration is missing a Client Access Token. Open the Wit configuration, expand Application Configuration, and click Refresh or paste a Client Access Token from your Wit.ai app settings page.",
|
||||
"Create a Wit configuration by clicking Assets/Create/Voice SDK/Configuration.",
|
||||
"The scene is missing the App Voice Experience component. Add it by clicking Assets/Create/Voice SDK/Add App Voice Experience to Scene.",
|
||||
"The App Voice Experience GameObject is missing its Wit configuration. Set the configuration to begin trying voice commands.",
|
||||
""
|
||||
};
|
||||
|
||||
[SerializeField] private Text instructionText;
|
||||
|
||||
private Step currentStep = Step.Ready;
|
||||
internal Step CurrentStep => currentStep;
|
||||
internal string CurrentStepText => steps[(int) currentStep];
|
||||
|
||||
private void OnValidate()
|
||||
{
|
||||
UpdateStep();
|
||||
}
|
||||
|
||||
private void OnEnable()
|
||||
{
|
||||
UpdateStep();
|
||||
}
|
||||
|
||||
private void Update()
|
||||
{
|
||||
UpdateStep();
|
||||
}
|
||||
|
||||
private void UpdateStep()
|
||||
{
|
||||
#if UNITY_EDITOR
|
||||
var appVoiceExperience = FindObjectOfType<AppVoiceExperience>();
|
||||
string[] guids = AssetDatabase.FindAssets("t:WitConfiguration");
|
||||
if (guids.Length == 0)
|
||||
{
|
||||
currentStep = Step.SetupWit;
|
||||
}
|
||||
else if (!appVoiceExperience)
|
||||
{
|
||||
currentStep = Step.AddVoiceExperiences;
|
||||
}
|
||||
else if (!appVoiceExperience.RuntimeConfiguration.witConfiguration)
|
||||
{
|
||||
currentStep = Step.SetConfig;
|
||||
appVoiceExperience.RuntimeConfiguration.witConfiguration =
|
||||
AssetDatabase.LoadAssetAtPath<WitConfiguration>(
|
||||
AssetDatabase.GUIDToAssetPath(guids[0]));
|
||||
}
|
||||
else if (!WitAuthUtility.IsServerTokenValid())
|
||||
{
|
||||
currentStep = Step.MissingServerToken;
|
||||
}
|
||||
else if (string.IsNullOrEmpty(appVoiceExperience.RuntimeConfiguration?.witConfiguration
|
||||
.clientAccessToken))
|
||||
{
|
||||
currentStep = Step.MissingClientToken;
|
||||
}
|
||||
else
|
||||
{
|
||||
currentStep = Step.Ready;
|
||||
}
|
||||
|
||||
|
||||
instructionText.text = steps[(int) currentStep];
|
||||
#endif
|
||||
}
|
||||
}
|
||||
|
||||
#if UNITY_EDITOR
|
||||
[CustomEditor(typeof(Instructions))]
|
||||
public class InstructionManagerEditor : Editor
|
||||
{
|
||||
public override void OnInspectorGUI()
|
||||
{
|
||||
var instructions = (Instructions) target;
|
||||
|
||||
if (instructions.CurrentStep == Instructions.Step.Ready)
|
||||
{
|
||||
GUILayout.Label(
|
||||
"Everything is ready. Press play to test activation via the Activate button.");
|
||||
}
|
||||
else
|
||||
{
|
||||
GUILayout.TextArea(instructions.CurrentStepText);
|
||||
GUILayout.Space(32);
|
||||
|
||||
switch (instructions.CurrentStep)
|
||||
{
|
||||
case Instructions.Step.SetupWit:
|
||||
SetupWitResources();
|
||||
break;
|
||||
case Instructions.Step.MissingServerToken:
|
||||
MissingServerTokenResources();
|
||||
break;
|
||||
case Instructions.Step.MissingClientToken:
|
||||
MissingClientTokenResources();
|
||||
break;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
private void MissingClientTokenResources()
|
||||
{
|
||||
GUILayout.Label("Resources", EditorStyles.boldLabel);
|
||||
|
||||
if (GUILayout.Button("Select Wit Config"))
|
||||
{
|
||||
Selection.activeObject = (FindObjectOfType<AppVoiceExperience>()
|
||||
.RuntimeConfiguration.witConfiguration);
|
||||
}
|
||||
|
||||
if (GUILayout.Button("Open Wit.ai"))
|
||||
{
|
||||
Application.OpenURL("https://wit.ai/apps");
|
||||
}
|
||||
}
|
||||
|
||||
private void MissingServerTokenResources()
|
||||
{
|
||||
GUILayout.Label("Resources", EditorStyles.boldLabel);
|
||||
|
||||
if (GUILayout.Button("Open Wit.ai"))
|
||||
{
|
||||
Application.OpenURL("https://wit.ai/apps");
|
||||
}
|
||||
}
|
||||
|
||||
private void SetupWitResources()
|
||||
{
|
||||
GUILayout.Label("Resources", EditorStyles.boldLabel);
|
||||
|
||||
if (GUILayout.Button("Open Wit.ai"))
|
||||
{
|
||||
Application.OpenURL("https://wit.ai/apps");
|
||||
}
|
||||
|
||||
GUILayout.Label("Wit.ai Sample Application File");
|
||||
GUILayout.BeginHorizontal();
|
||||
if (GUILayout.Button("Open In Explorer"))
|
||||
{
|
||||
EditorUtility.RevealInFinder("Assets/Oculus/Voice/Demo/Data/");
|
||||
}
|
||||
|
||||
if (GUILayout.Button("Copy Path"))
|
||||
{
|
||||
GUIUtility.systemCopyBuffer = Application.dataPath + "/Oculus/Voice/Demo/Data";
|
||||
}
|
||||
|
||||
GUILayout.EndHorizontal();
|
||||
}
|
||||
}
|
||||
#endif
|
||||
}
|
||||
@@ -0,0 +1,11 @@
|
||||
fileFormatVersion: 2
|
||||
guid: d7123fd6df18ed94c8e232bfe699014a
|
||||
MonoImporter:
|
||||
externalObjects: {}
|
||||
serializedVersion: 2
|
||||
defaultReferences: []
|
||||
executionOrder: 0
|
||||
icon: {instanceID: 0}
|
||||
userData:
|
||||
assetBundleName:
|
||||
assetBundleVariant:
|
||||
Reference in New Issue
Block a user