Я не могу коснуться некоторых объектов в единстве 5, двигая пальцем. Я использую EventSystem.current.currentSelectedGameObject.name
, чтобы проверить, какой объект выбран. Но когда я двигаю пальцем, у меня есть доступ только к первому объекту. после завершения касания первого объекта, второй объект не поймет мой touch.i должен удалить мой палец и снова коснуться второго объекта.Как я могу коснуться двух объектов, двигая пальцем?
0
A
ответ
0
Здесь вы очень часто проверяете свои прикосновения. Я предлагаю вам другой подход. Вместо этого вы можете сообщить своим объектам, когда они будут выбраны. - обработчик событий OnMouse на каждые объектах, которые вызывают событие - класс, который прислушивается к этому событию и хранящего GameObject посланного события в коллекции
En Exemple реализации:
Сценария для ваших объекты:
using UnityEngine;
using System.Collections;
using UnityEngine.EventSystems;
public class HoverDetection : MonoBehaviour
{
public delegate void SelectEvent(GameObject go);
public SelectEvent IsSelected;
public delegate void DestroyEvent(GameObject go);
public DestroyEvent Destroying;
void OnMouseEnter()
{
var es = EventSystem.current;
if(es.currentSelectedGameObject != gameObject)
{
es.SetSelectedGameObject(gameObject);
OnSelect();
}
}
void OnSelect()
{
Debug.Log("OnHover");
IsSelected(gameObject);
}
public void OnDestroy()
{
Destroying(gameObject);
}
}
скрипт, который обрабатывать ваш объект и сохранить ваш выбор в коллекцию
using UnityEngine;
using System.Collections;
using System.Collections.Generic;
using UnityEngine.EventSystems;
public class SelectedCollection : MonoBehaviour
{
public GameObject[] AllMyObjects; //The array of all your selectable objects. Up to you to populate it.
public List<GameObject> Collection{
get {return _collection;}
}
private List<GameObject> _collection = new List<GameObject>();
void Start()
{
AllMyObjects = GameObject.FindGameObjectsWithTag("SelectableObject"); // Just an exemple to populate your base array
foreach(GameObject go in AllMyObjects)
{
go.GetComponent<HoverDetection>().IsSelected += store; //Fired by SetSelectedGameObject(GameObject) see : http://docs.unity3d.com/500/Documentation/ScriptReference/EventSystems.EventSystem.SetSelectedGameObject.html
go.GetComponent<HoverDetection>().Destroying += clean; //Always unlink your delegats when an object is destroyed. Otherwise you risk some memory leaks.
}
}
private void store(GameObject go)
{
_collection.Add(go);
Debug.Log(_collection.Count);
}
private void clean(GameObject go)
{
go.GetComponent<HoverDetection>().IsSelected -= store;
go.GetComponent<HoverDetection>().IsSelected -= clean;
}
}
Все, что вам нужно сделать, это заменить OnMouseEnter на правильный код, основанный на событиях Touch.
Это нормальное поведение: 'currentSelectedGameObject' поддерживает тот же игровой объект до конца текущего касания. Если вы хотите выбрать несколько объектов gameObject в одном и том же swip, вы будете обрабатывать список игрового объекта. 'SetSelectedGameObject' смог выполнить эту работу, но я не уверен, как помочь вам с вашим кодом. Не могли бы вы пройти мимо него? – dagatsoin
void FixedUpdate() {if (Input.touchCount> 0 && (Input.GetTouch (0) .phase == TouchPhase.Moved || Input.GetTouch (0) .phase == TouchPhase.Began)) { if (Input.GetTouch (0) .phase! = TouchPhase.Stationary) { некоторые работы здесь переключатель (EventSystem.current.currentSelectedGameObject.name) {некоторых рабочих мест здесь} – Naeim
Являются ваши объекты некоторые элементы пользовательского интерфейса или регулярные игровые активы? Если это UI, возможно, вы можете использовать [Selectable class] (http://docs.unity3d.com/ScriptReference/UI.Selectable.html) – dagatsoin