API参考
TuringProvider
- TuringProvider的作用是处理本机插件实例的状态,并与现在发布的 GameObjects 进行协调。这是必须在场景中保持存在的最基本的对象。
- TuringProvider的 Inspector 字段包含一个可配置的属性。
Display Reference Profile
Size 15 FHD
Size 27 UHD
Size 27 FHD
- Turing 3D Core中部分常用对象可以通过TuringProvider获得,方便开发过程中的调用
TuringProvider.TuringCamera.Camera;
TuringProvider.CurrentFrame.WorldPosition;
TuringProvider.ViewerScale;
TuringProvider.DisplaySize;
TuringProvider.StylusTarget.SetBlueColor(true); TuringProvider.StylusTarget.StartVibration(TuringInput.VibrationIntensity.low);
- 由于显示器有不同的显示尺寸,这就意味着“ Viewer Scale ”需要进行补偿,以确保3D场景和UI按比例缩放正常显示,通过“ Display Reference Profile ”可以处理参考显示尺寸和运行时显示尺寸之间的尺寸差异。
TuringCameraRig
TuringFrame
- TuringFrame可以视为TuringCameraRig的父级,将TuringCameraRig的 Inspector 公共字段Frame分配上不同的TuringFrame,达到类似于更改普通场景中的活动相机的效果。相机将采用TuringFrame本身的 Transform 和 Viewer Scale ,以及子级 TuringDisplayAligner 的属性。
Viewer Scale
“Viewer Scale”代表了真实世界的单位和虚拟世界的单位之间在比例上的相对差异,如果“Viewer Scale”设置为默认值1,则虚拟世界单位与真实世界单位大小相等。如果将“Viewer Scale”设置为15,则虚拟世界单位大致相当于现实世界中的0.0667。
- 但是请注意,该比例只与设计时硬件上的实际单位有直接的关系。当应用程序部署到不同的显示大小的硬件上时,将额外考虑一个称为“Display Scale Factor”的值,以确保场景相对于所查看的显示器保持相对比例。
realWorldObject.transform.scale = designTimeScale * TuringProvider.DisplayScaleFactor;
TuringFrame
- TuringFrame可以视为 TuringCameraRig 的父级,虽然一个场景中只能有一个TuringCameraRig,但是可以有多个TuringFrames。将TuringCameraRig的inspector公共字段Frame分配上不同的TuringFrame,达到类似于更改普通场景中的活动相机的效果。
- 如果TuringCameraRig已经分配了TuringFrame,则会覆盖TuringCameraRig自身的“ Viewer Scale ”值。
TuringDisplayAligner
TuringDisplayAligner用于连接一体机内置的陀螺仪传感器,这个陀螺仪用于应用程序匹配虚拟场景中视框的x轴俯仰角度。
TuringDisplayAligner是 TuringFrame 的唯一子级,尽管在将TuringFrame添加到场景时默认情况下会添加 TuringDisplayAligner ,但TuringDisplayAligner是可选的,如果不需要它提供的功能,则可以将其删除。
- Override Angle
- 通过启用Override Angle, TuringFrame 将模拟TuringDisplayAligner 的角度属性中设置的数值。
- Clamp Angle
- 通过启用Clamp Angle,然后将 Min Angle 和 Max Angle 设置为所需的数值,可以人为的限制最大和最小的x轴俯仰角度范围。
- Pivot
- 将Pivot设置为0时,视框的旋转中心轴将在底部边缘,设置为0.5时,视框的旋转中心轴在中心,设置为1时,视框的旋转中心轴将在顶部边缘。
TuringFrame示例场景
名为 03_TuringCameraRig_TuringFrame 的示例场景演示了 TuringFrame 和子级 TuringDisplayAligner 的多种配置。
运行后点击出现的按钮触发不同配置的效果
Default
Viewer Scale 设置为通用设置,显示角度范围在0到90度之间
Small
Viewer Scale 设置为3.6
Big
Viewer Scale 设置为20
Rotating
由脚本控制视角旋转,启用了 Override Angle 并且显示器的动态角度固定为90度
FreeAngle
没有任何角度限制,显示器可以任何角度放置
StrictClamp
显示角度范围在45至65度之间
TuringCamera
Enable Stereo
启动或禁用立体渲染 在使用时也可以通过此处进行3D与2D的切换,注意默认必须勾选才能进行2D与3D切换
Stereo To Mono Delay
未跟踪到眼睛时,指定秒数后关闭立体渲染
Stereo To Mono Duration
立体渲染关闭过渡的时间
Mono To Stereo Duration
立体渲染开启过度时间
DebugMode开启此模式后系统运行信息会以log的形式显示在Console中
ShowGizmos 是否在Scene试图中绘制负视差,零视差,正视差
TuringPointer(TuringMouse和TuringStylus)
TuringPointer是 TuringMouse 和 TuringStylus 的基类
在Scene视图中绘制诊断信息
Event Camera
必须将其设置为激活的TuringCamera
Visualization
指定一个继承至 TuringPointerVisualization 的可视化对象,TuringStylus默认的可视化对象是蓝色光束,TuringMouse默认的可视化对象是模仿Windows默认光标的图像。
Max Hit Distance
TuringPointer能够接触前方对象的最大距离,不受Viewer Scale值的影响。
名称为 05_TuringPointer_MaxHitDistance 的场景演示了该值的实际作用。
Max Hit Radius
如果该值为0,则TuringPointer将只检查与延伸到最大击中距离的射线相交的对象。如果该值大于0,TuringPointer将另外检查围绕该射线的圆柱体积范围内的对象。
名称为06_TuringPointer_MaxHitRadius的场景演示了该值的实际作用。
Caution
注意:Max Hit Radius对UI元素的交互没有影响。
Ignore Mask
指定给此遮罩中包含的层的对象将不会与TuringPointer交互。
名称为 07_TuringPointer_IgnoreMask 的场景演示了该功能。
Priority Mask
当指定了Priority Mask时,TuringPointer的射线半径相交的对象优先级要高于射线直接相交的对象。
名称为 08_TuringPointer_PriorityMask 的场景演示了该功能。
Default Collision Plane
此属性指定TuringPointerVisualization在Max Hit Distance范围内没有可碰撞物体时的结束位置。对于TuringStylus,默认值是None,这意味着蓝色光束在最大距离处结束。对于TuringMouse,默认值为Screen,意味着当没有可碰撞物体时,光标将返回到屏幕平面位置。
Drag Policies
Drag Policies规定了开始拖动时TuringPointer端点显示的行为。可以在TuringPointer的公共属性中设置,也可以通过继承至TuringPointerInteractable的可拖动物体对象来设置。
TuringPointer.DragPolicy 拖拽策略
- 拖拽策略规定了物体在被拖动时的运动行为。可以在TuringPointer的Inspector设置,也可以通过继承TuringPointerInteractable并重写GetDragPolicy指定行为。
public class Draggable :
TuringPointerInteractable, IBeginDragHandler, IDragHandler, IEndDragHandler
{
////////////////////////////////////////////////////////////////////////
// Public Methods
////////////////////////////////////////////////////////////////////////
public override TuringPointer.DragPolicy GetDragPolicy(TuringPointer pointer)
{
if (pointer is TuringMouse)
{
return TuringPointer.DragPolicy.LockToScreenAlignedPlane;
}
if (pointer is TuringStylus)
{
return TuringPointer.DragPolicy.LockHitPosition;
}
return base.GetDragPolicy(pointer);
}
......
}
拖拽策略枚举 DragPolicy
DragPolicy.None
物体跟随拖拽末端运动,如果射线经过更近的碰撞器,射线长度会缩短到更近的碰撞器上。
DragPolicy.LockHitPosition
固定到命中时的射线长度,所以物体运动轨迹是圆形。
DragPolicy.LockToSurfaceAlignedPlane
锁定到以命中点位置及法线构成平面,射线长度会自动修改。
DragPolicy.LockToScreenAlignedPlane
锁定到与屏幕表面平行,即UI所在的表面。
DragPolicy.LockToCustomPlane
锁定自定义表面,需要继承TuringPointerInteractable的GetDragPlane函数,否则退回到默认拖拽策略,参考示例场景 10_TuringPointer_CustomDragPlane
TuringStylusBeam
TuringStylusBeam是TuringStylus默认的TuringPointerVisualization可视化对象。
Curve Start Pivot
在关联的TuringStylus上设置大于0的Max Hit Radius时,光束将变成曲线指向碰撞的对象,Curve Start Pivot值决定从射线发射的位置有多少线段保持直线。
End Point Smooth Time
曲线线段动画过渡时间
Turing Stylus
可以通过以下几种方法对笔的LED灯颜色及震动力度和时长进行控制
public void SetRedColor(bool isOn) { if (_target != null) { _target.SetRedColor(isOn); } } public void SetBlueColor(bool isOn) { if (_target != null) { _target.SetBlueColor(isOn); } } public void StartVibration(VibrationIntensity intensity, float duration = 0.2f) { if (_target != null) { _target.StartVibration(intensity, duration); } } public void StartVibration(int intensity, float duration = 0.2f) { if (_target != null) { _target.StartVibration(intensity, duration); } }
TuringMouseCursor
TuringMouseCursor是TuringMouse默认的TuringPointerVisualization可视化对象。
Flip Duration
该属性用于设置光标在不同平面上时,光标翻转到新方向的速度。
Snap Duration
Snap Duration决定了光标过渡到不同交互对象时的速度。
IPointerHandlers
- Unity的事件系统提供了各种接口来处理输入事件:IPointerEnterHandler
- IPointerExitHandler
- IPointerDownHandler
- IPointerUpHandler
- IPointerClickHandler
- 通常,这些事件用于UI,但是新的ZInputHandler扩展了UnityStandaloneInputHandler,将这些事件转发给3D GameObject。
- 这个脚本例子可以附加到任何带有碰撞体的3D GameObject。
using UnityEngine;
using UnityEngine.EventSystems;
public class ClickLogger : MonoBehaviour, IPointerClickHandler
{
public void OnPointerClick(PointerEventData eventData)
{
Debug.Log("The object or a child has been clicked");
}
}
- 名称为04_IPointerHandlers的场景演示了该功能。
TuringPointer按钮状态
- 在Update中可以轮询按钮状态 TuringStylus ;
private void Start()
{
stylus = GameObject.FindObjectOfType<TuringStylus>();
}
private void Update()
{
// check if a button is presently held down on any given update frame
bool buttonPressed_0 = stylus.GetButton(0);
bool buttonPressed_1 = stylus.GetButton(1);
bool buttonPressed_2 = stylus.GetButton(2);
// check if a button was pressed on this frame
bool buttonDown_0 = stylus.GetButtonDown(0);
bool buttonDown_1 = stylus.GetButtonDown(1);
bool buttonDown_2 = stylus.GetButtonDown(2);
// check if a button was released on this frame
bool buttonUp_0 = stylus.GetButtonUp(0);
bool buttonUp_1 = stylus.GetButtonUp(1);
bool buttonUp_2 = stylus.GetButtonUp(2);
}
- 还可以注册按钮事件TuringStylus;
private void Start()
{
stylus = GameObject.FindObjectOfType<TuringStylus>();
stylus.OnButtonPressed += HandleButtonPressed;
stylus.OnButtonReleased += HandleButtonReleased;
}
private void HandleButtonPressed(TuringPointer pointer, int button)
{
Debug.Log("Button Pressed: " + button);
}
private void HandleButtonReleased(TuringPointer pointer, int button)
{
Debug.Log("Button Released: " + button);
}
TuringCanvasScaler
- 该组件替代默认附加到Canvas的CanvasScaler组件。
TuringGraphicRaycaster
- 该组件替代默认附加到Canvas的GraphicRaycaster组件,用于支持TuringPointers与UI元素进行交互。
TuringInputModule
- 该组件替代默认附加到EventSystem的StandaloneInputModule组件,用于支持TuringPointers。
TuringTouch
该组件实现的屏幕触摸相关逻辑的输入支持,如果需要使用触摸功能,可在场景中创建TuringTouch组件。
TuringCamera Quit
通过TuringCamera.Quit()可以解决退出应用后3D屏幕需要等待一会才能切回2D的问题。
后期处理
编辑Post Processing脚本
取消TuringCamera中的 #define POSTPROCESSING注释
将Post Processing脚本复制到LeftCamera和RightCamera上