旋转交互

旋转与拖动

  • 1、初始化
  • 2、设置模式
  • 3、添加需要旋转的节点到回调中

1、初始化

IInteractiveInfoContainer Init(Transform referenceCoordinateSystem, Transform slidingTrigger, TrackInfo trackInfo);

简要说明

初始化。设置旋转或拖动的参考坐标系、触发旋转或拖动的节点。参考坐标系节点与需要旋转或拖动的节点不能是同一个节点。

参数

参数名 类型 说明
referenceCoordinateSystem Transform 参考坐标系
slidingTrigger Transform 触发旋转或拖动的的节点
trackInfo TrackInfo 轨道信息

IInteractiveInfoContainer Init(Func<Vector3> position, Func<Quaternion> rotation, Func<Vector3> scale, Transform slidingTrigger, TrackInfo trackInfo);

简要说明

初始化。设置旋转或拖动的参考坐标系(TRS)、触发旋转或拖动的节点。参考坐标系节点与需要旋转或拖动的节点不能是同一个节点。

参数

参数名 类型 说明
position Func<Vector3> 参考坐标系的位置
rotation Func<Quaternion> 参考坐标系的旋转
scale Func<Vector3> 参考坐标系的缩放
slidingTrigger Transform 触发旋转或拖动的的节点
trackInfo TrackInfo 轨道信息

void Init(Transform slidingTrigger, IInteractiveInfoContainer infoContainer);

简要说明

初始化。用于通过不同的Trigger触发相同的旋转或拖动

参数

参数名 类型 说明
slidingTrigger Transform 触发旋转或拖动的节点
infoContainer IInteractiveInfoContainer 旋转拖动组件
-- CircleTrack
TrackInfo = {
    Range = Vector2(-0.52, 0.52),   -- 旋转范围,弧度制
    -- tip: 绕y轴旋转,可设置:Axis=Vector3.up, InitDirection = Vector3.forward
    -- tip: 绕z轴旋转,可设置:Axis=Vector3.forward, InitDirection = Vector3.right
    -- tip: 绕x轴旋转,可设置:Axis=Vector3.right, InitDirection = Vector3.up
    Axis = Vector3.up,              -- 旋转轴(相对参考系的本地坐标)
    InitDirection = Vector3.left,   -- 起始方向,起始方向处的旋转角度为0,旋转角度的正负判定,使用左手法则
    Radius = 0.2,                   -- 轨道半径,与旋转中心到旋转节点的距离一致(与UI大小相关,保证与实际大小一致)
    Thickness = 0.005               -- 轨道的厚度,与旋转轴方向上的宽度对应
}
-- StraightTrack
TrackInfo = {
    Range = Vector2(-0.52, 0.52),
    Track = Vector3.right,
}

2、旋转回调

IInteractiveInfoContainer

简要说明

获取交互信息的接口

方法

bool GetVector3(InteractiveInfoType type, out Vector3 vector3);         // 获取Vector3类型信息
bool GetVector2(InteractiveInfoType type, out Vector3 vector2);         // 获取Vector2类型信息
bool GetFloat(InteractiveInfoType type, out float f);                   // 获取float类型信息
bool GetQuaternion(InteractiveInfoType type, out Quaternion quaternion);// 获取Quaternion类型信息
bool GetString(InteractiveInfoType type, out string s);                 // 获得String类型信息
bool GetMatrix4x4(InteractiveInfoType type, out Matrix4x4 mat);         // 获得4x4矩阵类型信息

InteractiveInfoType

LocalAxis,                      //【Vector3】:旋转轴(相对设定的参考系)
Axis,                           //【Vector3】:旋转轴(世界坐标系)

InitialDirection,               //【Vector3】:旋转的初始方向或直线拖动的方向(世界坐标系)
InitialLocalDirection,          //【Vector3】:旋转的初始方向或直线拖动的方向(相对设定的参考系)

Position,                       //【Vector3】:虚拟滑块的位置(世界坐标系)
LocalPosition,                  //【Vector3】:虚拟滑块的位置(相对设定的参考系)

InputLocalPosition,             //【Vector3】: 输入(鼠标等)的位置(相对设定的参考系)
InputPosition,                  //【Vector3】: 输入(鼠标等)的位置(世界参考系)

InputStartLocalDirection,       //【Vector3】: 输入起始的位置(相对设定的参考系)
InputStartDirection,            //【Vector3】: 输入起始的位置(世界参考系)

CoordinateSystemPosition,       //【Vector3】: 参考坐标系位置
CoordinateSystemScale,          //【Vector3】: 参考坐标系缩放

CoordinateSystemRotation,       //【Quaternion】: 参考坐标系旋转
Rotation,                       //【Quaternion】: 当前的旋转(世界坐标系)
LocalRotation,                  //【Quaternion】: 当前的旋转(相对设定的参考系)

Increment,                      //【float】: 相对于上一帧增量
ProgressNormalize,              //【float】:进度(归一化)
Progress,                       //【float】:进度
Radius,                         //【float】: 旋转半径
TotalIncrement,                 //【float】: 从开始旋转、拖动到当前的增量

Range,                          //【Vector3】:旋转或拖动范围

BorderState,                    //【String】:边界状态

LocalToWorld,                   //【Matrix4x4】参考系 to 世界
WorldToLocal                    //【Matrix4x4】世界 to 参考系

example

