एकता नए UI - गतिशील रूप से GUI तत्वों द्वारा कहे जाने वाले कार्यों को बदल दें


17

बटन को गतिशील रूप से बदलने के लिए बटन पर क्लिक करें OnClick और स्लाइडर को मान परिवर्तित करें उदाहरण 1 उदाहरण 2

अगर मुझे यह अनुमान लगाना था कि यह कैसे किया गया था, तो बटन / गुई तत्व का संदर्भ लें। अगला बटन स्क्रिप्ट घटक प्राप्त करें और फ़ंक्शन कॉल की सूची तक पहुंचें। हालाँकि मुझे यकीन नहीं है कि उस सूची को कैसे संशोधित किया जाए। क्या किसी के भी पास कोई सुझाव है?

अधिक जानकारी जो मदद कर सकती है:

  • कहा जा रहा फ़ंक्शन एक कस्टम स्क्रिप्ट घटक के अलावा है
  • स्लाइडर्स के लिए 'डायनामिक' वैरिएबल विकल्प का उपयोग करना
  • गतिशील बटन बनाने के लिए इस्तेमाल किया जा सकता है

जवाबों:


23

घटनाओं को बदलने के लिए एक सुपर सरल तरीका है:

संपादित करें

OnClickकेवल घटना के लिए एक घटना को जोड़ने के लिए त्वरित और आसान तरीके के लिए मेरा अन्य उत्तर देखें । अन्य घटनाओं के लिए, जैसे OnDragनीचे देखें।


इसके अतिरिक्त, यदि आपको डिफ़ॉल्ट रूप से दी गई घटनाओं से अधिक की आवश्यकता है, तो मैं आपको EventTriggerअपने गेम ऑब्जेक्ट को संलग्न करने के बजाय सुझाव देना चाहूंगा । यह हमें BaseEventDataघटना से लौटी हुई वस्तु तक पहुँच प्रदान करता है , जो हमें उस वस्तु की तरह सामान देता है जिसने घटना को बनाया है। तब आप कुछ ऐसा कर सकते हैं:

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

फिर हम ईवेंट्स को हैंडल करने के लिए एक विधि बना सकते हैं, हस्ताक्षर को हमारे प्रतिनिधि से मेल खाना चाहिए। इसलिए, इसे अपने पहले और एकमात्र पैरामीटर के रूप में वापस लौटने voidऔर स्वीकार करने की आवश्यकता है 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.
}

अंत में, गतिशील रूप से घटना को जोड़ने के लिए:

//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 या इसके बाद के संस्करण का उपयोग कर रहे हैं, तो ऊपर की अंतिम पंक्ति के बजाय इस पंक्ति का उपयोग करें, प्रतिनिधियों का मूल्यह्रास किया गया है :

eventTrigger.triggers.Add(entry); 

ऐसा लगता है कि जब आप गतिशील रूप से एक हैंडलर जोड़ते हैं तो यह निरीक्षक में दिखाई नहीं देता है। दराज अभी भी प्रतिनिधियों के लिए "खाली सूची" दिखाता है
vexe

यह सही है। कोड से जोड़े गए हैंडलर निरीक्षक में दिखाए गए "लगातार" हैंडलर्स से अलग होते हैं; इसके अलावा, आप इन हैंडलर को साफ करने के लिए जिम्मेदार हैं (लगातार वाले के विपरीत, जो यूनिटी आपके लिए देखभाल करता है)।
जो स्ट्रॉट

11

शब्द यह है कि delegate{}मेरे पिछले उत्तर में पाया गया सिंटैक्स अप्रचलित है, लैम्बडा नोटेशन का उपयोग करने का एक और तरीका है:

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!");
}

या आप चीजों को थोड़ा और गतिशील बनाने के लिए बटन को पास कर सकते हैं:

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!");
}

ध्यान रखें, यह रणनीति केवल OnClickघटना के लिए है। अन्य घटनाओं को गतिशील रूप से जोड़ने के लिए, आपको मेरे अन्य उत्तर में निर्देशों का पालन करने की आवश्यकता है।
MichaelHouse

0

की तर्ज पर एक नई स्क्रिप्ट बनाएँ:

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

यह स्क्रिप्ट इंटरफ़ेस IPointerClickHandler ( कई अन्य उपलब्ध इंटरफेस के बीच ) में लागू होती है। बस एक यूआई तत्व के लिए इस स्क्रिप्ट को संलग्न करने से यह स्क्रिप्ट क्लिक इवेंट (या जो भी घटना आपके इंटरफ़ेस के लिए लागू होती है) को अवरोधन करने की अनुमति देगा।

अगला कदम यह है कि आप इस स्क्रिप्ट को केवल यूआई तत्व के घटक के रूप में गतिशील रूप से जोड़ना चाहते हैं:

myButton.AddComponent<EventHandler>();

यह स्क्रिप्ट को एक घटक के रूप में जोड़ देगा myButtonऔर अगली बार जब मैं बटन पर क्लिक करूंगा, तो मुझे जानकारी मिलेगी कि किस बटन पर क्लिक किया गया था, और जहां क्लिक हुआ था।

यह मेरे अन्य उत्तरों की तुलना में घटना के बारे में सबसे अधिक जानकारी प्रदान करता है।


0

यूआई किसी भी अन्य एकता घटकों की तरह ही एकता कैसे लागू करता है। आप GameObject को जोड़ते हैं और उसमें UI घटक देते हैं। एक बार जब आपके पास गेम ऑब्जेक्ट होगा तो आप इससे यूआई घटक प्राप्त कर सकते हैं और गुण बदल सकते हैं।

UI के लिए API संदर्भ UnityEngine.UI नाम स्थान के अंतर्गत पाया जा सकता है, BUtton के लिए API संदर्भ http://docs.unity3d.com/ScriptReference/UI.Button.html है

C # स्क्रिप्ट से UI एक्सेस करने के बारे में अधिक जानकारी के लिए http://blog.trsquarelab.com/2015/03/new-ui-implementation-using-c-scripts.html पोस्ट देखें।

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.