监听On_Drag需要注意一下三点:
Enable auto-select,[勾选].
3d物体时能被触摸识别pickable layers 3D ,[设置需要的层级].
能够被触摸识别的3d物体层级-
相机Camera,[一定要设置],界面或代码设置皆可.
EasyTouch.AddCamera(_camera); EasyTouch.RemoveCamera(_camera);
On_Drag监听:
EasyTouch.On_Drag += FurnitureTrigger.Instance.OnDrag;
EasyTouch.On_Drag -= FurnitureTrigger.Instance.OnDrag;
public void OnDrag(Gesture gesture)
{
if (gesture.touchCount > 1 || gesture.pickedObject == null)
{
return;
}
}
注意事项解析:
private void CreateGesture(int touchIndex,EvtType message,Finger finger, SwipeDirection swipe, float swipeLength, Vector2 swipeVector)
{
...
// Auto update picked object
if (autoUpdatePickedObject && autoSelect){
if (message != EvtType.On_Drag && message != EvtType.On_DragEnd && message != EvtType.On_DragStart){
if (GetPickedGameObject(finger)){
gesture.pickedObject = pickedObject.pickedObj;
gesture.pickedCamera = pickedObject.pickedCamera;
gesture.isGuiCamera = pickedObject.isGUI;
}
else{
gesture.pickedObject = null;
gesture.pickedCamera = null;
gesture.isGuiCamera = false;
}
}
}
...
}
为什么要设置相机Camera和pickable layers?
在GetPickedGameObject中判断touchCameras.Count数量以及是否有有效的touchCameras
touchCameras[i].camera!=null && touchCameras[i].camera.enabled
在GetGameObjectAt中
Physics.Raycast( ray, out hit,float.MaxValue,mask )
射线检测mask层 (pickable layers,LayerMask mask = pickableLayers3D;
),获取并设置pickedObjpickedObject.pickedObj = hit.collider.gameObject
在OneFinger中,若pickedObject 存在,则说明是Drag(If an object is selected we drag);否则是Swipe。
if (fingers[fingerIndex].pickedObject){ fingers[fingerIndex].gesture = GestureType.Drag;}
private bool GetPickedGameObject(Finger finger, bool isTowFinger=false){
...
if (touchCameras.Count>0){
for (int i=0;i<touchCameras.Count;i++){
if (touchCameras[i].camera!=null && touchCameras[i].camera.enabled){
Vector2 pos=Vector2.zero;
if (!isTowFinger){
pos = finger.position;
}
else{
pos = twoFinger.position;
}
if (GetGameObjectAt( pos, touchCameras[i].camera,touchCameras[i].guiCamera)){
return true;
}
}
}
}
else{
Debug.LogWarning("No camera is assigned to EasyTouch");
}
return false;
}
private bool GetGameObjectAt(Vector2 position, Camera cam, bool isGuiCam){
Ray ray = cam.ScreenPointToRay( position );
RaycastHit hit;
if (enable2D){
LayerMask mask2d = pickableLayers2D;
RaycastHit2D[] hit2D = new RaycastHit2D[1];
if (Physics2D.GetRayIntersectionNonAlloc( ray,hit2D,float.PositiveInfinity,mask2d)>0){
pickedObject.pickedCamera = cam;
pickedObject.isGUI = isGuiCam;
pickedObject.pickedObj = hit2D[0].collider.gameObject;
return true;
}
}
LayerMask mask = pickableLayers3D;
if( Physics.Raycast( ray, out hit,float.MaxValue,mask ) ){
pickedObject.pickedCamera = cam;
pickedObject.isGUI =isGuiCam;
pickedObject.pickedObj = hit.collider.gameObject;
return true;
}
return false;
}
private void OneFinger(int fingerIndex){
...
// If an object is selected we drag
if (fingers[fingerIndex].pickedObject){
fingers[fingerIndex].gesture = GestureType.Drag;
}
...
}