好的,这是我的问题,
我试图弄清楚我将如何能够注册用户使用两个手指在屏幕上制作V(手指起始点将是用户用两个手指触摸的位置,然后通过在移动时传播两个手指使用Unity 3d for android,制作V形 .
我之前从未做过涉及形状的手势,因此我将非常感谢任何有关如何做到这一点的建议,链接或示例
在此先感谢格雷姆
编辑:所以我一直在试图解决这个问题,等待有人帮助我 .
这是我到目前为止所做的,它不是按照我想要的方式工作但是我不确定我做错了什么,因为我之前从未试图做过这样的事情 . 任何帮助都将非常感激
再次感谢格雷姆
using UnityEngine;
使用System.Collections;
公共课Pinchv:MonoBehaviour {
public Vector2 leftFingerStartPosition;
public Vector2 leftFingerEndPosition;
public Vector2 rightFingerStartPosition;
public Vector2 rightFingerEndPosition;
void Update () {
foreach(Touch touch in Input.touches)
{
if(touch.phase == TouchPhase.Began){
Touch leftFinger = Input.GetTouch (0);
Touch rightFinger = Input.GetTouch (1);
leftFingerStartPosition = Input.GetTouch (0).position;
leftFingerEndPosition = Input.GetTouch(0).position;
rightFingerStartPosition = Input.GetTouch(1).position;
rightFingerEndPosition = Input.GetTouch(1).position;
if(Input.touchCount == 2 && Mathf.Abs(leftFingerEndPosition.x + Screen.width - leftFingerStartPosition.x) > 20 &&
Mathf.Abs(leftFingerEndPosition.y + Screen.height - leftFingerStartPosition.y) > 60){
if(Input.touchCount == 2 && Mathf.Abs(rightFingerEndPosition.x + Screen.width - rightFingerStartPosition.x) > 20 &&
Mathf.Abs(rightFingerEndPosition.y + Screen.height - rightFingerStartPosition.y) > 60){
Debug.Log ("its a v ");
}
}
if(touch.phase == TouchPhase.Ended){
leftFingerStartPosition = Vector2.zero;
leftFingerEndPosition = Vector2.zero;
rightFingerStartPosition = Vector2.zero;
rightFingerEndPosition = Vector2.zero;
}
}
}
}
}
EDIT :
所以我接受了你的建议并尝试了不同的东西,但不幸的是它根本不起作用 .
如果我不能解决这个问题,我即将开始拔头发 . 这里是我试图创建的新代码,不起作用可以有人请帮我解决这个问题,它现在让我疯了3天大声笑 .
在Axiom工作室的@Venkat你可以再次帮助我,我将不胜感激:)
耐心等待格雷姆
using UnityEngine;
使用System.Collections;
公共课Pinchv:MonoBehaviour {
public Vector2 fingerOneStartPosition;
public Vector2 fingerOneEndPosition;
public Vector2 fingerTwoStartPosition;
public Vector2 fingerTwoEndPosition;
void Update () {
foreach(Touch touch in Input.touches)
{
if(touch.phase == TouchPhase.Began){
// Touch leftFinger = Input.GetTouch (0);
// Touch rightFinger = Input.GetTouch (1);
fingerOneStartPosition = Input.GetTouch (0).position;
fingerOneEndPosition = Input.GetTouch(0).position;
fingerTwoStartPosition = Input.GetTouch(1).position;
fingerTwoEndPosition = Input.GetTouch(1).position;
if(Input.touchCount == 2 && Mathf.Abs(fingerOneStartPosition.x - fingerOneEndPosition.x) > 700 &&
Mathf.Abs(fingerOneStartPosition.y - fingerOneEndPosition.y) > 120){
if(Input.touchCount == 2 && Mathf.Abs(fingerTwoStartPosition.x - fingerTwoEndPosition.x) > 700 &&
Mathf.Abs(fingerTwoStartPosition.y - fingerTwoEndPosition.y) > 120){
Debug.Log ("its a v ");
}
}
}
if(touch.phase == TouchPhase.Ended){
fingerOneStartPosition = fingerOneEndPosition;
fingerOneEndPosition = Vector2.zero;
fingerTwoStartPosition = fingerTwoEndPosition;
fingerTwoEndPosition = Vector2.zero;
}
}
}
public void OnGUI(){
GUILayout.Label("Where am i fingerone X : " + fingerOneStartPosition + "end position" + fingerOneEndPosition);
GUILayout.Label("Where am i fingerone X : " + fingerTwoStartPosition + "end position" + fingerTwoEndPosition);
}
}
1 回答
@Graeme
好吧,我想出了一些部分hacky代码 . 它绝不是一个很棒的代码,但它应该让你对如何处理问题有一个相当清晰的想法 .
该代码确实有效(使用Moto G 1st Gen,Unity 4.6进行测试),但它仍然会给出一些不正确的结果 .
我已经评论了我看到潜在问题的课程部分,所以你可以用它作为一个不错的起点 .
尝试一下,让我知道 . 肯定有比这个更优雅的解决方案,事实上我几个月前正在为Unity制作一个手势识别库 . 我应该把它弄脏并完成它:P
Unity C# code
The logic behind the code
我假设了以下内容
"V"始终是用两个手指靠近开始绘制的,并且彼此远离 .
当手指彼此远离时,它们在一个轴上以相同方向移动,而在另一个轴上以相反方向移动 . (例如,如果"V"的绘制方式与字母完全相同,则两个手指在正Y轴上移动,一个手指向负X轴移动,另一个手指向正X轴移动)
手指相对靠近在一起,因此两点的平均值可以用作"V"的两个臂相交的点 . (请阅读替代机制的代码)
Lousy attempt at graphically representing my thoughts below