65.9K
CodeProject 正在变化。 阅读更多。
Home

Unity、Intel Edison 驱动的物联网 VR

starIconstarIconstarIconstarIconstarIcon

5.00/5 (4投票s)

2016年8月6日

CPOL

18分钟阅读

viewsIcon

44683

downloadIcon

233

使用 Unity、Intel Edison 和 MQTT 实现虚拟现实

目录

  1. 引言
  2. 背景
  3. 我们的意图
  4. 提出的管道
  5. 我们开始使用 Unity
  6. Unity 资源商店
  7. Unity 动画控制器
  8. 是时候使用 MQTT 客户端了
  9. 动画控制
  10. Unity 中的 MQTT
  11. Google Cardboard 集成
  12. 用硬件控制傀儡
  13. 用手势控制傀儡
  14. 用 Intel Edison 物联网设备控制傀儡
  15. HoloLens 实验为何失败
  16. 结论

引言

在本教程中,我们将从不同的角度探讨如何使用 Unity 实现虚拟体验。我们将构建一个动画系统,让我们的角色栩栩如生,并通过引入 MQTT 的范围,加入 Intel Edison 来感受魔力,从而增添不同的维度。在此期间,我们还将介绍动画系统和控件,以便在应用移动性的同时,为我们的角色实现状态转换。

背景

这篇文章更多的是我进行的一项研究,我一直在思考如何将物联网融入 VR。首先,由于其易于学习的特性,我选择了 Unity IDE。它非常适合让项目更加生动。对于集成部分,我们研究了与 Unity 和物联网设备进行远程交互的通信媒介。在考虑了所有细节和可行性后,我发现最好的方法是使用 MQTT。为了添加角色,我必须深入研究哪种角色最适合项目。我尝试了 Mixamo 来获取角色的动画细节,当然,我觉得它很有用,但为了项目的目的,我从 Unity 资源商店中选择了更简单的方式——一个带有免费自定义动画的角色。在这里,我将分享我关于已创建项目的经验。

我们的意图

从概念上讲,这只是一个能让事情顺利进行的梦想,所以开始时这是一项艰巨的任务。

Unity 部分

  1. 我们需要可以免费用于我们项目的角色,而我们的时间非常少。在 Blender 中创建角色会花费时间(我对 Blender 了解甚少!)。最明显的选择是 Unity 中免费提供的。
  2. Unity 资源商店来帮忙:我一直在思考哪些人物和角色对我很重要,所以我认为一个玩偶式角色会成型并为项目带来良好的形状,因此我们开始搜索,而且确实,商店里有很棒的资产,然后是 Unity Chan 模型,因为这个模型在 Unity 论坛上得到了很好的解释,并且很容易调整。
  3. 添加动画:由于我们发现这个角色有很多可用的动画状态,动画控制就变得至关重要。我们学习了大量的动画实现教程,然后我们就可以开始了。

物联网部分

这是最棘手的部分,因为我们必须为 Unity 中的交互引入一个新维度。

  1. 显而易见的想法是如何在 Unity 项目和物联网设备之间进行通信,我研究了很多,然后发现 MQTT 是最佳选择。
  2. 现在接下来是将 MQTT 集成到 Unity 中,这很棘手。我必须深入研究,然后发现了一个 Github 库,它来帮了我。
  3. 下一步是调整代码,将其集成到我们的场景中,以便为我们的项目提供进一步的帮助。我通过了解它的基本原理并深入研究代码来实现这一点。
  4. 我尝试了与 mymqtt 应用的第一次通信,试图将分解为不同媒介和可用命令的运动进行映射,是的,这很成功。

提出的管道

下图显示了项目的建议工作流程。如何在一个地方管理整个场景是一件费力的事情,但随着我知识的增长,不同的想法涌现出来,从而形成了这个流程。

下载最新版本的 Unity 来开始。确保你选择了要针对的平台(32 位或 64 位)。然后继续下载。

工作流程

