unity3d 自定义onClick列表

yr9zkbsy  于 2023-01-05  发布在  其他
关注(0)|答案(3)|浏览(162)

我可以为列表onClick创建带有分组方法的自定义区域吗?like this

uplii1fm

uplii1fm1#

是也不是!

*是的,您可以创建自己的事件类型,并将动态回调分配给它。您要查找的是UnityEvent

对于动态参数化的,根据您需要的参数数量,请参见UnityEvent<T0>UnityEvent<T0, T1, T2, T3>
对于具有单个int的示例,它将是(与API示例完全相同)

// Since Unity doesn't support direct serialization of generics you have to implement this [Serializable] wrapper
[Serializable]
public class MyIntEvent : UnityEvent<int>
{
}

public class ExampleClass : MonoBehaviour
{
    public MyIntEvent m_MyEvent;
}

*,您不能简单地更改UI.Button.onClick的现有实现,它是无参数的。

然而,您可以做的是构建一个新组件并将其附加到按钮上,如

[RequireComponent(typeof(Button))]
public class ExampleClass : MonoBehaviour
{
    [SerializeField] private Button _button;
    public MyIntEvent onClickWithIntParameter;

    private void Awake()
    {
        if(!_button) _button = GetComponent<Button>();
        _button.onClick.AddListener(HandleOnClick);
    }

    private void HandleOnClick()
    {
        // Wherever you get your int from
        var value = 123;

        onClickWithIntParameter.Invoke(value);
    }
}
xuo3flqw

xuo3flqw2#

如果[Serializable]不起作用,请尝试顶部的[System.Serializable]using System;

nkcskrwz

nkcskrwz3#

对于想要创建自定义事件脚本的用户:
我做了一个碰撞检测脚本。当检测到碰撞时,检查器中设置的事件会被调用。就像一个按钮一样。
https://i.stack.imgur.com/r4epP.png

using System.Collections;
using System.Collections.Generic;
using System.Reflection;
using UnityEngine;
using UnityEngine.Events;

public class CollisionCallFunc : MonoBehaviour {
    [System.Serializable]
    public class CollisionEvent : UnityEvent<object> {
        public object value;
    }

    [SerializeField]
    private CollisionEvent collisionEvents = new();

    private void OnCollisionEnter(Collision collision) {
        try {
            collisionEvents.Invoke(collisionEvents.value);
        } catch(System.Exception exception) {
            Debug.LogWarning("Couldn't invoke action. Error:");
            Debug.LogWarning(exception.Message);
        }
    }
    private void OnCollisionEnter2D(Collision2D collision) {
        try {
            collisionEvents.Invoke(collisionEvents.value);
        } catch(System.Exception exception) {
            Debug.LogWarning("Couldn't invoke action. Error:");
            Debug.LogWarning(exception.Message);
        }
    }
}

相关问题