UI多点触控架构?

时间:2015-11-18 11:11:02

标签: c# unity3d multi-touch

我正在开发一款带有多点触控控制器的游戏。但我对UI Image多点触摸有问题

我想创建这个架构。

I want to create this architecture

  • Green Cycles将作为按钮使用。 (触摸结束)

  • 红色循环将作为按钮工作。我需要触摸移动或触摸停留事件以进行连续拍摄。 (触摸移动|触摸住)

  • Yellow Box将用作触摸板(UI图像元素)。当手指在盒子上方移动时,它将触发旋转方法。

我尝试了一些方法,但都失败了。

我创建了一个名为MultiTouchElement的类。

var touches = Input.touches;
for (int i = 0; i < touches.Count; i++)
{
    Touch touch = Input.GetTouch(i);
    TouchPhase phase = touch.phase;

    PointerEventData eventDataCurrentPosition = new PointerEventData(EventSystem.current);
    eventDataCurrentPosition.position = touch.position;

    List<RaycastResult> results = new List<RaycastResult>();
    EventSystem.current.RaycastAll(eventDataCurrentPosition, results);

    var touchOnThisObject = results.Any(x => x.gameObject.name.ToLower() == this.gameObject.name.ToLower());
    if (!touchOnThisObject)
        return;

    if (phase == TouchPhase.Began)
    {
        this.GetComponent<Image>().color = Color.red;
    }
    if (phase == TouchPhase.Ended)
    {
        this.GetComponent<Image>().color = Color.blue;
    }
}

我的架构是否有任何教程?

1 个答案:

答案 0 :(得分:0)

我找到了解决方案:)

谢谢Bro @IsGreen

来源:http://forum.unity3d.com/threads/solved-raycast-multitouch-input-convert-local-recttransform-rect-to-screen-position.318115/

using UnityEngine;
using UnityEngine.UI;
using UnityEngine.EventSystems;
using System.Collections.Generic;

public class UImageRayCast : MonoBehaviour
{
Image image;
Color colorOn, colorOff;

void Start()
{
    this.image = this.GetComponent<Image>();
    this.colorOff = this.image.color;
    this.colorOn = new Color(this.colorOff.r, this.colorOff.g, this.colorOff.b, this.colorOff.a * 0.5f);
}

void Update()
{

    this.image.color = this.colorOff;

    PointerEventData pointer = new PointerEventData(EventSystem.current);
    List<RaycastResult> raycastResult = new List<RaycastResult>();

    foreach (Touch touch in Input.touches)
    {
        pointer.position = touch.position;
        EventSystem.current.RaycastAll(pointer, raycastResult);
        foreach (RaycastResult result in raycastResult)
        {
            if (result.gameObject == this.gameObject)
            {
                if(touch.phase == TouchPhase.Began)
                {
                    Debug.Log("Began " + result.gameObject.name );
                }
                else if(touch.phase == TouchPhase.Moved || touch.phase == TouchPhase.Stationary)
                {
                    this.image.color = this.colorOn;
                }
                else if (touch.phase == TouchPhase.Ended)
                {
                    Debug.Log("End  " + result.gameObject.name);
                }
                //this.gameObject.transform.position = touch.position;

                //Do Stuff

            }

        }

        raycastResult.Clear();

    }

}