我们来分解一下工作流程

  1. 我们在 Unity 中设计游戏概念、移动,我们创建一个场景并添加交互功能。然后我们设置动画控制,并用键盘按键(上、下、左、右)使其正常工作。进展得很顺利。
  2. 我们开始研究如何进行物联网级别的交互,然后我们搜索了大量内容,发现 MQTT 最适合。我们进行了集成。
  3. 下一步是看看我们是否能够直接与 Unity 场景通信。在 Android 手机上安装 mymqtt 应用,然后订阅我们在 MQTT 客户端配置的频道。我们进行了基本的数字交互,看看是否能够通信,并且效果很好。所以接下来。
  4. 我们使用 Android Studio 创建了一个应用,并在其中集成了 MQTT,以通过前进、后退、向左和向右的移动与 Unity 场景进行交互。这进展得非常顺利。
  5. 由于这是 Unity,我们将其转换为 Windows 10 UWP(我们决定不这样做,因为 MQTT 无法正常工作)。
    因此,第五项改成了 Google Cardboard。
  6. 我们集成了 RealSense。

我们开始使用 Unity

  1. 首先,我们需要下载 Unity 进行设置。首先,您需要确保要安装的平台是 32 位还是 64 位。
  2. 直接前往 网站 下载可执行文件。

在这里,您将可以选择下载 Unity 的版本,直接开始下载。

在下一页,您将有多种下载 Unity 的选项。我们选择了免费版本。

选择免费版本使我们能够测试和构建我们的应用程序,并进行发布。

在下一步,您将看到下载安装程序的选项。下载安装程序后,我们需要选择目标平台,基本平台包括 PC、Android 构建等。

安装完成后,现在轮到我们选择并开始项目了。

首次登录时,它会要求您提供 Unity ID(请确保您已注册,因为有它的帮助,您现在可以从资源商店下载资源,否则您也可以离线工作)。

我们打开 Unity 并为项目命名。请确保选择了 3D 切换选项。然后我们单击“创建项目”。

在进一步讨论之前,我们现在需要了解 Unity 资源商店是什么。

Unity 资源商店

Unity 资源商店是一个市场,您可以在其中轻松找到并使用项目资源。其中一些很棒的资源是免费的,有些是付费的。

为什么使用资源商店?

如果我们是单人开发者,很难找到时间来设计角色、添加动画和其他逻辑。当我们尝试学习新的 3D 设计工具时,学习曲线会很陡峭。为了将我们的逻辑变为现实,我们需要动画、预构建的角色。我们可以轻松地投入到 C# 代码中,并充分利用该语言将整个游戏体验变为现实。但是,我们必须自己弄清楚动画控制。

娃娃的概念

从小到大,我一直对玩洋娃娃情有独钟,晚上睡觉时都会放在身边,讲故事(是的,那些美好的日子真是太有趣了……我希望我能回去)。我们很容易与玩偶产生感情,并编织童话故事。因此,当我开始这个项目时,我想回到过去,重温它,于是我们开始了。我们心里想着,我们将需要创建一个简单的系统,让它可以前后移动,并且可以通过我们的物联网设备轻松控制。

在资源商店搜索

我们一直希望给我们的应用程序一个经典的童话般的风格,我们发现一个角色和一个低多边形模型对我们来说非常有用。

Unity Chan 模型

这个日本模型太可爱了,我们觉得我们可以使用它。还有一个关于如何使用它的教程。

灵活性是

  1. 动画
  2. 角色的可爱度
  3. 易于根据我们的喜好进行配置

现在,对于我们的环境设置,我们不得不选择一个低多边形环境,它能给我们的场景带来特殊的感受。确实,我找到了一个“低多边形计数环境”。它很经典,也是我们的风格。

将两者混合

想法是创建一个场景,我们将角色放在一起开始。我们以已添加的资源为例。我们打开了演示场景来检查模型的性能。确实很酷。

现在,该导入低多边形模型并测试场景了。

打开测试场景后,确实发现它值得研究。

实验时间

我们包含了 Unity Chan 模型,现在该我们开始编码和配置了。

由于角色背对着相机,我们不得不旋转它,所以使用了 Unity 中的旋转工具来改变角色的视角。

现在轮到我们决定动画控制系统了。

Unity 动画控制器

Unity 动画控制器以一种面向状态的方式组织动画控制。特别之处在于,您可以在一个地方驱动不同组的动画。我们还可以拥有称为混合状态的动画子集。现在,首先,我们认为我们可以尝试简单的动画过渡。

让我们重新开始

在“项目”选项卡中,我们必须右键单击,然后会出现创建动画控制器的选项。

我们给它命名,然后将其拖到 Unity Chan 模型的动画控制器上。

接下来,我们双击动画控制器,我们将看到状态。

让我们分解一下默认状态机系统:任意状态、进入状态和退出状态。

确保“应用根运动”未选中。

现在让我们加入一些我们打算使用的动画。我们将等待动画拖到画面上。

