zoukankan      html  css  js  c++  java
  • Unity使用TUIO协议接入雷达

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

    下面开始正儿八经的教程

    需要准备的东西

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

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

              image

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

               image

    • 一个工具

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

                image

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

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

    开始工作

    1. 导入TouchScripts

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

              image

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

              image

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

              image

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

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

              image

         2.  启用TUIO

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

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

              image

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

            接下来找到这么一个脚本

             image

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

    image   删了 image

    好了,现在可以拖了

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

              111

    最后,给点小建议

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

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

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

    3、关于地面互动

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

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

     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
  • 相关阅读:
    [luogu P2184] 贪婪大陆 [树状数组][线段树]
    luogu P3373 【模板】线段树 2
    [luogu P3384] 【模板】树链剖分 [树链剖分]
    树链剖分膜版
    AtCoder Grand Contest 026F
    AtCoder Regular Contest 091F
    AtCoder Regular Contest 099F
    AtCoder Grand Contest 027D
    向量叉积分配律简单证明
    LOJ 538. 「LibreOJ NOIP Round #1」数列递推(找规律+结论)
  • 原文地址:https://www.cnblogs.com/Zackzhang/p/10662078.html
Copyright © 2011-2022 走看看