我正在开发一款带有多点触控控制器的游戏。但我对UI Image多点触摸有问题
我想创建这个架构。
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;
}
}
我的架构是否有任何教程?
答案 0 :(得分:0)
我找到了解决方案:)
谢谢Bro @IsGreen
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();
}
}