该保存场景了。给它命名并保存。

是时候使用 MQTT 客户端了

什么是 MQTT?

根据维基百科,MQTT 是一种机器对机器的“物联网”协议。它非常可靠,并且可以快速准确地传输消息。

我们在网上搜索了很多,但有一个 Github 链接来帮忙

我们下载了它并导入到我们的项目中。我们打开了 Unity 中的示例场景。

它能够发送和接收 MQTT 消息。

为了方便我们的发送/接收目的,我们想了一个技巧。我们使用了 Google Play 商店的 mymqtt 应用,以便我们可以发送/接收到频道的数据。

MYMQTT 应用

链接

这种方式很简单,因为我们沟通起来非常方便。

该应用程序具有

仪表板、订阅、发布、存储的消息和设置

在我们看来,设置是最重要的部分。

在这里,在主代理 URL 选项卡中,我们输入:iot.eclipse.org,端口是 1883。

动画控制

让我们再回到动画,我们已经处理了 MQTT 部分,我们将介绍动画控制过程中的代码更改。

导入并添加场景中的详细信息后,其结构看起来是这样的。

现在,当我们添加等待动画时,我们在动画控制器中看到橙色表示的一个等待状态,这是动画的默认状态。

我们可以右键单击任何状态,并将其设为默认状态。从其他等待状态,我们像上图所示那样创建到默认状态的过渡。

现在,我们将开始处理 C# 脚本。

当我们创建脚本时,它是空的。

我们进入“Assets”,然后是“Create”,然后是“C# script”。

这个脚本将作为我们控制动画的起点。首先,脚本是空的。

//
// using UnityEngine;
using System.Collections;

public class Play : MonoBehaviour {

	 Use this for initialization
	void Start () {
	
	}
	
	// Update is called once per frame
	void Update () {
	
	}
}

//

在脚本中,首先我们需要分配一个动画器,因此我们将其声明为

     public Animator Animd;    

获取动画控制器访问权限,我们已经获取了驱动动画的组件。

    Animd = GetComponent<animator>();
    // 

为了获取不同的交互密钥,我们在 `update` 方法中声明它,它允许我们检查是否按下了键盘、触摸控件或其他输入。

     if (Input.GetKeyDown("1"))
        {
            Animd.Play("WAIT01", -1, 0.5f);
        }
        if (Input.GetKeyDown("2"))
        {
            Animd.Play("WAIT02", -1, 0.5f);
        }
        if (Input.GetKeyDown("3"))
        {
            Animd.Play("WAIT03", -1, 0.5f);
        }
        if (Input.GetKeyDown("4"))
        {
            Animd.Play("WAIT04", -1, 0.5f);
        }
    // 

其中 `WAIT01` 是动画的名称,`-1` 表示动画控制系统的层。当您创建过渡系统时,动画控制系统可以分解为子层。

`0f` 表示动画从哪个点开始播放。

现在我们将处理水平和垂直移动,因此我们需要声明参数。它将是 `float` 格式。

对于水平和垂直,我们不得不声明两个参数。

现在我们需要回到脚本并声明它。

private float inputH;

private float inputV;

现在我们需要检测水平和垂直轴。

inputH = Input.GetAxis("Horizontal");

 inputV = Input.GetAxis("Vertical");

现在我们需要放入 `inputH` 和 `inputV` 的值。

Animd.SetFloat("inputH", inputH);
Animd.SetFloat("inputV", inputV);

现在是时候创建一个新的混合树了,以便我们可以为动画控制添加一个子层。

在这个层中,我们将添加移动动画,我们可以从中描绘左、右、上和下方向的移动。

我们将混合树类型设置为 2D 简单方向。

参数为 `inputH` 和 `inputV`。

在运动列表中,我们添加了不同的运动字段。我们添加了四个用于调整。

我们需要更新值

由于我们已经添加了移动,现在是时候看看子层混合树的样子了。添加“Motion”选项,我们用适当的左、右、上、下移动进行替换。

移动映射到运动。现在子层看起来是这样的。蓝点是我们的动画,红点是我们混合的近距离。

现在我们从基础层过渡到子层(就像我们之前所做的那样,左键单击过渡到子层)。现在我们选择连接 `WAIT00` 和“移动”的箭头,然后单击它。

我们必须取消选中“has exit time”选项,因为这样做可以让我们不必等待动画就可以进入下一个状态。

现在我们转到条件选项。在这里,我们设置 `inputV` 和 `inputH`,然后在大于 `0.1` 的时候转到特定的条件。

