2015-03-23 14 views
0

Я не могу коснуться некоторых объектов в единстве 5, двигая пальцем. Я использую EventSystem.current.currentSelectedGameObject.name, чтобы проверить, какой объект выбран. Но когда я двигаю пальцем, у меня есть доступ только к первому объекту. после завершения касания первого объекта, второй объект не поймет мой touch.i должен удалить мой палец и снова коснуться второго объекта.Как я могу коснуться двух объектов, двигая пальцем?

+1

Это нормальное поведение: 'currentSelectedGameObject' поддерживает тот же игровой объект до конца текущего касания. Если вы хотите выбрать несколько объектов gameObject в одном и том же swip, вы будете обрабатывать список игрового объекта. 'SetSelectedGameObject' смог выполнить эту работу, но я не уверен, как помочь вам с вашим кодом. Не могли бы вы пройти мимо него? – dagatsoin

+0

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

+1

Являются ваши объекты некоторые элементы пользовательского интерфейса или регулярные игровые активы? Если это UI, возможно, вы можете использовать [Selectable class] (http://docs.unity3d.com/ScriptReference/UI.Selectable.html) – dagatsoin

ответ

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.