Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/visual-studio/7.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 当发出语音命令时,保持播放机移动_C#_Visual Studio_Unity3d_Grammar - Fatal编程技术网

C# 当发出语音命令时,保持播放机移动

C# 当发出语音命令时,保持播放机移动,c#,visual-studio,unity3d,grammar,C#,Visual Studio,Unity3d,Grammar,我正在尝试使用GrammarRecognizer制作一个简单的语音命令游戏。我已经设法让玩家在说出相应的单词时向左或向右移动 我试图让玩家不断朝一个方向移动,直到说出相反的词 我尝试过使用while循环,但它似乎使程序崩溃 任何帮助都将不胜感激 请参阅下面的播放器控制器代码: using System.Collections; using System.Collections.Generic; using System.IO; using System.Text; // for stringb

我正在尝试使用GrammarRecognizer制作一个简单的语音命令游戏。我已经设法让玩家在说出相应的单词时向左或向右移动

我试图让玩家不断朝一个方向移动,直到说出相反的词

我尝试过使用while循环,但它似乎使程序崩溃

任何帮助都将不胜感激

请参阅下面的播放器控制器代码:

using System.Collections;
using System.Collections.Generic;
using System.IO;
using System.Text;  // for stringbuilder
using UnityEngine;
using UnityEngine.Windows.Speech;   // grammar recogniser

public class PlayerScript : MonoBehaviour
{
   private GrammarRecognizer gr;
   public Rigidbody2D playerRb;

    private void Start(){
        playerRb = this.GetComponent<Rigidbody2D>(); 
        gr = new GrammarRecognizer(Application.streamingAssetsPath + "/SimpleGrammar.xml", ConfidenceLevel.Medium);
        gr.OnPhraseRecognized += GR_OnPhraseRecognized;
        gr.Start();
        Debug.Log("Grammer loaded and recogniser started");

    }
    private void GR_OnPhraseRecognized(PhraseRecognizedEventArgs args)
    {
        StringBuilder message = new StringBuilder();
        SemanticMeaning[] meanings = args.semanticMeanings;

        
            foreach(SemanticMeaning meaning in meanings)
            {
                string keyString = meaning.key.Trim();
                //Get meanings
                string valueString = meaning.values[0].Trim();
                //output phrase
                message.Append("Key: " + keyString + ", Value: " + valueString );
                //if left is said
                if(valueString == "left"){
                    //move left
                    transform.Translate(new Vector3(-200 * Time.deltaTime,0,0));
                    //transform.Translate(new Vector3(-200 * Time.deltaTime,0,0));
                }
                
                //if right is said
                if(valueString == "right"){
                    //move right
                    transform.Translate(new Vector3(200 * Time.deltaTime,0,0));
                    
                
                }

            }

        Debug.Log(message);

    }

    
    private void OnApplicationQuit()
    {
        if(gr != null && gr.IsRunning)
        {
            gr.OnPhraseRecognized -= GR_OnPhraseRecognized;
            gr.Stop();
        }

       
    }

}
使用系统集合;
使用System.Collections.Generic;
使用System.IO;
使用System.Text;//对于stringbuilder
使用UnityEngine;
使用UnityEngine.Windows.Speech;//语法识别器
公共类PlayerScript:MonoBehavior
{
私人语法认知者gr;
公共刚体2D播放器B;
私有void Start(){
playerRb=this.GetComponent();
gr=新语法认知程序(Application.streamingAssetsPath+“/SimpleGrammar.xml”,ConfidenceLevel.Medium);
gr.onphrasecognized+=gr_onphrasecognized;
gr.Start();
Log(“已加载语法并启动识别器”);
}
private void GR_onphraseRecognited(phraseRecognitizedeventargs args)
{
StringBuilder消息=新建StringBuilder();
SemanticMeaning[]含义=args.semanticMeanings;
foreach(语义中的语义含义)
{
字符串keyString=means.key.Trim();
//获得意义
string valueString=含义。值[0]。修剪();
//输出短语
message.Append(“键:+keyString+”,值:+valueString);
//如果说左
如果(valueString==“左”){
//向左移动
transform.Translate(新向量3(-200*Time.deltaTime,0,0));
//transform.Translate(新向量3(-200*Time.deltaTime,0,0));
}
//如果说对了
如果(valueString==“右”){
//右移
transform.Translate(新向量3(200*Time.deltaTime,0,0));
}
}
Debug.Log(消息);
}
Application Quit()上的私有void
{
if(gr!=null&&gr.IsRunning)
{
gr.onphrasecognized-=gr_onphrasecognized;
gr.Stop();
}
}
}
请参见下面我的语法XML文件:

?xml version="1.0" encoding="utf-8" ?>

<grammar xml:lang="en" root="rightorleft"
tag-format="semantics/1.0" version="1.0"
xmlns="http://www.w3.org/2001/06/grammar">

  <rule id="rightorleft">
    <one-of>
      <item>
        <ruleref uri="#right"/>
      </item>
      <item>
        <ruleref uri="#left"/>
      </item>
    </one-of>
  </rule>

  <rule id="left">
    <item>left</item>
  </rule>

  <rule id="right">
    <item>right</item>
  </rule>

</grammar>

?xml version=“1.0”encoding=“utf-8”>
左边
正当

很好地保存最后的结果,而不是只做一次,例如

private enum Direction
{
    Idle,
    Left,
    Right
}

private Direction currentDirection;

private void Update()
{
    switch(currentDirection)
    {
        case Direction.Left:
            transform.Translate(Vector3.right * -200 * Time.deltaTime);
            break;

        case Direction.Right:
            transform.Translate(Vector3.right * 200 * Time.deltaTime);
            break;
    }
}

private void GR_OnPhraseRecognized(PhraseRecognizedEventArgs args)
{
    var message = new StringBuilder();
    var meanings = args.semanticMeanings;
    
    foreach(var meaning in meanings)
    {
        var keyString = meaning.key.Trim();
        var valueString = meaning.values[0].Trim();

        message.Append($"Key: {keyString}, Value: {valueString}");
        
        switch(valueString) 
        {
            case "left":
                currentDirection = Direction.Left;
                break;
            
            case "right":
                currentDirection = Direction.Right;
                break;
        }
    }

    Debug.Log(message);
}

从来都不知道Unity有这样的功能,但是GR_onphraseRecognited是一个回调,所以它只会移动一次。其次,一旦在
foreach
循环中识别出语音命令,您应该
继续
,停止检查。您可能希望在识别短语时启动协同程序,或者在
Update
中执行某些操作。现在
时间。deltaTime
实际上没有任何意义。感谢manThanks人的帮助,非常感谢!!!!