现在我们添加另一个条件。

当 `inputV` 小于 `-0.1` 时,我们转到上一个过渡。我们使用了多个混合树过渡来实现动作的准确反映。

下一步是向 Unity Chan 模型添加刚体,并确保重力已禁用。

现在我们将移动添加到 `rigidbody`,我们需要回到脚本。

Animd.SetFloat("inputH", inputH);
        Animd.SetFloat("inputV", inputV);

我们根据方向添加移动

       float moveX = inputH * 20f * Time.deltaTime;
        float moveZ = inputV * 25f * Time.deltaTime;
Then we add those back to the rigid body component.
       rbody.velocity = new Vector3(moveX, 0f, moveZ);

Unity 中的 MQTT

让我们看一下 `mqtttest.cs` 文件

using UnityEngine;
using System.Collections;
using System.Net;
using uPLibrary.Networking.M2Mqtt;
using uPLibrary.Networking.M2Mqtt.Messages;
using uPLibrary.Networking.M2Mqtt.Utility;
using uPLibrary.Networking.M2Mqtt.Exceptions;

using System;

public class mqttTest : MonoBehaviour {
	private MqttClient client;
	// Use this for initialization
	void Start () {
		// create client instance 
		client = new MqttClient(IPAddress.Parse("143.185.118.233"),8080 , false , null ); 
		
		// register to message received 
		client.MqttMsgPublishReceived += client_MqttMsgPublishReceived; 
		
		string clientId = Guid.NewGuid().ToString(); 
		client.Connect(clientId); 
		
		// subscribe to the topic "/home/temperature" with QoS 2 
		client.Subscribe(new string[] { "hello/world" }, 
                         new byte[] { MqttMsgBase.QOS_LEVEL_EXACTLY_ONCE }); 

	}
	void client_MqttMsgPublishReceived(object sender, MqttMsgPublishEventArgs e) 
	{ 

		Debug.Log("Received: " + System.Text.Encoding.UTF8.GetString(e.Message)  );
	} 

	void OnGUI(){
		if ( GUI.Button (new Rect (20,40,80,20), "Level 1")) {
			Debug.Log("sending...");
			client.Publish("hello/world", 
            System.Text.Encoding.UTF8.GetBytes("Sending from Unity3D!!!"), 
            MqttMsgBase.QOS_LEVEL_EXACTLY_ONCE, true);
			Debug.Log("sent");
		}
	}
	// Update is called once per frame
	void Update () {

	}
}

我们需要在此处更改代码部分。

客户端将定向到我们的频道

 client = new MqttClient("iot.eclipse.org", 1883, false, null);

现在我们订阅频道

// subscribe to the topic "/home/temperature" with QoS 2 
        client.Subscribe(new string[] { "rupam/data" }, 
        new byte[] { MqttMsgBase.QOS_LEVEL_EXACTLY_ONCE });

更新后的 `mqttclient.cs` 文件

using UnityEngine;
using System.Collections;
using System.Net;
using uPLibrary.Networking.M2Mqtt;
using uPLibrary.Networking.M2Mqtt.Messages;
using uPLibrary.Networking.M2Mqtt.Utility;
using uPLibrary.Networking.M2Mqtt.Exceptions;

using System;

public class mqttTest : MonoBehaviour {
	private MqttClient client;
	// Use this for initialization
	void Start () {
        // create client instance 
        client = new MqttClient("iot.eclipse.org", 1883, false, null);

        // register to message received 
        client.MqttMsgPublishReceived += client_MqttMsgPublishReceived; 
		
		string clientId = Guid.NewGuid().ToString(); 
		client.Connect(clientId);

        // subscribe to the topic "/home/temperature" with QoS 2 
        client.Subscribe(new string[] { "rupam/ar" }, 
               new byte[] { MqttMsgBase.QOS_LEVEL_EXACTLY_ONCE });
    }
    string msg = "";
    public static int Num = -1;
    void client_MqttMsgPublishReceived(object sender, MqttMsgPublishEventArgs e) 
	{
        try
        {
            msg = System.Text.Encoding.UTF8.GetString(e.Message).Trim();
            
            if (msg.Equals("STOP"))
            {
                //Num = 4;
                player.LR = -1;
                player.FR = -1;                
            }
            if (msg.Equals("NO"))
            {
                player.LR = -1;
            }
            if (msg.Equals("FORWARD"))
            {
                player.FR=1;
            }
            if (msg.Equals("REVERSE"))
            {
                player.FR=0;
                Debug.Log("REVERSE");
            }
            if (msg.Equals("LEFT"))
            {
                player.LR = 3;
            }
            if (msg.Equals("RIGHT"))
            {
                player.LR = 2;
            }
            if (msg.Equals("JUMP"))
            {
                player.jump = true;
            }
            if (Num != -1)
             player.Num = Num;
        }
        catch
        {

        }

        Debug.Log("Received: " + msg+" Num="+Num  );
	} 

