找回密码
 立即注册
查看: 350|回复: 0

xlua 添加拖拽事件

[复制链接]
发表于 2021-8-12 21:35 | 显示全部楼层 |阅读模式
xlua 添加拖拽事件
    c#添加拖拽的方法
  1. [CSharpCallLua]
  2. //声明回调的lua方法
  3. public delegate void LuaFuncWithPointerEventDataDelegate (BaseEventData eventData);
  4. //提供为gameobject对象添加拖动的回调
  5. public static void AddDragLiseter(GameObject gameObject
  6.                       ,LuaFuncWithPointerEventDataDelegate beginDragCallback
  7.                       ,LuaFuncWithPointerEventDataDelegate dragCallback
  8.                       ,LuaFuncWithPointerEventDataDelegate endDragCallback)
  9.         {
  10.             //添加组件
  11.             EventTrigger eventTrigger = gameObject.GetOrAddComponent<EventTrigger>();
  12.             //创建队列
  13.             eventTrigger.triggers = new List<EventTrigger.Entry>();
  14.             //初始化队列
  15.             EventTrigger.Entry entry = new EventTrigger.Entry
  16.             {
  17.                 eventID = EventTriggerType.BeginDrag,//事件类型
  18.                 callback = new EventTrigger.TriggerEvent() //创建回调函数
  19.             };
  20.         
  21.             //添加回调函数   
  22.             entry.callback.AddListener((data)=> {
  23.                 beginDragCallback(data);
  24.             });
  25.             EventTrigger.Entry entry2 = new EventTrigger.Entry
  26.             {
  27.                 eventID = EventTriggerType.Drag,//事件类型
  28.                 callback = new EventTrigger.TriggerEvent() //创建回调函数
  29.             };
  30.         
  31.             //添加回调函数   
  32.             entry2.callback.AddListener((data)=> {
  33.                 dragCallback(data);
  34.             });
  35.             EventTrigger.Entry entry3 = new EventTrigger.Entry
  36.             {
  37.                 eventID = EventTriggerType.EndDrag,//事件类型
  38.                 callback = new EventTrigger.TriggerEvent() //创建回调函数
  39.             };
  40.         
  41.             //添加回调函数   
  42.             entry3.callback.AddListener((data)=> {
  43.                 endDragCallback(data);
  44.             });
  45.    
  46.             //对事件系统的队列添加事件队列
  47.             eventTrigger.triggers.Add(entry);
  48.             eventTrigger.triggers.Add(entry2);
  49.             eventTrigger.triggers.Add(entry3);
  50.         }
复制代码
    lua中初始化
  1. --添加拖拽事件
  2. LuaUtility.AddDragLiseter(cardItem.go,function(event)
  3.                 -- Log("beginDragCallback")
  4.                 self:_ItemOnBeginDrag(index,cardItem,event)
  5.    end,function(event)
  6.                 -- Log("dragCallback")
  7.                 self:_ItemOnDrag(index,cardItem,event)
  8.         end,function(event)
  9.                 -- Log("endDragCallback")
  10.                 self:_ItemOnEndDrag(index,cardItem,event)
  11.         end)
  12. --在初始化item的时候,可以设置下tag,方便后续的射线检测
  13. cardItem.go.tag = "Card"
复制代码
    lua中拖拽回调
  1. --拖拽事件 开始
  2. function Ctrl:_ItemOnBeginDrag(index,cardItem,event)
  3.         if cardItem.parent ~= self.panel.transform then
  4.                 self._dragBeginParentTransform = cardItem.parentTransform
  5.                 self._dragBeginPos = cardItem.transform.position
  6.                 self._dragBeginMousePos = Input.mousePosition
  7.                 cardItem.transform:SetParent(self.panel.transform)
  8.         end
  9. end
  10. --拖拽事件 拖动中,需要在prefab中,关闭其他组件的raycastTarget,只留一个被检测到的
  11. function Ctrl:_ItemOnDrag(index,cardItem,event)
  12.         cardItem.transform.position = self._dragBeginPos + (Input.mousePosition-self._dragBeginMousePos)
  13.         if cardItem.transform:GetComponent("Image").raycastTarget then
  14.                 cardItem.transform:GetComponent("Image").raycastTarget = false;
  15.         end
  16. end
  17. --拖拽事件 结束
  18. function Ctrl:_ItemOnEndDrag(index,cardItem,event)
  19.         if event then
  20.                 local  endGo = event.pointerCurrentRaycast.gameObject
  21.                 if endGo.tag == "Card" then --如果是可以交换的,这个在初始化中设置tag
  22.                         for swpaIndex, item in ipairs(self.cardItems) do
  23.                                 if item.go == endGo then
  24.                                         --进行换位置
  25.                                         self:_SwapCardItemData(index,swpaIndex)
  26.                                 end
  27.                         end
  28.                 -- else --其他任何情况,物体回归原始位置
  29.                                
  30.                 end
  31.                 --需要将raycastTarget重置为TRUE,方便下次被检测到
  32.                 cardItem.transform:GetComponent("Image").raycastTarget = true;
  33.                 cardItem.transform:SetParent(self._dragBeginParentTransform)
  34.                 cardItem.transform.position = self._dragBeginPos
  35.                 self._dragBeginParentTransform = nil
  36.                 self._dragBeginPos = nil
  37.                 self._dragBeginMousePos = nil
  38.         end
  39. end
复制代码
到这里基本就完成了。需要注意的 item中的其他组件的关闭raycastTarget属性,只留一个被检测到的就可以了
懒得打字嘛,点击右侧快捷回复 【右侧内容,后台自定义】
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Unity开发者联盟 ( 粤ICP备20003399号 )

GMT+8, 2024-11-24 09:07 , Processed in 0.063370 second(s), 22 queries .

Powered by Discuz! X3.5 Licensed

© 2001-2024 Discuz! Team.

快速回复 返回顶部 返回列表