【问题标题】:UI Multitouch Architecture?UI 多点触控架构?
【发布时间】:2015-11-18 11:11:01
【问题描述】:

我正在开发一款带有多点触控控制器的游戏。但我在 UI Image 多点触控方面遇到了问题

我想创建这个架构。

  • 绿色循环将用作按钮。 (触摸结束)

  • Red Cycle 将用作按钮。我需要触摸移动或触摸停留事件来进行连续拍摄。 (触摸移动 | 触摸停留)

  • 黄色框将用作触摸板(UI 图像元素)。当手指在盒子上移动时,会触发Rotate方法。

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

我创建了一个名为 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;
    }
}

我的架构有教程吗?

【问题讨论】:

    标签: c# unity3d multi-touch


    【解决方案1】:

    我找到了解决方案:)

    谢谢@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();
    
        }
    
    }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-03-16
      • 1970-01-01
      • 1970-01-01
      • 2012-08-11
      相关资源
      最近更新 更多