做3d还是要用Unity,以前按照教程来确实做出了点东西,这次出了些问题,记录一下。
不使用Hololens ToolKit开发简单的项目。
环境:Unity5.6.0.3,操作系统win10(10586)
教程:http://forum.china.unity3d.com/thread-19911-1-1.html
1.不设置摄像头,仅仅添加一个球体,生成c#项目。
2.c#项目运行 生成设置是release,x86,hololens。出现问题:
严重性 代码 说明 项目 文件 行 禁止显示状态
错误 命令“"D:\SoftwareProjects\Hololens\UnityProjects\NoToolkit\NoToolkit\bin\Unity\Tools\AssemblyConverter.exe" -platform=uap -lock="D:\SoftwareProjects\Hololens\UnityProjects\NoToolkit\NoToolkit\bin\NoToolkit\project.lock.json" -bits=32 -configuration=Release -removeDebuggableAttribute=False -uwpsdk=10.0.10586.0 -path="." -path="C:\Program Files\Unity5.6\Editor\Data\PlaybackEngines\MetroSupport\Players\UAP\dotnet\x86\Release" "D:\SoftwareProjects\Hololens\UnityProjects\NoToolkit\NoToolkit\bin\NoToolkit\Assembly-CSharp.dll" "D:\SoftwareProjects\Hololens\UnityProjects\NoToolkit\NoToolkit\bin\NoToolkit\Assembly-CSharp-firstpass.dll" "D:\SoftwareProjects\Hololens\UnityProjects\NoToolkit\NoToolkit\bin\NoToolkit\UnityEngine.dll" "D:\SoftwareProjects\Hololens\UnityProjects\NoToolkit\NoToolkit\bin\NoToolkit\nunit.framework.dll" "D:\SoftwareProjects\Hololens\UnityProjects\NoToolkit\NoToolkit\bin\NoToolkit\UnityEngine.UI.dll" "D:\SoftwareProjects\Hololens\UnityProjects\NoToolkit\NoToolkit\bin\NoToolkit\UnityEngine.HoloLens.dll" "D:\SoftwareProjects\Hololens\UnityProjects\NoToolkit\NoToolkit\bin\NoToolkit\UnityEngine.Networking.dll" "D:\SoftwareProjects\Hololens\UnityProjects\NoToolkit\NoToolkit\bin\NoToolkit\UnityEngine.VR.dll"”已退出,代码为 1。 NoToolkit D:\SoftwareProjects\Hololens\UnityProjects\NoToolkit\NoToolkit\bin\NoToolkit\NoToolkit.csproj 276
也就是AssemblyConvert.exe运行有问题。
1.改成Device也一样,也就是是项目的问题,不是模拟器的问题。
搜索了一下 Unity AssemblyConvert.exe,找到原因:是VS2017不兼容的问题,VS2015没问题,而且是 Visual Studio 2017 (15.2)没问题, Visual Studio 2017 (15.3)就有问题。也就是说应该是unity5.6对应vs2015,unity2017对应vs2017吗?
地址:https://stackoverflow.com/questions/45877765/hololens-build-failing-the-command-assemblyconverter-exe-exited-with-code-1
好了,接下来是运行结果:和在Unity中看到的一样,一个小球在视野中间,小球的位置感觉和程序刚运行时头盔朝哪有关,应该 是正前方的中间吧。因为没有设置摄像机,天空盒子还在,会妨碍到现实 的视野。
好了,可以做各种实验了,不能光按照教程的正确的做法去做。
一、关于生成设置
1. Release x86 Device(实际设备)和Hololens(模拟器)。可以,没问题。
2.Release x64 不行,也就是Hololens是32位操作系统。
Severity Code Description Project File Line Suppression State
Error DEP3311 : Unable to deploy an x64 package to an x86 device. Change the build configuration to x86 or Neutral, or attach an x64 device. NoToolkit
3.Release ARM也一样不行,当然的,但是刚打开项目是默认是ARM啊,为什么??
Severity Code Description Project File Line Suppression State
Error DEP3314 : Unable to deploy an ARM package to an x86 device. Change the build configuration to x86 or Neutral, or attach an ARM device. NoToolkit
4.Debug
x86 Device(实际设备)和Hololens(模拟器)。可以,没问题。
二、关于项目内容
因为项目中什么都没有,这就是是项目的内容了,后续实验看看会对这些目录怎么造成影响。
如果生成时"Unity c# Projects"没有勾选
结果就没有Assembly-CSharp和Assembly-CSharp-firstpass项目
相应的Unprocessed文件夹中就多了Assembly-CSharp.dll,
当然一般是要选中c# projects的,不然生成后就没有地方可以改代码了。
App类:
定义:class App : IFrameworkView, IFrameworkViewSource
作用:代码应该程序本身。
实际上从这里可以看出Unity生成的项目是一个HolographicApp,就是之前我说用C++开发D3D的那种项目类型。
稍微比较一下
和HolographicApp的比较:
Program,AppView,AppViewSource合并成了一个App类,入口为App.Main()->后面还是一样CoreApplicate.Run()。
class App : IFrameworkView, IFrameworkViewSource
{
private WinRTBridge.WinRTBridge m_Bridge;
private AppCallbacks m_AppCallbacks;
public App()
{
SetupOrientation();
m_AppCallbacks = new AppCallbacks();
// Allow clients of this class to append their own callbacks.
AddAppCallbacks(m_AppCallbacks);
}
所有的内容都封装到AppCallbacks中了,Run()也只是调用AppCallbacks的Run()。应该是在AppCallbacks中响应原来的D3D事件并切换到Unity本事脚本的生命周期函数中,最直接的就是在Run()中运行所有脚本的Update()函数吧。
接下来测试添加各种资源后的效果
1.添加一个选择的Cube,添加用于旋转的脚本Spinning。
重新打包后在Assembly-CSharp项目中多个个Spinning.cs的快捷方式文件,指向原来的Asset中的脚本。
这种方式我也用过,为了共享代码。
2.添加UI,三个Canvas,一个世界坐标,一个UI坐标,一个Camara坐标(MainCamera)。
世界坐标的能看到,和模型一样固定在世界坐标中。
UI坐标的看不到。
Camara坐标能够看到,并且一直在摄像机前,头部移动也跟着移动,不像世界坐标的界面是和模型一样固定死的。类似于hololen本身的主菜单。
3.添加一个Cube到摄像机的子物体。
Cube也和Camera坐标的Canvas一样,跟着摄像头移动,不同的是它能和其他三维物体的造成影响,如阴影投射到其他物体上面,碰撞之类的操作也可以吧。有个问题是头部不可能完全不动这样的话这些子物体也会抖动,这种设置没有实际用处吧。应该是通过代码到达相似的效果吧,至少知道主摄像机其实就是头部了,比较复杂一点的多摄像机切换之类的以后再测试。
4.添加JavaScript脚本,打包后就没了,不论是否添加到场景中。是否能造成影响没测试。
5.添加其他Create中的材质啊,预设啊,也都没有看到。
6.创建一个UWP的类库ClassLibrary1,生成到Plugins文件夹中,打包后Assembly-CSharp中会添加对ClassLibrary1的引用。
7.在Resouces文件夹中添加Data.txt和Xml.xml文件,打包后没看到文件。接下来尝试用代码读取。