Runnable.Run / StartCoroutine 从 Unity 调用 Watson 服务
Runnable.Run / StartCoroutine calles to Watson services from Unity
在我的 ExampleStreaming.cs
脚本中,一旦用户话语被识别为 final
,我将其发送到 Watson Assistant
服务和 Tone Analyzer
。因为我将每个服务的脚本保持原样分开,所以我必须在每个脚本中进行调用以访问其他服务。您可以在下面看到我对 Tone Analyzer
的调用(.SendToneAnalysis
方法):
private void OnRecognize(SpeechRecognitionEvent result, Dictionary<string, object> customData)
{
blah blah blah . . .
/// Only send the recognized speech utterance to the
/// Assistant once we know the user has stopped talking.
if (res.final)
{
string _conversationString = alt.transcript;
Runnable.Run( StopRecording(1f) ); // Stop the microphone from listening.
/// Message.
Dictionary<string, object> input = new Dictionary<string, object>
{
["text"] = _conversationString
};
MessageRequest messageRequest = new MessageRequest()
{
Input = input,
Context = _Context
};
_exampleAssistantV1_script.SendMessageAssistant(messageRequest);
_exampleToneAnalyzer.SendToneAnalysis(_conversationString);
. . .
在我的 ExampleToneAnalyzer.cs
脚本中,我对事件处理方法进行了简单调用,这些方法旨在联系服务并处理成功和失败:
public void SendToneAnalysis(string conversationString)
{
_service.GetToneAnalyze(OnGetToneAnalyze, OnFail, conversationString);
}
这些调用通常使用 StartCoroutines
进行,特别是在 Watson Unity SDK 中有一个专门的 Runnable.Run
,它本质上是 class 的助手 运行 co -无需继承自 MonoBehavior
.
的例程
我的问题是我对服务的简单方法调用是否在某些情况下可能有问题,或者可能只是错误或糟糕的编程,或者是否完全可以使用该方法而不是像下面这样的方法:
public void SendToneAnalysis(string conversationString)
{
Runnable.Run( SendAssistantToneAnalysis(conversationString) );
}
private IEnumerator SendAssistantToneAnalysis(string conversationString)
{
if ( !_service.GetToneAnalyze(OnGetToneAnalyze, OnFail, conversationString) )
{
Log.Debug("ExampleToneAnalyzer.SendAssistantToneAnalysis()", "Failed to analyze!");
}
while (!_UserUtteranceToneTested)
yield return null;
}
没问题。
Runnable.Run() 最终如下调用 StartCoroutine()。
public Routine(IEnumerator a_enumerator)
{
_enumerator = a_enumerator;
Runnable.Instance.StartCoroutine(this);
Stop = false;
ID = Runnable.Instance._nextRoutineId++;
Runnable.Instance._routines[ID] = this;
#if ENABLE_RUNNABLE_DEBUGGING
Log.Debug("Runnable.Routine()", "Coroutine {0} started.", ID );
#endif
}
请参考https://github.com/watson-developer-cloud/unity-sdk/blob/master/Scripts/Utilities/Runnable.cs
并且协程可以从任何游戏对象调用,如果它是活动的。
您不需要从协同程序中进行任何服务调用。只有使用 iamApikey
的身份验证应该使用协程
完成
IEnumerator TokenExample()
{
// Create IAM token options and supply the apikey. IamUrl is the URL used to get the
// authorization token using the IamApiKey. It defaults to https://iam.bluemix.net/identity/token
TokenOptions iamTokenOptions = new TokenOptions()
{
IamApiKey = "<iam-api-key>",
IamUrl = "<iam-url>"
};
// Create credentials using the IAM token options
_credentials = new Credentials(iamTokenOptions, "<service-url>");
while (!_credentials.HasIamTokenData())
yield return null;
_assistant = new Assistant(_credentials);
_assistant.VersionDate = "2018-02-16";
_assistant.ListWorkspaces(OnListWorkspaces, OnFail);
}
示例仅用于展示如何调用服务调用。从协程调用代码的唯一原因是我们可以在 运行 另一个服务调用之前等待一个服务调用的响应(即我们不会在创建工作区之前尝试更新或删除工作区).
在我的 ExampleStreaming.cs
脚本中,一旦用户话语被识别为 final
,我将其发送到 Watson Assistant
服务和 Tone Analyzer
。因为我将每个服务的脚本保持原样分开,所以我必须在每个脚本中进行调用以访问其他服务。您可以在下面看到我对 Tone Analyzer
的调用(.SendToneAnalysis
方法):
private void OnRecognize(SpeechRecognitionEvent result, Dictionary<string, object> customData)
{
blah blah blah . . .
/// Only send the recognized speech utterance to the
/// Assistant once we know the user has stopped talking.
if (res.final)
{
string _conversationString = alt.transcript;
Runnable.Run( StopRecording(1f) ); // Stop the microphone from listening.
/// Message.
Dictionary<string, object> input = new Dictionary<string, object>
{
["text"] = _conversationString
};
MessageRequest messageRequest = new MessageRequest()
{
Input = input,
Context = _Context
};
_exampleAssistantV1_script.SendMessageAssistant(messageRequest);
_exampleToneAnalyzer.SendToneAnalysis(_conversationString);
. . .
在我的 ExampleToneAnalyzer.cs
脚本中,我对事件处理方法进行了简单调用,这些方法旨在联系服务并处理成功和失败:
public void SendToneAnalysis(string conversationString)
{
_service.GetToneAnalyze(OnGetToneAnalyze, OnFail, conversationString);
}
这些调用通常使用 StartCoroutines
进行,特别是在 Watson Unity SDK 中有一个专门的 Runnable.Run
,它本质上是 class 的助手 运行 co -无需继承自 MonoBehavior
.
我的问题是我对服务的简单方法调用是否在某些情况下可能有问题,或者可能只是错误或糟糕的编程,或者是否完全可以使用该方法而不是像下面这样的方法:
public void SendToneAnalysis(string conversationString)
{
Runnable.Run( SendAssistantToneAnalysis(conversationString) );
}
private IEnumerator SendAssistantToneAnalysis(string conversationString)
{
if ( !_service.GetToneAnalyze(OnGetToneAnalyze, OnFail, conversationString) )
{
Log.Debug("ExampleToneAnalyzer.SendAssistantToneAnalysis()", "Failed to analyze!");
}
while (!_UserUtteranceToneTested)
yield return null;
}
没问题。 Runnable.Run() 最终如下调用 StartCoroutine()。
public Routine(IEnumerator a_enumerator)
{
_enumerator = a_enumerator;
Runnable.Instance.StartCoroutine(this);
Stop = false;
ID = Runnable.Instance._nextRoutineId++;
Runnable.Instance._routines[ID] = this;
#if ENABLE_RUNNABLE_DEBUGGING
Log.Debug("Runnable.Routine()", "Coroutine {0} started.", ID );
#endif
}
请参考https://github.com/watson-developer-cloud/unity-sdk/blob/master/Scripts/Utilities/Runnable.cs
并且协程可以从任何游戏对象调用,如果它是活动的。
您不需要从协同程序中进行任何服务调用。只有使用 iamApikey
的身份验证应该使用协程
IEnumerator TokenExample()
{
// Create IAM token options and supply the apikey. IamUrl is the URL used to get the
// authorization token using the IamApiKey. It defaults to https://iam.bluemix.net/identity/token
TokenOptions iamTokenOptions = new TokenOptions()
{
IamApiKey = "<iam-api-key>",
IamUrl = "<iam-url>"
};
// Create credentials using the IAM token options
_credentials = new Credentials(iamTokenOptions, "<service-url>");
while (!_credentials.HasIamTokenData())
yield return null;
_assistant = new Assistant(_credentials);
_assistant.VersionDate = "2018-02-16";
_assistant.ListWorkspaces(OnListWorkspaces, OnFail);
}
示例仅用于展示如何调用服务调用。从协程调用代码的唯一原因是我们可以在 运行 另一个服务调用之前等待一个服务调用的响应(即我们不会在创建工作区之前尝试更新或删除工作区).