本篇文章不介绍Unity、TUIO、雷达是什么以及有什么作用。刚接触TUIO的亲们,建议直接硬刚。至于刚接触Unity的亲,这边建议亲直接放弃治疗呢

下面开始正儿八经的教程

需要准备的东西

  • Unity(版本我用的2018.2,建议不要太新也不要太老)
  • Visual Studio(用不到,但是要有。。。当然其他编辑器也可以,记事本尤佳)
  • 一个雷达(当然,调试的时候也可以没有)
  • 一个插件TouchScripts

这个插件在Unity的Asset Store上是免费的,可以直接搜索下载,我就不提供了

就是这个东东,建议Store上下载最新的,从他的介绍里面可以看到他是支持tuio的

  • 一个工具

这是一个TUIO的模拟工具,我们可以模拟雷达的消息,界面长这个样子的,

这个是Java写的,运行需要先配置java环境

然后附上下载链接 点击后面那坨云下载   提取码:elv6

开始工作

  1. 导入TouchScripts

我们下载下来之后全部导入

注意,这里要点Go Ahead,不要点No Thanks。人家又没让你捐款,你点什么No Thanks!!!

导完了之后会有一个弹出框,把我们需要的都安排一下…

接下来是浏览欣赏别人的demo时间…

看一下这个牛逼的插件能实现的功能以及基本的使用方法。当然,这是以后的事了,冷静,冷静,我们是要用来接tuio的

2.  启用TUIO

在导入插件的弹框里,我们已经将Enable TUIO给安排上了,说明已经支持TUIO了,接下来是使用

我们直接使用它里面的一个demo来做介绍,比如说就这个

打开之后他是一个类似球球大作战的小游戏,真好玩。。。。

接下来找到这么一个脚本

这个脚本处理tuio的输入,需要把它添加到场景中,但是当你拖到一个gameobject中发现拖不上去,打开脚本发现他被sealed关键字修饰了,简单粗暴的方法当然是直接删掉

   删了

好了,现在可以拖了

然后,就没有然后了,直接看效果

最后,给点小建议

1、不建议使用Drag,上面使用的模拟器当然不会有什么问题,问题是部分雷达可能会出现掉帧的情况,这就导致在拖动过程中物体随时可能会掉。这个你无法避免,只能避免使用Drag这种交互

2、注意产生事件的时间,我们经常用OnButtonDown对应TouchScripts里面的Press事件来检测用户的点击,这种对鼠标用户当然没有问题,问题是雷达在安装的时候不可能像鼠标那样映射的那么准确,以及雷达扫射面与互动面的距离、用户点击姿势不规范等等问题容易导致看起来是点中了一个button,然而实际上并没有,别人就会说你这软件点不动,有问题啊。然而你在测试的时候一点一个准,没问题。然后两人就开始撕逼了。。。。

所以在此先建议尽量把触发区域弄大一点。。。大一点。。。一点。。。点。

3、关于地面互动

