Unity UI mới - Thay đổi động các chức năng được gọi bởi các thành phần GUI


17

Tìm cách thay đổi động giá trị trong nút OnClick và thanh trượt Giá trị thay đổi ví dụ 1 ví dụ 2.

Nếu tôi phải đoán xem làm thế nào được thực hiện, hãy tham khảo phần tử nút / gui. Tiếp theo lấy thành phần tập lệnh Nút và truy cập danh sách các lệnh gọi hàm đó. Tuy nhiên tôi không chắc làm thế nào để sửa đổi danh sách đó. Ai có ý tưởng gì không?

Thêm chi tiết có thể giúp:

  • Hàm được gọi nằm ngoài một thành phần tập lệnh tùy chỉnh
  • Sử dụng tùy chọn biến 'động' cho thanh trượt
  • Có thể được sử dụng để tạo các nút động

Câu trả lời:


23

Có một cách siêu đơn giản để thay đổi sự kiện:

BIÊN TẬP

Xem câu trả lời khác của tôi để biết cách nhanh chóng và dễ dàng để chỉ thêm một sự kiện cho OnClicksự kiện. Đối với các sự kiện khác, nhưOnDrag xem dưới đây.


Ngoài ra, nếu bạn cần nhiều hơn chỉ các sự kiện được cung cấp theo mặc định, thay vào đó tôi sẽ đề xuất đính kèm một EventTriggerđối tượng trò chơi của bạn. Điều này cho phép chúng tôi truy cập vào BaseEventDatađối tượng được trả về từ sự kiện, cho chúng tôi biết những thứ như đối tượng đã tạo ra sự kiện. Sau đó, bạn có thể làm một cái gì đó như:

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

Sau đó, chúng tôi có thể tạo một phương thức để xử lý các sự kiện, chữ ký phải phù hợp với phương thức của đại biểu của chúng tôi. Vì vậy, nó cần trả về voidvà chấp nhận BaseEventDatalà tham số đầu tiên và duy nhất của nó:

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.
}

Cuối cùng, để tự động thêm sự kiện:

//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);

Nếu bạn đang sử dụng phiên bản 5.3.3 trở lên, hãy sử dụng dòng này thay vì dòng cuối cùng ở trên, các đại biểu bị khấu hao :

eventTrigger.triggers.Add(entry); 

Có vẻ như khi bạn tự động thêm một trình xử lý, nó dường như không xuất hiện trong trình kiểm tra. Ngăn kéo vẫn hiển thị "Danh sách trống" cho các đại biểu
vexe

Đúng rồi. Trình xử lý được thêm vào từ mã tách biệt với trình xử lý "liên tục" được hiển thị trong thanh tra; hơn nữa, bạn có trách nhiệm dọn dẹp những người xử lý này (không giống như những người kiên trì, điều mà Unity chăm sóc cho bạn).
Joe Strout

11

Từ này là delegate{}cú pháp tìm thấy trong câu trả lời trước của tôi đã lỗi thời, có một cách khác để làm điều này bằng cách sử dụng ký hiệu lambda:

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

Hoặc bạn có thể chuyển nút theo để làm cho mọi thứ năng động hơn một chút:

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

Hãy ghi nhớ, chiến lược này chỉ dành cho OnClicksự kiện. Để tự động thêm các sự kiện khác, bạn cần làm theo các hướng dẫn trong câu trả lời khác của tôi.
MichaelHouse

0

Tạo một tập lệnh mới, dọc theo dòng:

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

Tập lệnh này thực hiện trong giao diện IPulumClickHandler (trong số nhiều giao diện có sẵn khác ). Chỉ cần đính kèm tập lệnh này vào thành phần UI sẽ cho phép tập lệnh này chặn các sự kiện nhấp (hoặc bất kỳ sự kiện nào bạn triển khai giao diện).

Bước tiếp theo là chỉ cần tự động thêm tập lệnh này làm thành phần vào thành phần UI bạn muốn:

myButton.AddComponent<EventHandler>();

Điều này sẽ thêm tập lệnh như là một thành phần myButton và lần sau khi tôi nhấp vào nút, tôi sẽ nhận được thông tin về nút nào được nhấp và nơi nhấp vào diễn ra.

Điều này cung cấp hầu hết thông tin về sự kiện so với các câu trả lời khác của tôi.


0

Làm thế nào sự thống nhất thực hiện UI cũng giống như bất kỳ thành phần thống nhất nào khác. Bạn thêm GameObject và đính kèm các thành phần UI vào nó. Khi bạn có đối tượng trò chơi, bạn có thể lấy các thành phần UI từ nó và thay đổi các thuộc tính.

Tham chiếu API cho UI có thể được tìm thấy trong không gian tên UnityEngine.UI, tham chiếu API cho BUtton là http://docs.unity3d.com/ScriptReference/UI.Button.html

Xem bài đăng http://blog.trsquarelab.com/2015/03/new-ui-im THỰCation-USE-c-scripts.html để biết thêm thông tin về cách truy cập UI từ tập lệnh C #

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.