	void OnGUI(){
		if ( GUI.Button (new Rect (20,40,80,20), "Level 1")) {
            Debug.Log("sending...");
            client.Publish("hello/world", System.Text.Encoding.UTF8.GetBytes
            ("Sending from Unity3D!!!"), MqttMsgBase.QOS_LEVEL_EXACTLY_ONCE, true);
            Debug.Log("sent");
        }
	}
	// Update is called once per frame
	void Update () {
        if (Num != -1)
            Debug.Log("Updating..." + Num);
    }
}

更新代码的关键点是

msg = System.Text.Encoding.UTF8.GetString(e.Message).Trim();

在这里,我们编码消息并对其进行修剪。它有助于更快地识别通过 MQTT 发送的消息。而我们处理移动的部分是项目的关键。强调代码中用于交换 MQTT 命令的映射部分。

现在让我们看看对主玩家脚本所做的更改。

对于玩家的前进和向左的值,我们分配了 `-1` 的值。

对于多个同步步行动作,我们使用了 `inputH` 和 `inputV` 值来响应 `mqtt` 命令。

using System.Collections;

public class player : MonoBehaviour {
    //internal static int Num;
    public Animator anim;
	public Rigidbody rbody;

	private float inputH;
	private float inputV;
	private bool run;
    public static int Num=-1;
    public static int FR = -1;
    public static int LR = -1;
    public static bool jump = false;
    // Use this for initialization
    void Start () 
	{
		anim = GetComponent<animator>();
		rbody = GetComponent<rigidbody>();
		run = false;
	}
	
	// Update is called once per frame
	void Update () 
	{
		if(Input.GetKeyDown("1"))
		{
			anim.Play("WAIT01",-1,0f);
		}
		if(Input.GetKeyDown("2"))
		{
			anim.Play("WAIT02",-1,0f);
		}
		if(Input.GetKeyDown("3"))
		{
			anim.Play("WAIT03",-1,0f);
		}
		if(Input.GetKeyDown("4"))
		{
			anim.Play("WAIT04",-1,0f);
		}

		if(Input.GetMouseButtonDown(0))
		{
			int n = Random.Range(0,2);

			if(n == 0)
			{
				anim.Play ("DAMAGED00",-1,0f);
			}
			else
			{
				anim.Play ("DAMAGED01",-1,0f);
			}
		}

		if(Input.GetKey(KeyCode.LeftShift))
		{
			run = true;
		}
		else
		{
			run = false;
		}

		if(Input.GetKey(KeyCode.Space))
		{
			anim.SetBool("jump",true);
		}
		else
		{
			anim.SetBool("jump", false);
		}

		inputH = Input.GetAxis ("Horizontal");
		inputV = Input.GetAxis ("Vertical");
        if (FR == 0)
        {
            inputV = -1f;

        }
        if( FR == 1)
        {
            inputV = 1f;

        }
        if (LR == 2)
        {
            inputH = -1;

        }
        if (LR == 3)
        {
            inputH = 1;

        }
        if (LR== -1)
        {
            //Num = -1;
           // mqttTest.Num = -1;
         //   inputH = 0;
        }
        if(FR==-1)
        {
            //inputV = 0;
            //mqttTest.Num = -1;
        }
        if(jump)
        {
            anim.SetBool("jump", true);           
        }
        else
        {
            anim.SetBool("jump", false);
        }

        anim.SetFloat("inputH",inputH);
		anim.SetFloat("inputV",inputV);
		anim.SetBool ("run",run);

		float moveX = inputH*20f*Time.deltaTime;
		float moveZ = inputV*50f*Time.deltaTime;		

		rbody.velocity = new Vector3(moveX,0f,moveZ);

        if (jump)
        {
            jump = false;
            Debug.Log("inputH=" + inputH + " inputV=" + inputV + " dt" + 
            Time.deltaTime + "Num " + Num + " movZ:" + moveZ + "movX:" + moveX);
        }
    }
}</rigidbody></animator>

