Table of Contents

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本身的 TransformViewer Scale ,以及子级 TuringDisplayAligner 的属性。
  • Viewer Scale

    • “Viewer Scale”代表了真实世界的单位和虚拟世界的单位之间在比例上的相对差异,如果“Viewer Scale”设置为默认值1,则虚拟世界单位与真实世界单位大小相等。如果将“Viewer Scale”设置为15,则虚拟世界单位大致相当于现实世界中的0.0667。

      1

      1


  • 但是请注意,该比例只与设计时硬件上的实际单位有直接的关系。当应用程序部署到不同的显示大小的硬件上时,将额外考虑一个称为“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是可选的,如果不需要它提供的功能,则可以将其删除。

    3

    4

  • Override Angle
    • 通过启用Override Angle, TuringFrame 将模拟TuringDisplayAligner 的角度属性中设置的数值。
  • Clamp Angle
    • 通过启用Clamp Angle,然后将 Min AngleMax 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是 TuringMouseTuringStylus 的基类

  • 在Scene视图中绘制诊断信息

    5

  • 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值决定从射线发射的位置有多少线段保持直线。

    6
  • 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上