ইউনিটির নতুন ইউআই - জিইউআই উপাদানগুলির দ্বারা ডাকা ফাংশনগুলি গতিময়ভাবে পরিবর্তন করুন


17

ডায়নামিকভাবে বোতামটিতে ক্লিক করে অনক্লিক এবং স্লাইডার অন মান পরিবর্তিত হয়েছে উদাহরণ 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());
    }
}

এই স্ক্রিপ্টটি ইন্টারফেস আইপয়েন্টারক্লিকহ্যান্ডলারে প্রয়োগ করে ( অন্যান্য অনেকগুলি উপলব্ধ ইন্টারফেসের মধ্যে )। এই স্ক্রিপ্টটিকে কেবল কোনও ইউআই উপাদানগুলির সাথে সংযুক্ত করার ফলে এই স্ক্রিপ্টটি ক্লিক ইভেন্টগুলিকে বাধা দিতে পারে (বা আপনার ইভেন্টটি ইন্টারফেসটি কার্যকর করুন) implement

পরবর্তী পদক্ষেপটি হ'ল এই স্ক্রিপ্টটিকে আপনি যে ইউআই উপাদানটি চান তা উপাদান হিসাবে গতিশীলভাবে যুক্ত করা:

myButton.AddComponent<EventHandler>();

এটি স্ক্রিপ্টটিকে একটি উপাদান হিসাবে যুক্ত করবে myButtonএবং পরের বার আমি বোতামটি ক্লিক করব, কোন বোতামটি ক্লিক করা হয়েছিল এবং কোথায় ক্লিক হয়েছে তা সম্পর্কে আমি তথ্য পেয়ে যাব।

এটি আমার অন্যান্য উত্তরের তুলনায় ইভেন্টটি সম্পর্কে সর্বাধিক তথ্য সরবরাহ করে।


0

Unityক্য কীভাবে ইউআই বাস্তবায়ন করে তা অন্যান্য unityক্যের উপাদানগুলির মতো। আপনি গেম অবজেক্ট যুক্ত করুন এবং এতে ইউআই উপাদান যুক্ত করুন। আপনার গেমের অবজেক্টটি একবার হয়ে গেলে আপনি এটি থেকে ইউআই উপাদানগুলি পেতে এবং বৈশিষ্ট্যগুলি পরিবর্তন করতে পারেন।

ইউআইএর জন্য এপিআই রেফারেন্স ইউনিটিইজাইন.উআই নেমস্পেসের অধীনে পাওয়া যাবে, বুটনের জন্য এপিআই রেফারেন্সটি হ'ল http://docs.unity3d.com/ScriptReferences/UI.Button.html

সি # স্ক্রিপ্ট থেকে ইউআই অ্যাক্সেস সম্পর্কে আরও তথ্যের জন্য http://blog.trsquarelab.com/2015/03/new-ui-implementation-using-c-scriptts.html পোস্টটি দেখুন

আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.