Unity new UI - เปลี่ยนฟังก์ชันที่เรียกใช้โดยองค์ประกอบ GUI แบบไดนามิก


17

มองการเปลี่ยนแปลงแบบไดนามิกค่าในปุ่ม OnClick ตัวอย่างที่ 1 ตัวอย่างที่ 2และเลื่อนกับค่าเปลี่ยน

ถ้าฉันต้องเดาว่าสิ่งนี้ทำได้อย่างไรให้อ้างอิงถึงองค์ประกอบของปุ่ม / gui ถัดไปรับองค์ประกอบสคริปต์ปุ่มและเข้าถึงรายการการเรียกใช้ฟังก์ชันนั้น อย่างไรก็ตามฉันไม่แน่ใจว่าจะแก้ไขรายการนั้นอย่างไร ใครมีความคิดเห็นบ้าง

รายละเอียดเพิ่มเติมที่อาจช่วย:

  • ฟังก์ชั่นที่ถูกเรียกนั้นอยู่นอกเหนือจากองค์ประกอบของสคริปต์
  • การใช้ตัวเลือกตัวแปร 'ไดนามิก' สำหรับตัวเลื่อน
  • สามารถใช้เพื่อสร้างปุ่มแบบไดนามิก

คำตอบ:


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

ถูกต้อง. ตัวจัดการที่เพิ่มจากรหัสแยกจากตัวจัดการ "ถาวร" ที่แสดงในตัวตรวจสอบ ยิ่งกว่านั้นคุณต้องรับผิดชอบในการทำความสะอาดตัวจัดการเหล่านี้ (ไม่เหมือนที่มีอยู่ซึ่ง Unity จะดูแลคุณ)
Joe Strout

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 (ในบรรดาอินเทอร์เฟซอื่น ๆ ที่มีอยู่ ) เพียงแนบสคริปต์นี้เข้ากับองค์ประกอบ UI จะอนุญาตให้สคริปต์นี้ดักเหตุการณ์การคลิก (หรือเหตุการณ์ใดก็ตามที่คุณใช้อินเทอร์เฟซสำหรับ)

ขั้นตอนต่อไปคือการเพิ่มสคริปต์นี้แบบไดนามิกเป็นองค์ประกอบไปยังองค์ประกอบ UI ที่คุณต้องการ:

myButton.AddComponent<EventHandler>();

นี่จะเพิ่มสคริปต์เป็นส่วนประกอบmyButtonและในครั้งต่อไปที่ฉันคลิกปุ่มฉันจะได้รับข้อมูลเกี่ยวกับปุ่มที่ถูกคลิกและตำแหน่งที่เกิดการคลิก

สิ่งนี้ให้ข้อมูลมากที่สุดเกี่ยวกับเหตุการณ์เมื่อเปรียบเทียบกับคำตอบอื่น ๆ


0

ความเป็นอันหนึ่งอันเดียวกันของ UI นั้นนำมาใช้เช่นเดียวกับองค์ประกอบความสามัคคีอื่น ๆ คุณเพิ่ม GameObject และแนบส่วนประกอบ UI เข้ากับมัน เมื่อคุณมีออบเจกต์เกมคุณสามารถรับส่วนประกอบ UI จากมันและเปลี่ยนคุณสมบัติได้

การอ้างอิง API สำหรับ UI สามารถพบได้ใน UnityEngine.UI namespace การอ้างอิง API สำหรับ BUtton คือhttp://docs.unity3d.com/ScriptReference/UI.Button.html

ดูโพสต์http://blog.trsquarelab.com/2015/03/new-ui-implementation-using-c-scripts.html สำหรับข้อมูลเพิ่มเติมเกี่ยวกับการเข้าถึง UI จากสคริปต์ C #

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.