Unity使用TUIO协议接入雷达

Wesley13
• 阅读 1550

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

下面开始正儿八经的教程

需要准备的东西

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

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

          Unity使用TUIO协议接入雷达

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

           Unity使用TUIO协议接入雷达

  • 一个工具

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

            Unity使用TUIO协议接入雷达

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

          然后附上下载链接 点击后面那坨云下载 Unity使用TUIO协议接入雷达   提取码:elv6

开始工作

  1. 导入TouchScripts

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

          Unity使用TUIO协议接入雷达

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

          Unity使用TUIO协议接入雷达

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

          Unity使用TUIO协议接入雷达

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

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

          Unity使用TUIO协议接入雷达

     2.  启用TUIO

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

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

          Unity使用TUIO协议接入雷达

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

        接下来找到这么一个脚本

         Unity使用TUIO协议接入雷达

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

Unity使用TUIO协议接入雷达    删了 Unity使用TUIO协议接入雷达

好了,现在可以拖了

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

          Unity使用TUIO协议接入雷达

最后,给点小建议

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

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

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

3、关于地面互动

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

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

Unity使用TUIO协议接入雷达 Unity使用TUIO协议接入雷达

 1 using UnityEngine;
 2 using System.Collections;
 3 using TouchScript;
 4 using System.Collections.Generic;
 5 
 6 /// <summary>
 7 /// 这是一个土得掉渣的步步生花
 8 /// </summary>
 9 public class FlowerSpawner : MonoBehaviour
10 {
11 
12     /// <summary>
13     /// 花的预制体
14     /// </summary>
15     public GameObject FlowerPerfab;
16 
17     /// <summary>
18     /// 软件扫描的频率
19     /// </summary>
20     public float Rate = 30;
21     private float time;
22     /// <summary>
23     /// 用来发射射线的摄像机
24     /// </summary>
25     public Camera EventCamera;
26     public void Start()
27     {
28         time = 1f / Rate;
29         StartCoroutine(Spawner());
30     }
31 
32     private IEnumerator Spawner()
33     {
34         while (true)
35         {
36             ///时间间隔小于Time.deltaTime没有意义
37             if(time < Time.deltaTime)
38                 time = Time.deltaTime;
39 
40             Check();
41             yield return new WaitForSeconds(time);
42         }
43     }
44 
45     private void Check()
46     {
47         ///遍历所有按下状态的指针
48         IList<TouchScript.Pointers.Pointer> PressedPointers = TouchManager.Instance.PressedPointers;
49         foreach(TouchScript.Pointers.Pointer pointer in PressedPointers)
50         {
51             ///向每个指针发送射线
52             ToRay(pointer.Position);
53         }
54     }
55 
56     /// <summary>
57     /// 根据点击屏幕的位置发送射线
58     /// </summary>
59     /// <param name="position"></param>
60     private void ToRay(Vector2 position)
61     {
62         Ray ray = EventCamera.ScreenPointToRay(position);
63         RaycastHit hit;
64         if (Physics.Raycast(ray, out hit))
65         {
66             ///不要重复生成
67             ///
68             ///这里可以做一下比较,看一下点中(踩中)的是什么,看你的逻辑
69             //hit.collider.tag == ""
70             
71         }
72         else
73         {
74             Vector3 spawnerPos = EventCamera.ScreenToWorldPoint(new Vector3(position.x, position.y, 50));
75             GameObject go = Instantiate(FlowerPerfab);//这里为了方便演示直接实例化了,建议用池子
76             go.transform.position = spawnerPos;
77         }
78     }
79 }

View Code

点赞
收藏
评论区
推荐文章
blmius blmius
2年前
MySQL:[Err] 1292 - Incorrect datetime value: ‘0000-00-00 00:00:00‘ for column ‘CREATE_TIME‘ at row 1
文章目录问题用navicat导入数据时,报错:原因这是因为当前的MySQL不支持datetime为0的情况。解决修改sql\mode:sql\mode:SQLMode定义了MySQL应支持的SQL语法、数据校验等,这样可以更容易地在不同的环境中使用MySQL。全局s
Jacquelyn38 Jacquelyn38
2年前
2020年前端实用代码段,为你的工作保驾护航
有空的时候,自己总结了几个代码段,在开发中也经常使用,谢谢。1、使用解构获取json数据let jsonData  id: 1,status: "OK",data: 'a', 'b';let  id, status, data: number   jsonData;console.log(id, status, number )
皕杰报表之UUID
​在我们用皕杰报表工具设计填报报表时,如何在新增行里自动增加id呢?能新增整数排序id吗?目前可以在新增行里自动增加id,但只能用uuid函数增加UUID编码,不能新增整数排序id。uuid函数说明:获取一个UUID,可以在填报表中用来创建数据ID语法:uuid()或uuid(sep)参数说明:sep布尔值,生成的uuid中是否包含分隔符'',缺省为
Stella981 Stella981
2年前
KVM调整cpu和内存
一.修改kvm虚拟机的配置1、virsheditcentos7找到“memory”和“vcpu”标签,将<namecentos7</name<uuid2220a6d1a36a4fbb8523e078b3dfe795</uuid
Wesley13 Wesley13
2年前
mysql设置时区
mysql设置时区mysql\_query("SETtime\_zone'8:00'")ordie('时区设置失败,请联系管理员!');中国在东8区所以加8方法二:selectcount(user\_id)asdevice,CONVERT\_TZ(FROM\_UNIXTIME(reg\_time),'08:00','0
Wesley13 Wesley13
2年前
00:Java简单了解
浅谈Java之概述Java是SUN(StanfordUniversityNetwork),斯坦福大学网络公司)1995年推出的一门高级编程语言。Java是一种面向Internet的编程语言。随着Java技术在web方面的不断成熟,已经成为Web应用程序的首选开发语言。Java是简单易学,完全面向对象,安全可靠,与平台无关的编程语言。
Stella981 Stella981
2年前
Django中Admin中的一些参数配置
设置在列表中显示的字段,id为django模型默认的主键list_display('id','name','sex','profession','email','qq','phone','status','create_time')设置在列表可编辑字段list_editable
Wesley13 Wesley13
2年前
MySQL部分从库上面因为大量的临时表tmp_table造成慢查询
背景描述Time:20190124T00:08:14.70572408:00User@Host:@Id:Schema:sentrymetaLast_errno:0Killed:0Query_time:0.315758Lock_
为什么mysql不推荐使用雪花ID作为主键
作者:毛辰飞背景在mysql中设计表的时候,mysql官方推荐不要使用uuid或者不连续不重复的雪花id(long形且唯一),而是推荐连续自增的主键id,官方的推荐是auto_increment,那么为什么不建议采用uuid,使用uuid究
Python进阶者 Python进阶者
4个月前
Excel中这日期老是出来00:00:00,怎么用Pandas把这个去除
大家好,我是皮皮。一、前言前几天在Python白银交流群【上海新年人】问了一个Pandas数据筛选的问题。问题如下:这日期老是出来00:00:00,怎么把这个去除。二、实现过程后来【论草莓如何成为冻干莓】给了一个思路和代码如下:pd.toexcel之前把这