地面互动的话建议就不要用事件了。因为人一走进互动区域就一直是Pressed状态,即便踩到一个button,button的Press,Tap事件都不会被触发,因为他的上一个状态还没有被释放。而且你不能期望体验者把脚抬高来释放。所以死穴。我的建议是回归原始,使用射线。具体方法是隔一定时间遍历所以Pressed状态的“指针”(即按下的鼠标以及雷达扫描到的物体,找不到一个合适的词来表达,就用插件提供的“Pointer”吧,然后在指针的位置向世界发送一条射线,看碰撞物。

最后附上我之前写地面互动的一个脚本

 using UnityEngine;
using System.Collections;
using TouchScript;
using System.Collections.Generic; /// <summary>
/// 这是一个土得掉渣的步步生花
/// </summary>
public class FlowerSpawner : MonoBehaviour
{ /// <summary>
/// 花的预制体
/// </summary>
public GameObject FlowerPerfab; /// <summary>
/// 软件扫描的频率
/// </summary>
public float Rate = ;
private float time;
/// <summary>
/// 用来发射射线的摄像机
/// </summary>
public Camera EventCamera;
public void Start()
{
time = 1f / Rate;
StartCoroutine(Spawner());
} private IEnumerator Spawner()
{
while (true)
{
///时间间隔小于Time.deltaTime没有意义
if(time < Time.deltaTime)
time = Time.deltaTime; Check();
yield return new WaitForSeconds(time);
}
} private void Check()
{
///遍历所有按下状态的指针
IList<TouchScript.Pointers.Pointer> PressedPointers = TouchManager.Instance.PressedPointers;
foreach(TouchScript.Pointers.Pointer pointer in PressedPointers)
{
///向每个指针发送射线
ToRay(pointer.Position);
}
} /// <summary>
/// 根据点击屏幕的位置发送射线
/// </summary>
/// <param name="position"></param>
private void ToRay(Vector2 position)
{
Ray ray = EventCamera.ScreenPointToRay(position);
RaycastHit hit;
if (Physics.Raycast(ray, out hit))
{
///不要重复生成
///
///这里可以做一下比较,看一下点中(踩中)的是什么,看你的逻辑
//hit.collider.tag == "" }
else
{
Vector3 spawnerPos = EventCamera.ScreenToWorldPoint(new Vector3(position.x, position.y, ));
GameObject go = Instantiate(FlowerPerfab);//这里为了方便演示直接实例化了,建议用池子
go.transform.position = spawnerPos;
}
}
}

Unity使用TUIO协议接入雷达的更多相关文章

  1. [Micropython][ESP8266] TPYBoard V202 之MQTT协议接入OneNET云平台

    随着移动互联网的发展,MQTT由于开放源代码,耗电量小等特点,将会在移动消息推送领域会有更多的贡献,在物联网领域,传感器与服务器的通信,信息的收集,MQTT都可以作为考虑的方案之一.在未来MQTT会进 ...

  2. Unity 3D 离线协议

    在联网状态下,获得离线协议,然后导入到Untiy的协议管理器里. 以后在断网的情况下,也能离线使用Unity. 步骤: 1.生成 Request 文件.(Unity_v5.3.1f1.alf) 1) ...

  3. 【Unity游戏开发】接入UWA_GOT的iOS版SDK以后无法正常出包

    一.正文 问: RT,最近有看到UWA_GOT工具新增了iOS版本的支持,于是下载了最新的工具包进行了接入测试.是按照文档直接将UWA_GOTv2.0.1_iOS.unitypackage导入进了Un ...

  4. (四) 天猫精灵接入Home Assistant-ESP-WIFI模块通过mqtt协议接入HASS

    总过程 1 ESP8266上电后,初始化 连接MQTT服务器 发布自身配置信息----hass自动发现该设备 订阅hass的命令话题---接收命令 发布hass的状态话题---返回自身状态 2 ESP ...

  5. 关于Darwin接入私有协议、私有SDK码流的讨论

          最近做到云视频/云监控的项目,跟团队伙伴讨论到一个架构问题,就是将私有协议的码流数据接入到Darwin,再通过Darwin对外提供高效的RTSP/RTP服务.说到私有协议接入Darwin, ...

  6. 一篇文章为你深度解析HTTPS 协议

    一.前言 微信小程序如期发布,开发者在接入微信小程序过程中,会遇到以下问题: 小程序要求必须通过 HTTPS 完成与服务端通信,若开发者选择自行搭建 HTTPS 服务,那需要自行 SSL 证书申请.部 ...

  7. 转:HTTPS 协议

    作者简介:罗成 腾讯云资深研发工程师 一.微信小程序接入的困境 农历新年将至,微信小程序也如期发布,开发者在接入微信小程序过程中,会遇到以下问题: 小程序要求必须通过 HTTPS 完成与服务端通信,若 ...

  8. Cas 服务器 使用HTTP协议对外服务

    在上篇博文<Cas 服务器 下载.编译及部署>Cas启动后默认支持HTTPS连接,如果要使用使用HTTP连接访问,则会收到以下信息: 注:本文是将Cas服务器运行在Http协议模式下,非设 ...

  9. CoAP、MQTT、RESTful协议区别

    /********************************************************************** * CoAP.MQTT.RESTful协议区别 * 说明 ...

随机推荐

  1. @Resource 和@Autowired区别

    @Autowired 该注解是由spring提供的 按照类型注入 public class UserService { @Autowired private UserDao userDao; } 这样 ...

  2. C# 关于AD域的操作 (首博)

    前段时间(因为懒得找具体的时间了)公司说让系统可以进行对AD域的操作,包括创建用户.于是上网查资料,了解何为AD域.还不知道的这边请https://www.cnblogs.com/cnjavahome ...

  3. Linux操作系统之Shell程序设计

    Shell是种命令解释程序,也可以看作是一种命令语言的解释器. 用户在与Shell交互时所输入的命令行必须符合Shell命令的语法和语义规范,才能够被Shell理解并执行.Shell所使用的这种命令语 ...

  4. node - 获取当前时间并格式化

    1,安装 moment模块 cnpm i moment --save 2,引入 var moment = require('moment'); 3,获取当前时间并格式化 var current_tim ...

  5. 2-Java基本数据类型和运算符

    目录 Java基本类型 Java数据类型转换 Java运算符 1.Java基本类型 1.1.boolean布尔 - 只有true和false两种值,在内存中占1bits(位),默认是false 1.2 ...

  6. Pip,pywin32,whl文件下载网址,mayavi安装包,PyQt5安装,PyMuPDF安装等注意事项

    (1)pip安装的包不一定是用户想要的位置,此时可以用 -t 选项来指定位置. 例如目标位置是/usr/local/lib/python2.7/site-packages/ ,要安装xlrd 这个包 ...

  7. 【数据结构】C++语言无锁环形队列的实现

    无锁环形队列 1.Ring_Queue在payload前加入一个头,来表示当前节点的状态 2.当前节点的状态包括可以读.可以写.正在读.正在写 3.当读完成后将节点状态改为可以写,当写完成后将节点状态 ...

  8. java菜鸟第一天

  9. PHP - 接收检验验证码 , 以JSON的形式将验证结果返回给前端

    <?php session_start(); $codeT = strtoupper(trim($_POST['codeT']));//接收前端传来的数据,转换成大写          $raw ...

  10. C++基础--智能指针

    智能指针其实也不是完全的指针,应该说是像指针一样的类对象,智能指针通常有指针的功能,当然同时也包含了一些额外的功能.目前比较常见的智能指针有auto_ptr.unique_ptr和shared_ptr ...