Runnable.Run / StartCoroutine从Unity调用Watson服务

问题描述 投票:0回答:2

在我的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,它本质上是一个帮助程序类,用于运行协同例程而不必从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;
}
unity3d ibm-watson coroutine
2个回答
1
投票

您无需在协程中进行任何服务调用。只使用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);
}

这些示例仅用于说明如何调用服务调用。从协程调用代码的唯一原因是我们可以在运行另一个服务调用之前等待一个服务调用的响应(即,因此我们不会在创建工作空间之前尝试更新或删除工作空间)。


1
投票

没问题。 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

如果它是活动的,可以从任何游戏对象调用协程。

© www.soinside.com 2019 - 2024. All rights reserved.