“两个屏幕,一个主屏幕(显示器),一个投影屏幕(地幕投影或者墙面投影)。可以触控投影屏幕来与主屏幕做交互”
编辑器:Unity(2018.1.2f1 (64-bit))(编辑游戏场景实现整个游戏逻辑)
插件:TouchScript(9.0)(使用其TUIO协议实现投影交互)
分屏其实很简单,Unity官方就有Multi-display功能,最多支持1-8个显示器。官方文档:地址
在这里我只做两个显示器的分屏显示。
必要基础配置:两个Game视图,两个Camera,两个Canvas。
1.Game视图配置
添加一个新的Game视图
然后进行分辨率设置,我的设置是主屏(Display1)为(1920x1080),分屏(Display2)为(1024x768)
2.Camera相机设置
场景自带一个Main Camera(主屏相机),然后再新建一个相机改名为Less Camera(分屏相机)
之后设置相机的Target Display,对应的是Game视图里的Display
Main Camera设置成Display1,Less Camera设置成Display2
3.Canvas画布设置
新建两个画布CanvasMain和CanvasLess
Render Mode设置为Screen Space-Overlay
Target Display设置为对应的Display CanvasMain为Display1。CanvasLess为Display2。
UI Scale Mode设置为Scale With Screen Size
Reference Resolution设置对应的分辨率 CanvasMain为1920 x 1080。CanvasLess为1024 x 768。
4.激活双屏
配置都好了之后最后一步就差激活了。
激活方式很简单,就一段代码。
private void Awake()
{
if (Display.displays.Length > 1)
{
//激活分屏并设置分辨率为1024,768
Display.displays[1].Activate(1024, 768, 60);
}
}
之后打包发布到windos,如果电脑接了两个显示器,自然能看到效果了。
投影互动功能其实分为两步
1.我们在投影内操作的时候,如何去接收投影中的操作。
2.我们在得到投影内的反馈后,如何根据反馈去调用我们应用中的按钮,或者说逻辑。(这块比较复杂,我会贴出一个链接,详细讲解)
举个栗子:我们现在有一个投影映射在地面上,然后投影内有一个按钮,现在把脚放在了这个按钮上面,那么怎么知道我的脚是放在了这个按钮上呢。
好,对于这个操作。我们现在就把他分为两步来解析。
第一:我们要知道我们的脚已经放入了投影当中。
这里要用到一个技术设备:雷达(至于牌子型号由于一些原因不能相告,抱歉。)我们会在地面投影的前方摆设一个雷达,这个雷达一直在360度的转圈扫描,然后把扫描到的物体反馈给我们。但我们需要的其实只有投影区域那一块,所以中间做了一些逻辑,让雷达最终只反馈存在与投影区域中的物体,然后以坐标(0,0)到(1,1)的形式给我们。
第二:我们要知道我们的脚放在了投影中的那个按钮上。
因为第一步我们已经得到了脚的反馈,那么第二步我们要做的就是如何知道这个反馈正好反馈在了我们的按钮上。
在这里我只简单说一下逻辑,更详细的算法和使用方法会贴在后面的链接中。
因为我们已经得到了坐标(x,y),由于这个坐标系是0-1的。们还要进行一次转换,假设地面投影的分辨率是1024X768,那么我们就要把这个坐标转换为1024x768坐标系中的坐标。这样我们就得到了一个有实际值的坐标。接下来是我们的按钮,我们的按钮也存在与1024X768这个坐标系中,然后我们只需要拿到这个按钮的坐标和它的大小,就可以算出他所存在的范围。最后我们拿着我们的脚的坐标和这个范围去进行比较,如果坐标在范围内。那么我们就视为我们的脚踩住了按钮。
好了这里只是一个简单的想法逻辑,但具体的实现过程还是稍微有些复杂的。中间还运用到了TouchScript中的TUIO协议。如果想深入了解的朋友可以看看我贴在后面的链接,里面有一些使用方式的讲解,包括源码也贴出来了。感兴趣的小伙伴可以自己研究研究。
我文档是写在markdown上面的,链接在这:https://www.zybuluo.com/ts541933433/note/1229033。
这篇文档由于时间原因我写的比较仓促,写得不好的地方还请多多包涵,谢谢(*^_^*)