Unity之⼤屏幕多点触控插件
场景初始化,创建⼀个空的场景把对应的Cursors和TouchManger拖⼊到场景中,点击Play运⾏场景,就会出现对应的效果
然后创建⼀个Cube 并在其gameobject上添加两个组件 TransformGesture与Transformer,Transformer负责监听TransformGesture的事件并把响应的事件应⽤到GameObject上,
当然也可以使⽤快捷热键Alt,按住Alt点击物体,然后再次点击物体就会出现第⼆个出点,可以使⽤旋转个缩放效果
下⾯我们开始介绍TouchScript提供的每⼀个Example
第⼀个⽰例场景Camera
Camera.gif
这个例⼦演⽰了如何使⽤
ScreenTransformGesture
Pointer limits
FullscreenLayer
相互作⽤
⽤⼀根⼿指拖动相机
⽤2个⼿指拖动旋转相机
捏缩放
⽤2个⼿指旋转绕Z轴旋转
在这个场景中主要含有 主要逻辑和3个TouchScript组件
1. FullscreenLayer ---在这个图层中,你可以看到所有的 pointers ⽽不需要对场景进⾏任何raycast投射然后将⽬标设置为它所连接的GameObject,在这个例⼦中, FullscreenLayer 通常放在层次结构的底部以捕获所有剩余的pointer,但在本例中,它是唯⼀的层,因为我们对“Touching”任何对象不感兴趣。
我对他的理解为这个FullscreenLayer 只是接受TouchScript射线的⼀个层级,⼀般会把这个层级放在最底层,类似于背景,如果有其他层级在它前⾯会挡住摄像,然后对应的层级处理响应的事件,这个场景中只有这个层级,所以其他物理⽆法接受事件所以不会有操作
2. ScreenTransformGesture 将Transform Type设置为“Translation”并将Limit Pointers限制为1.此⼿势仅识别单指针平移移动。
3. 另⼀个ScreenTransformGesture,它具有Transform Type 设置为Translation、Rotation、Scaling和Limit Pointers to> = 2。该⼿势可识别所有双指针变换。
4. CameraController脚本订阅ScreenTransformGestures并控制相机移动,如下所⽰:
/*
* @author Valentin Simonov / va.lent.in/
* @author Valentin Simonov / va.lent.in/
*/
using UnityEngine;
using TouchScript.Gestures.TransformGestures;
namespace TouchScript.Examples.CameraControl
{
/// <exclude />
public class CameraController : MonoBehaviour
{
public ScreenTransformGesture TwoFingerMoveGesture;
public ScreenTransformGesture ManipulationGesture;
/// <summary>
/// 移动速度
/// </summary>
public float PanSpeed = 200f;
/// <summary>
/// 旋转速度
/// </summary>
public float RotationSpeed = 200f;
/// <summary>
/// 缩放速度
/// </summary>
public float ZoomSpeed = 10f;
private Transform pivot;
private Transform cam;
private void Awake()
{
meta大裁员pivot = transform.Find("Pivot");
cam = transform.Find("Pivot/Camera");
}
private void OnEnable()
{
TwoFingerMoveGesture.Transformed += twoFingerTransformHandler;
ManipulationGesture.Transformed += manipulationTransformedHandler;
}
private void OnDisable()
{
TwoFingerMoveGesture.Transformed -= twoFingerTransformHandler;
ManipulationGesture.Transformed -= manipulationTransformedHandler;
}
/// <summary>
/// 单指事件
/// </summary>
/// <param name="sender"></param>
/// <param name="e"></param>
private void manipulationTransformedHandler(object sender, System.EventArgs e)
{
var rotation = Quaternion.Euler(ManipulationGesture.DeltaPosition.y / Screen.height * RotationSpeed, -ManipulationGesture.DeltaPosition.x / Screen.width * RotationSpeed,
ManipulationGesture.DeltaRotation);
pivot.localRotation *= rotation;
/// <summary>
/// 双指事件
/// </summary>
/// <param name="sender"></param>
/// <param name="e"></param>
private void twoFingerTransformHandler(object sender, System.EventArgs e)
{
{
pivot.localPosition += ation * TwoFingerMoveGesture.DeltaPosition * PanSpeed;
}
}
}
第⼆个⽰例场景Checkers
Checkers
这个例⼦演⽰了如何使⽤
TransformGesture
PinnedTransformGesture
PinnedTransformGesture
OverHelper
StandardLayer
GestureManager.Instance.GlobalGestureDelegate
相互作⽤
拖动⼀个棋⼦来移动它
拖动板来旋转它
按住Space持续禁⽤所有的⼿势,但有⼀个除外(发光棋⼦)
说明
/Scene/Camera GameObject有⼀个StandardLayer 禁⽤了所有选项,但是Hit 3D Objects在Hit test options属性中仅对场景中的3D 对象进⾏光线投射,因为此场景没有任何2D或UI对象。
/Scene/ Board GameObject有两个附件:
1. PinnedTransformGesture 具有Transform Type设置为Rotation与投影到XZ Plane这是地平⾯。这意味着这个gesture会将屏幕pointers投影到这个平⾯上并计算这个平⾯内的所有变换。(平⾯拖拽)
2. Board 脚本监听到PinnedTransformGesture的事件和棋盘的旋转,如下所⽰:
/*
* @author Valentin Simonov / va.lent.in/
*/
using UnityEngine;
using TouchScript.Gestures.TransformGestures;
namespace TouchScript.Examples.Checkers
{
/// <exclude />
public class Board : MonoBehaviour
{
private PinnedTransformGesture gesture;
private void OnEnable()
{
gesture = GetComponent<PinnedTransformGesture>();
gesture.Transformed += transformedHandler;
}
private void OnDisable()
{
gesture.Transformed -= transformedHandler;
}
private void transformedHandler(object sender, System.EventArgs e)
{
transform.localRotation *= Quaternion.AngleAxis(gesture.DeltaRotation, gesture.RotationAxis);
}
}
}
/Scene/Board/Container/CheckerDark GameObjects(棋⼦) 附有以下组件:
1. TransformGesture 具有 Transform Type set to Translation 投影到XZ Plane
2. Transformer 它会监听TransformGesture的事件和移动对象。
3. OverHelper 在指针位于对象上⽅时调度事件。(⼀句话就是判断是否⿏标悬停,插件⾃带)
4. Highlight 显⽰哪些侦听OverHelper事件并更改对象颜⾊。
5. Checker 监听TransformGesture的事件并在此对象上禁⽤或启⽤Rigidbody,⽽实际移动由Transformer组件完成。
/Scene gameobject 具有附加到它的Exclusive组件,它实现了IGestureDelegate接⼝并将它⾃⼰分配给它GestureManager.Instance.GlobalGestureDelegate。当⽤户按下Space此组件时,这个组件阻⽌所有的⼿势开始,除了⽬标gameobject上的那些⼿势:
public bool ShouldReceivePointer(Gesture gesture, Pointer pointer)
{
if (exclusive) return gesture == Target;
Debug.Log("点击到物体");
return true;
}
public bool ShouldBegin(Gesture gesture)
{
if (exclusive) return gesture == Target;
Debug.Log("开始操作物体");
return true;
}
public bool ShouldRecognizeSimultaneously(Gesture first, Gesture second)
{
Debug.Log("ShouldRecognizeSimultaneously");
Debug.Log(first);//打印结果:CheckerLight(TouchScript.Gestures.TransformGestures.TransformGesture)
Debug.Log(second);//打印结果:Board (TouchScript.Gestures.TransformGestures.PinnedTransformGesture)
return false;
}
第三个⽰例场景Color
这个例⼦演⽰了如何使⽤
操作2D对象
Gesture.Cancel()取消⼀个⼿势并将其指针返回给系统。
操作
拖动圆圈。重叠时,它们会产⽣另⼀个组合的圆圈,
⽤两个⼿指来缩放圆圈。
说明
/ Scene / Camera GameObject有⼀个StandardLayer,禁⽤了所有选项,但是Hit 2D Objects在Hit test options属性中仅对场景中的2D对象进⾏raycast 投射,因为此场景没有任何3D或UI对象。
Circle预制件附有以下组件:
1. TransformGesture Transform Type 设置为Everything使⽤户可以移动,缩放和旋转圆(虽然旋转圈并没有真正多⼤意义)。
2. Transformer 它会监听TransformGesture的事件。
3. Circle 其处理圆相交于OnTriggerEnter2D并使⽤该代码来取消当前活动TransformGesture:
GetComponent<TransformGesture>().Cancel(true, true);
(true,true)意味着指针应该返回到系统,就像刚刚按下的那样。此时取消的指针会被新的(更⼤的)圆圈及其TransformGesture捕捉,因此⽤户可以继续移动并调整新圆圈的⼤⼩。
第四个⽰例场景Cube
这个例⼦演⽰了如何使⽤
TouchLayer.Delegate
实现⾃定义输⼊源
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。
发表评论