代码的这部分允许我们连接到 MQTT 并使用该服务。

Google Cardboard 集成

集成到 Google Cardboard 是最后一步,因为 Microsoft HoloLens 不支持 MQTT,所以我们决定使用 Google Cardboard。起初,我们不知道从哪里开始,但我在 Google Cardboard 的 Unity 入门链接上找到了

现在我们需要去 Git 仓库下载它。

保存下载。然后解压缩。

现在您需要将 Google Cardboard 包导入 Unity。

我们用于实验和集成目的的场景是头显演示场景,它满足了我们工作的所有需求。

对我们场景最重要的部分是 VR 视角下的相机集成。然后是场景的其他设置。让我们开始吧。在我们的场景中,第一件事是复制 GVR 视线。GVR 视线需要附加到主相机上。接下来,我们需要复制 GVR 视线主视图、地板画布、事件系统和叠加画布。

复制场景后,运行时看起来是这样的。

现在我们可以使用 Google Cardboard 了。场景现在与 Google Cardboard 兼容。

现在我们将为项目生成 APK。首先,我们需要将项目的构建配置更改为 Android。

现在,当我们处理构建时,它开始编译并为 Android 构建。

编译过程结束后,将创建一个 APK 文件。

用硬件控制傀儡

既然我们已经将 MQTT 网关添加到项目中,现在是时候控制它了。对于基于 Android 的控制,您所要做的就是从 Android 应用中直观地生成 MQTT 命令。

我们在本文中展示了如何创建一个简单的基于 MQTT 的远程控制。请参考文章并下载应用程序。

用手势控制傀儡

您还可以使用自定义手势来控制傀儡。请参阅 YouCar 的本节内容。

您需要更改 MQTT 频道。保持频道特定于您的项目或用户,这样当其他用户使用您的应用程序时,他们的命令就不会干扰当前用户的命令。我们尝试了手势部分(Intel Realsense),我们(我和 Rupam 相隔很远,在中国不同的地方,一个在东部,一个在南部)进行了相当有趣的结果。我们能够远程控制 Unity 角色(或傀儡),这正是 MQTT 的强大之处。

这是使用 TeamViewer 交换的图片。

用 Intel Edison 物联网设备控制傀儡

这部分由我们的另一位合著者 Moumita Das 负责,她创建了用于 Intel Edison 的不同手势。最后,这些手势通过 MQTT 映射,用作我们项目的可穿戴设备。

请参阅 Moumita Das 关于 基于加速度计的 Intel Edison 手势识别 的文章,以了解电路和代码,用于手势识别并将物联网设备手势集成到当前应用程序的上下文中。该文章详细介绍了 UP、DOWN、LEFT 和 RIGHT 手势。您可以轻松地将 FORWARD 和 REVERSE 手势集成到框架中,并在当前上下文中进行使用。

HoloLens 实验为何失败

我们没有 HoloLens 设备,但我们正在广泛使用 HoloLens 模拟器(如果有人赞助,我们很乐意拥有一个 :-)) 并且已经做了很多相关工作。我们还在写一本关于 HoloLens 的书。首先,我们的想法是获取 HoloLens Origami 项目。我构建的每一个项目都建立在此之上。一些最近的实验图片。

当项目在模拟器中运行时,它会显示相同的 Unity 启动画面。

最后,我们用空间映射制作了一个游戏,通过空中点击(手势)击打球,我们在全息图放置的自由空间中得分。

最后,我们认为我们可以将同样的专业知识应用到工作中,但没有成功。一般情况是 Unity (3.5) 的 .NET Framework,mqqt 还没有准备好被引用,我们也无法向其添加 mqtt 框架。我们在网上搜索了很多,但都找不到正确的答案。Unity 论坛上的一些人建议,如果我们有 IL2CPP 后端,我们可以添加框架。但这个扩展在 HoloLens 技术预览版中不可用。

il2cpp 后端至今仍不可用,因此我们无法做到。我们将继续尝试,当然也会采取不同的途径。在下一个框图中,我们展示了我们为 HoloLens 尝试过的整个工作流程以及它失败的地方。

结论

在完成整个实验后,我们为 Unity 创建了一个完整的框架,可以轻松地扩展到其他游戏(我们会这样做的),并且可以通过手势、手机和其他可穿戴设备在任何地方进行控制,唯一需要的连接介质是互联网。这是一次迷人的体验。

© . All rights reserved.