unity3d 在Unity 2021.2中,使用UI Toolkit功能,如何在ListView中对列表项的子Button执行单击并按住操作?

wsewodh2  于 2022-11-15  发布在  其他
关注(0)|答案(1)|浏览(260)

我对Unity比较陌生,我正在尝试使用UI工具包功能构建一个游戏中的可重新排序列表。
我正在用一个由几个Label和Button元素组成的可视化树资产填充ListView元素。
我希望能够单击并按住列表项中的按钮(可能在左侧),然后将列表项向上或向下拖动到列表中所需的位置。

我能够使用以下代码成功地将clickable.clicked函数绑定到列表项子Button:

Action<VisualElement, int> bindItem = (e, i) => {
    var reorder_button = e.Q<Button>("reorder_button");
    if (reorder_button != null) reorder_button.clickable.clicked += () => ReorderClicked(e);
};

其中调用的函数为:

void ReorderClicked(VisualElement ve)
{
    var title = ve.Q<Label>("title");
    Debug.Log("Clicked " + title.text);
};

这和预期的一样,但是我如何扩展它以适应点击并按住或鼠标按下/鼠标释放事件呢?
有人建议我使用Unity中的特性来拖动事件,但我没有看到在UI工具包框架中实现这一点的方法。

bq9c1y66

bq9c1y661#

我也是Unity的新手,但我发现了一些解决方案。看起来你可以通过继承PointerManipulatorMouseManipulator类来添加自定义的拖动处理程序(请参见here的例子,它几乎是按原样工作的):

Action<VisualElement, int> bindItem = (e, i) =>
{
    ...
    e.AddManipulator(new DragAndDropManipulator(e));
}

您必须将PointerCaptureOutHandler的实现从基于插槽改为列表排序。

然而,这个行为似乎内置在Unity中(至少在我的版本-2021.3.12f1中)。ListView有一个reorderable属性,您可以将其设置为true以启用拖放重新排序。您可以通过将reorderMode设置为Animated来添加拖动动画。

来源于unity forum

相关问题