当听到语音命令时保持玩家移动



我正在尝试使用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();
}

}
}

请看下面我的语法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>

与其只做一次,不如存储最后的结果,并执行

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);
}

最新更新