我对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工具包框架中实现这一点的方法。
1条答案
按热度按时间bq9c1y661#
我也是Unity的新手,但我发现了一些解决方案。看起来你可以通过继承
PointerManipulator
或MouseManipulator
类来添加自定义的拖动处理程序(请参见here的例子,它几乎是按原样工作的):您必须将
PointerCaptureOutHandler
的实现从基于插槽改为列表排序。然而,这个行为似乎内置在Unity中(至少在我的版本-2021.3.12f1中)。
ListView
有一个reorderable
属性,您可以将其设置为true
以启用拖放重新排序。您可以通过将reorderMode设置为Animated
来添加拖动动画。来源于unity forum。