xlua 添加拖拽事件

xlua 添加拖拽事件

  • c#添加拖拽的方法
 [CSharpCallLua]
 //声明回调的lua方法
 public delegate void LuaFuncWithPointerEventDataDelegate (BaseEventData eventData);

//提供为gameobject对象添加拖动的回调
 public static void AddDragLiseter(GameObject gameObject
                      ,LuaFuncWithPointerEventDataDelegate beginDragCallback
                      ,LuaFuncWithPointerEventDataDelegate dragCallback
                      ,LuaFuncWithPointerEventDataDelegate endDragCallback)
        {
            //添加组件
            EventTrigger eventTrigger = gameObject.GetOrAddComponent<EventTrigger>();
 
            //创建队列
            eventTrigger.triggers = new List<EventTrigger.Entry>(); 
            //初始化队列
            EventTrigger.Entry entry = new EventTrigger.Entry
            {
                eventID = EventTriggerType.BeginDrag,//事件类型
                callback = new EventTrigger.TriggerEvent() //创建回调函数
            };
        
            //添加回调函数    
            entry.callback.AddListener((data)=> {
                beginDragCallback(data);
            });
            EventTrigger.Entry entry2 = new EventTrigger.Entry
            {
                eventID = EventTriggerType.Drag,//事件类型
                callback = new EventTrigger.TriggerEvent() //创建回调函数
            };
        
            //添加回调函数    
            entry2.callback.AddListener((data)=> {
                dragCallback(data);
            });
            EventTrigger.Entry entry3 = new EventTrigger.Entry
            {
                eventID = EventTriggerType.EndDrag,//事件类型
                callback = new EventTrigger.TriggerEvent() //创建回调函数
            };
        
            //添加回调函数    
            entry3.callback.AddListener((data)=> {
                endDragCallback(data);
            });
    
            //对事件系统的队列添加事件队列
            eventTrigger.triggers.Add(entry);
            eventTrigger.triggers.Add(entry2);
            eventTrigger.triggers.Add(entry3);

        }
  • lua中初始化
--添加拖拽事件
LuaUtility.AddDragLiseter(cardItem.go,function(event)
		-- Log("beginDragCallback")
		self:_ItemOnBeginDrag(index,cardItem,event)
   end,function(event)
		-- Log("dragCallback")
		self:_ItemOnDrag(index,cardItem,event)
	end,function(event)
		-- Log("endDragCallback")
		self:_ItemOnEndDrag(index,cardItem,event)
	end)

--在初始化item的时候,可以设置下tag,方便后续的射线检测
cardItem.go.tag = "Card"
  • lua中拖拽回调
--拖拽事件 开始
function Ctrl:_ItemOnBeginDrag(index,cardItem,event)
	if cardItem.parent ~= self.panel.transform then
		self._dragBeginParentTransform = cardItem.parentTransform
		self._dragBeginPos = cardItem.transform.position
		self._dragBeginMousePos = Input.mousePosition
		cardItem.transform:SetParent(self.panel.transform)
	end
end
--拖拽事件 拖动中,需要在prefab中,关闭其他组件的raycastTarget,只留一个被检测到的
function Ctrl:_ItemOnDrag(index,cardItem,event)
	cardItem.transform.position = self._dragBeginPos + (Input.mousePosition-self._dragBeginMousePos)
	if cardItem.transform:GetComponent("Image").raycastTarget then
		cardItem.transform:GetComponent("Image").raycastTarget = false;
	end
end
--拖拽事件 结束
function Ctrl:_ItemOnEndDrag(index,cardItem,event)
	if event then
		local  endGo = event.pointerCurrentRaycast.gameObject
		if endGo.tag == "Card" then --如果是可以交换的,这个在初始化中设置tag
			for swpaIndex, item in ipairs(self.cardItems) do
				if item.go == endGo then
					--进行换位置
					self:_SwapCardItemData(index,swpaIndex)
				end
			end
		-- else --其他任何情况,物体回归原始位置
				
		end
		--需要将raycastTarget重置为TRUE,方便下次被检测到
		cardItem.transform:GetComponent("Image").raycastTarget = true;
		cardItem.transform:SetParent(self._dragBeginParentTransform)
		cardItem.transform.position = self._dragBeginPos
		self._dragBeginParentTransform = nil
		self._dragBeginPos = nil
		self._dragBeginMousePos = nil
	end
end

到这里基本就完成了。需要注意的 item中的其他组件的关闭raycastTarget属性,只留一个被检测到的就可以了

注意:

在Canvas的Render Mode的为 Screen Space - Camera的情况下,

拖拽的初始位置,和偏差,都应该通过camera转换成世界坐标进行计算,否则会有偏移

-- 拖拽的位置需要修正
-- self._dragBeginMousePos = Input.mousePosition
-- 应该改为通过Carmera转换成世界坐标,进行,偏差的计算
self._dragBeginMousePos = self.camera:ScreenToWorldPoint(Input.mousePosition)
local dpos = self.camera:ScreenToWorldPoint(Input.mousePosition) - self._dragBeginMousePos

 

  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值