Unity new UI - GUI öğeleri tarafından çağrılan işlevleri dinamik olarak değiştirir


17

OnClick düğmesindeki değeri dinamik olarak değiştirmek isteyen ve Değeri Açık kaydırıcısı Değişti örnek 1 örnek 2.

Bunun nasıl yapıldığını tahmin etmek zorunda kalsaydım, button / gui öğesine bir referans alın. Sonra Button komut dosyası bileşenini alın ve bu işlev çağrıları listesine erişin. Ancak bu listeyi nasıl değiştireceğimi bilmiyorum. Herhangi bir fikri olan var mı?

Yardımcı olabilecek daha fazla ayrıntı:

  • Çağrılan işlev özel bir komut dosyası bileşeninden ayrı
  • Kaydırıcılar için 'dinamik' değişken seçeneğini kullanma
  • Dinamik düğmeler oluşturmak için kullanılabilir

Yanıtlar:


23

Olayları değiştirmenin çok basit bir yolu var:

DÜZENLE

OnClickYalnızca etkinlik için etkinlik eklemenin hızlı ve kolay yolu için diğer yanıtı görün . OnDragAşağıdaki gibi diğer etkinlikler için .


Ayrıca, varsayılan olarak sağlanan etkinliklerden daha fazlasına ihtiyacınız varsa, bunun yerine EventTriggeroyun nesnenize bir eklemenizi öneririm . Bu BaseEventData, olayı döndüren nesneye erişmemizi sağlar ve bize olayı oluşturan nesne gibi şeyler söyler. Sonra şöyle bir şey yapabilirsiniz:

//Create an event delegate that will be used for creating methods that respond to events
public delegate void EventDelegate(UnityEngine.EventSystems.BaseEventData baseEvent);

Daha sonra olayları işlemek için bir yöntem oluşturabiliriz, imza temsilci ile eşleşmelidir. Bu nedenle, ilk ve tek parametresi olarak geri dönüp voidkabul etmesi gerekir BaseEventData:

public void DropEventMethod(UnityEngine.EventSystems.BaseEventData baseEvent) {
    Debug.Log(baseEvent.selectedObject.name + " triggered an event!");
    //baseEvent.selectedObject is the GameObject that triggered the event,
    // so we can access its components, destroy it, or do whatever.
}

Son olarak, etkinliği dinamik olarak eklemek için:

//Get the event trigger attached to the UI object
EventTrigger eventTrigger = buttonObject.GetComponent<EventTrigger>();

//Create a new entry. This entry will describe the kind of event we're looking for
// and how to respond to it
EventTrigger.Entry entry = new EventTrigger.Entry();

//This event will respond to a drop event
entry.eventID = EventTriggerType.Drop;

//Create a new trigger to hold our callback methods
entry.callback = new EventTrigger.TriggerEvent();

//Create a new UnityAction, it contains our DropEventMethod delegate to respond to events
UnityEngine.Events.UnityAction<BaseEventData> callback =
    new UnityEngine.Events.UnityAction<BaseEventData>(DropEventMethod);

//Add our callback to the listeners
entry.callback.AddListener(callback);

//Add the EventTrigger entry to the event trigger component
eventTrigger.delegates.Add(entry);

5.3.3 veya daha yeni bir sürüm kullanıyorsanız, yukarıdaki son satır yerine bu satırı kullanın, temsilciler amortismana tabi tutulur :

eventTrigger.triggers.Add(entry); 

Dinamik olarak bir işleyici eklediğinizde, denetçide görünmüyor gibi görünüyor. Çekmece hala delegeler için "Boş liste" gösteriyor
vexe

Bu doğru. Koddan eklenen işleyiciler denetçide gösterilen "kalıcı" işleyicilerden ayrıdır; dahası, bu işleyicileri temizlemekle sorumlusunuz (Unity'nin sizin için hallettiği kalıcı olanların aksine).
Joe Strout

11

Kelime, önceki delegate{}cevabımda bulunan sözdiziminin eski olduğu, bunu lambda gösterimini kullanarak yapmanın başka bir yolu var:

void buttonSetup(Button button) {
    //Remove the existing events
    button.onClick.RemoveAllListeners();
    //Add your new event using lambda notation
    button.onClick.AddListener (handleButton);
}

void handleButton() {
    Debug.Log("Button pressed!");
}

Veya işleri biraz daha dinamik hale getirmek için düğmeyi geçebilirsiniz:

void buttonSetup(Button button) {
    button.onClick.RemoveAllListeners();
    //Add your new event
    button.onClick.AddListener(() => handleButton(button));
}

void handleButton(Button b) {
    Debug.Log("Button '" + b.name + "' pressed!");
}

Unutmayın, bu strateji yalnızca OnClicketkinlik içindir. Dinamik olarak başka etkinlikler eklemek için diğer cevabımdaki talimatları izlemeniz gerekir.
MichaelHouse

0

Şu satırlarda yeni bir komut dosyası oluşturun:

public class EventHandler : MonoBehaviour, IPointerClickHandler
{
    public void OnPointerClick(PointerEventData eventData)
    {
        Debug.Log("Element: " +
                   eventData.selectedObject.name +
                   " was clicked at " +
                   eventData.position.ToString());
    }
}

Bu komut dosyası, IPointerClickHandler arabiriminde (diğer birçok kullanılabilir arabirimin yanı sıra) uygular . Bu komut dosyasını bir kullanıcı arabirimi öğesine eklemek, bu komut dosyasının tıklama etkinliklerini (veya arabirimi uyguladığınız herhangi bir etkinliği) engellemesine olanak tanır.

Bir sonraki adım, bu komut dosyasını istediğiniz UI öğesine dinamik olarak bir bileşen olarak eklemektir:

myButton.AddComponent<EventHandler>();

Bu komut dosyasını bir bileşen olarak ekleyecek ve bir myButtondahaki sefere düğmeyi tıkladığımda, hangi düğmenin tıklandığı ve tıklamanın nerede gerçekleştiği hakkında bilgi alacağım.

Bu, diğer cevaplarıma kıyasla etkinlik hakkında en fazla bilgiyi sağlar.


0

Birliğin UI'yi nasıl uyguladığı, diğer tüm birlik bileşenleri gibi. GameObject ekler ve UI bileşenlerini eklersiniz. Oyun nesnesine sahip olduğunuzda, ondan UI bileşenlerini alabilir ve özelliklerini değiştirebilirsiniz.

Kullanıcı arayüzü için API referansı UnityEngine.UI ad alanı altında bulunabilir, BUtton için API referansı http://docs.unity3d.com/ScriptReference/UI.Button.html

C # komut dosyalarından UI'ye erişme hakkında daha fazla bilgi için http://blog.trsquarelab.com/2015/03/new-ui-implementation-using-c-scripts.html yazısına bakın.

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.