IInteractiveInfoContainer infoContainer;
var b1 = infoContainer.GetFloat(InteractiveInfoType.Progress, out var progress);
var b2 = infoContainer.GetQuaternion(InteractiveInfoType.Rotation, out var rotation);
var b3 = infoContainer.GetVector3(InteractiveInfoType.Axis, out var axis);

void OnValueChange(Action<IInteractiveInfoContainer> e);

简要说明

当拖动或者旋转的值改变时会调用

参数

参数名 类型 说明
e Action<IInteractiveInfoContainer> 回调函数

void SetCallBack(string key, Action<SRInteractiveData> action);

简要说明

设置旋转或拖动过程回调

参数

参数名 类型 说明
key string 类型
action Action<IInteractiveInfoContainer> 回调函数

example

_slideComponent.SetCallBack("mastercontrol0", SlideCallback);

private void SlideCallback(SRInteractiveData data)
{
    switch (data.m_strType)
    {
        case "Slide":
            SlidingAction?.Invoke();
            break;
        case "BeginSlide":
            BeginSlideAction?.Invoke();
            break;
        case "EndSlide":
            EndSlideAction?.Invoke();
            break;
    }
}

3、旋转或拖动某个节点

需要自己实现

旋转

// 参考实现

GameObject rotationNode;
var rotation = rotationNode.AddComponent<RotationExecuteSelf>();
_slideComponent.OnValueChange(rotation.OnValueChange);

public class RotationExecuteSelf : MonoBehaviour
{
    public void OnValueChange(IInteractiveInfoContainer interactiveInfoContainer)
    {
        interactiveInfoContainer.GetQuaternion(InteractiveInfoType.Rotation, out var rotation);
        transform.rotation = rotation;
    }
}

拖动

// 参考实现
GameObject dragNode;
var drag = dragNode.AddComponent<SlidingExecutor>();
_slideComponent.OnValueChange(drag.OnValueChange);

public class SlidingExecutor : MonoBehaviour
{
    public void OnValueChange(IInteractiveInfoContainer interactiveInfoContainer)
    {
        var b = interactiveInfoContainer.GetVector3(InteractiveInfoType.Position, out var position);
        transform.position = position;
    }
}

4、通过代码设置旋转或拖动

void SlideTo(float target)

简要说明

旋转或拖动到指定位置

参数

参数名 类型 说明
target float 目标值(Range区间内的值)

void Slide(float increment)

简要说明

在原先的基础上旋转或拖动一定距离

参数

参数名 类型 说明
increment float 增量

5、参数设置

void ChangeMode(InteractiveTriggerMode interactiveMode);

简要说明

切换模式(默认为None)

参数

参数名 类型 说明
interactiveMode InteractiveTriggerMode 模式
InteractiveTriggerMode
None,
// 【VR CircleTrack】环形移动
CircularMove,
// 【VR StraightTrack】【3D StraightTrack】【3D CircleTrack】单方向移动
LinearMove_Unidirectional,
// 【3D CircleTrack】双方向移动
LinearMove_Bidirectional,
// 【3D CircleTrack】屏幕上环形移动
ScreenCircularMove,
// 【3D CircleTrack】屏幕上单方向移动
ScreenLinearMove_Unidirectional,
// 【3D CircleTrack】屏幕上双方向移动
ScreenLinearMove_Bidirectional,
// 【VR CircleTrack】绕固定轴旋转
FixedAxisRotation
// 旋转使用情况
// 侧面
public void SideMode()
{
    switch (Enum.Parse(typeof(SlideRotationOperationMode), _operationMode))
    {
        case SlideRotationOperationMode.Drag:
            _slideComponent.ChangeMode(InteractiveTriggerMode.ScreenLinearMove_Unidirectional);
            //_slideComponent.ChangeMode(InteractiveTriggerMode.LinearMove_Bidirectional);
            break;
        case SlideRotationOperationMode.Rotation:
        case SlideRotationOperationMode.Rotation_Pointer:
        case SlideRotationOperationMode.Rotation_Entirety:
            if (PlatformUtl.IsPSVR())
            {
                _slideComponent.ChangeMode(InteractiveTriggerMode.FixedAxisRotation);
            }
            else
            {
                _slideComponent.ChangeMode(InteractiveTriggerMode.ScreenLinearMove_Unidirectional);
            }
            break;
        default:
            throw new ArgumentException(" Invalid operation mode");
        }
}

// 正面
public void PositiveMode()
{
    switch (Enum.Parse(typeof(SlideRotationOperationMode), _operationMode))
    {
        case SlideRotationOperationMode.Drag:
             _slideComponent.ChangeMode(InteractiveTriggerMode.CircularMove);
            break;
        case SlideRotationOperationMode.Rotation:
        case SlideRotationOperationMode.Rotation_Pointer:
        case SlideRotationOperationMode.Rotation_Entirety:
            if (PlatformUtl.IsPSVR())
            {
                _slideComponent.ChangeMode(InteractiveTriggerMode.FixedAxisRotation);
            }
            else
            {
                _slideComponent.ChangeMode(InteractiveTriggerMode.CircularMove);
            }
            break;
        default:
            throw new ArgumentException(" Invalid operation mode");
        }
}

void ChangeTrackInfo(TrackInfo trackInfo)

简要说明

修改基础信息

参数

参数名 类型 说明
trackInfo TrackInfo 基本信息

IInteractiveInfoContainer GetInfo()

简要说明

获取信息类

void ModifyDefaultCamera(Camera camera)

简要说明

修改默认相机

6、资源释放

void Release()

简要说明

释放引用与资源

7、启用与禁用

void SetEnableCtrl(bool b)

简要说明

启用与禁用