SendMessage无法调用函数(HoloLens/Unity/C#)

3

目标:使用声音控制从一个场景切换到另一个场景。

问题:在HoloLens模拟器中启动应用程序后,第一个场景会打开。当说出“下一步”时,HoloLens确实识别了这个句子,但是sendMessage没有打开OnNextStep()函数。

感谢您的帮助!:)

using System.Collections;
using System.Collections.Generic;
using System.Linq;
using UnityEngine;
using UnityEngine.Windows.Speech;
using System.Diagnostics;
using UnityEngine.SceneManagement;

public class KeywordManager : MonoBehaviour {

    KeywordRecognizer keywordRecognizer = null;
    Dictionary<string, System.Action> keywords = new Dictionary<string, System.Action>();

    // Use this for initialization
    void Start () {
        keywords.Add("Next Step", () =>
        {
            SendMessage("OnNextStep", SendMessageOptions.DontRequireReceiver);
        });

        // Tell the KeywordRecognizer about our keywords.
        keywordRecognizer = new KeywordRecognizer(keywords.Keys.ToArray());

        // Register a callback for the KeywordRecognizer and start recognizing!
        keywordRecognizer.OnPhraseRecognized += KeywordRecognizer_OnPhraseRecognized;
        keywordRecognizer.Start();
    }

    private void KeywordRecognizer_OnPhraseRecognized(PhraseRecognizedEventArgs args)
    {
        System.Action keywordAction;
        if(keywords.TryGetValue(args.text, out keywordAction))
        {
            keywordAction.Invoke();
        }
    }

    void OnNextstep()
    {
        UnityEngine.Debug.Log(this);
        SceneManager.LoadScene("FirstStepScene");
    }

    // Update is called once per frame
    void Update () {

    }
}

1
  1. 发布您的代码而不是截图。
  2. 使用 UnityEngine.Debug.Log 而不是 System.Diagnostics.Debug.WriteLine。使用 Debug.Log,您现在可以告诉我们哪个函数未正常工作。请告诉我们是否完全调用了 OnNextstep
- Programmer
代码已添加。OnNextStep未被调用。 - Benjamin Naesen
1
在这里你也不需要使用 SendMessage。你可以直接调用该方法:keywords.Add("Next Step", () => { OnNextStep(); }); 这样做的副作用是指出方法名并不完全匹配。 ;) - Draco18s no longer trusts SE
1个回答

4

Unity的SendMessage函数在调用函数时区分大小写。

您的函数名是OnNextstep,但您正在调用OnNextStep

SendMessage("OnNextStep", SendMessageOptions.DontRequireReceiver);

请注意“S”大小写的区别。修正它,假设没有其他隐藏的问题,您的问题应该得到解决。
注意:在Unity中避免使用SendMessage。如果您想从另一个脚本调用函数,请使用GameObject.Find查找GameObject,然后使用GetComponent获取该脚本,然后调用其函数。您还可以使用事件和委托来实现此目的。

1
非常感谢您的回答和建议。我大约有4周时间来创建HoloLens软件,以可视化修复过程,我们从未学习过Unity、HoloLens或3D建模。因此,非常感谢您的帮助。我会将您列入我的项目贡献者名单中:D - Benjamin Naesen
1
不用谢。如果这是一项学校项目,不必等待老师,可以上网开始学习。Unity官网上有很多信息和教程。 - Programmer

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接