说在前面,我现在的项目使用TouchScript 是因为突然改需求要用触摸屏。原本TouchScript的功能根本不能满足项目用。
网上找到大部分教学都没有说怎么用Script写其他功能,所以只能一步一脚印研究了。
首先,没有看懂TouchScript的可以看看这个大大的说明。
TouchScript中文—Gestures - Arcobaleno - CSDN博客
然后我来说说Demo里的坑
CameraController 里边有一个问题,就是“一指”和“两指”用同一个Gesture,而且附在同一个GameObject上,这导致了后面第二个坑:
如果你把这两个ScreenTransformGesture改成none再重新附加,会发现其中一个Gesture失效,原来附加时是自动把该GameObject 里第一个符合条件的加进去,所以你在附加了第一个后,要先把下面的ScreenTransformGesture Move up 才可以加进去(令人智熄),而且有时候调试出bug也不知道是不是这个导致,常常因为这个浪费了时间。
在twoFingerTransformHandler这个名字的响应方法里实际执行的是“一指”操作,而manipulationTransformedHandler响应方法才是“两指”操作。这个在我改脚本时卡了很久。。。
下面这个是我在Demo Script上修改后的结果
因为之前以为这个很简单,直接放到项目里再改,结果一直失败。这次我先试试在Demo上面改,这个是修改并成功运行的结果。
在Rotation上我加入了限制,使其上下限制在一个角度里。
(后来搬到项目时我发现这样子转动会导致镜头水平倾斜,这是后话。)
然后缩放上我改成了用镜头的FieldOfView数值。
这个其实并不是什么坑,这是写下来防止以后不记得。
Multiuser这个Demo不是用RawImage来分屏,而是用Camera的Depth跟ViewPoint的XYWH控制,然后只要加入FullScreen Layer就行。用RawImage也要同样做法,最好把RawImage调成屏幕大小,然后改Camera ViewPoint的XYWH来控制大小,最后记得,记得,把RawImage的Raycast Target关闭。
================================================================
本来以为我后面会很顺利,结果。。。
搬到项目后,由于MoveGesture和RotateGesture是用在两个镜头中,而ZoomGesture是两个镜头都用到,所以得分开他们,然后我现在无论怎么搞,MoveGesture、RotateGesture和ZoomGesture中只能同时有一个能用,怎么搞也不行。
这才是最让人头疼的地方,Gesture他们独立都有效果,也有各自加入对方的Friendly Gesture List,但无论怎么搞,每次都只有一个Gesture运作。
我发现是自己代码逻辑的问题 我以为是,已解决。 并没有解决
另外RotateGesture明明是“一指”操作的,有时“一指”没有效果,这时候用“两指”操作才有效果,但放开手以后只能“一指”操作,“两指”操作无效。
后来不知咋的就没事了。
MoveGesture出来效果是上下垂直动,只有右键一下才能水平移动
我感觉是ManipulationGesture.DeltaScale
的问题,因为代码里只有它是动态的。
cam.transform.localPosition += Vector3.forward*(ManipulationGesture.DeltaScale - 1f)*ZoomSpeed;
================================================================
19 /11
现在我复制一份CameraController.cs 重新把我要的功能改写进去,终于没有两个Gesture不能同时用的问题了。我将MoveGesture 和 RotateGesture 放到同一个Void 内,用 if else 分开。
MoveGesture 部分暂不开放,因为没有时间排查是不是有什么响应了右键。
Zoom和Rotation 用了项目原有的逻辑,大概解决了问题。
float xDeg;
float yDeg;
private void OneFingerHandler(object sender, System.EventArgs e)
{
/*
var rotation = Quaternion.Euler(OneFingerGesture.DeltaPosition.y/Screen.height*RotationSpeed,
-OneFingerGesture.DeltaPosition.x/Screen.width*RotationSpeed,
OneFingerGesture.DeltaRotation);
pivot.localRotation *= rotation;
*/
if(rotationFlag != 0)
{
if (m_isFirstRotation)
{
m_isFirstRotation = false;
xDeg = Vector3.Angle(Vector3.right, pivot.right);
yDeg = Vector3.Angle(Vector3.up, pivot.up);
}
xDeg += (OneFingerGesture.DeltaPosition.x / Screen.width) * RotationSpeed;
yDeg -= (OneFingerGesture.DeltaPosition.y / Screen.height) * RotationSpeed / 2;
//Clamp the vertical axis for the orbit
yDeg = Mathf.Clamp(yDeg, yMinLimit, yMaxLimit);
pivot.rotation = Quaternion.Euler(yDeg, xDeg, 0);
}
else
{
//Zoom Gesture
}
}
private void Update()
{
if (Input.mouseScrollDelta.y != 0 && !Input.GetMouseButton(0) && !Input.GetMouseButton(1))
{
m_slider.value += Input.mouseScrollDelta.y;
OnSliderValueChanged(m_slider.value);
}
}
private void TwoFingerHandler(object sender, System.EventArgs e)
{
m_slider.value += (TwoFingerGesture.DeltaScale - 1f) * ZoomSpeed;
OnSliderValueChanged(m_slider.value);
}
public void OnSliderValueChanged(float value)
{
m_fieldOfView =
(value / 3) * (m_maxFieldOfView - m_minFieldOfView) + m_minFieldOfView;
cam.fieldOfView = m_fieldOfView;
IBMessenger.Broadcast(IBStrings.IB_STRING_FIELD_OF_VIEW_CHANGED);
Build出来后发现另一个问题,无法点击其他UGUI(例如Button、Slider之类)
原来是因为我没有加入Standard Layer,加了就可以用了。
这样,就可以告一段落了
ヾ( ̄▽ ̄)Bye~Bye~