obsidian/笔记文件/2.笔记/UGUI整体解决方案-案例篇_第十二章.md
2025-03-26 00:02:56 +08:00

3.5 KiB
Raw Permalink Blame History

区域触发逻辑的基类接口,其中有三个函数:初始化、进入区域、退出区域

!Pasted image 20240329132543.png

这是拖曳的根节点声明的变量中除了卡牌基类当前拖曳卡牌实体CurDraggingCardTrans 和 当前拖曳区域 CurAreaAction ,还有一个卡牌实体 拖曳逻辑的,基类 CurDragComponent

!Pasted image 20240329132816.png

各个函数调用ICard基类的设置射线检测开关初始化卡牌的逻辑是设置父物体还有重置局部坐标 Clear就是简单的设null清空了 在拖曳过程中,实例化出来的拖曳卡牌,会以根节点作为父节点,跟随一起移动;

!Pasted image 20240329133150.png

设置一张新的拖曳卡片,具体逻辑,就是通过各个传参,完成当前拖曳卡牌的,相关赋值、初始化操作; 外部调用接口是SetDraggingCard即可

!Pasted image 20240329133314.png

表现上根节点逻辑DraggingRoot会挂载在这里

!Pasted image 20240329133625.png

卡牌实体,拖曳的相关逻辑基类,声明对象池管理类 CardPoolMgr和 ICard 卡牌基类接口DraggingRoot拖曳的根节点还有_onEnd是结束拖曳的Action事件回调 其中开始拖曳的相关逻辑OnBeginDrag就是把 拖曳根节点 DraggingRoot 的绝对位置,使用鼠标位置 Input.mousePosition 赋值即可;

!Pasted image 20240329133448.png

剩余的函数体,分别是拖曳过程中,实时修改拖曳根节点的锚点坐标; 结束拖曳的时候调用OnEndDrag即可 还有AddEndListener函数就是完成拖曳结束函数_onEnd的回调赋值

!Pasted image 20240329133913.png

拖曳出来的卡牌,会有两种来源,表现

!Pasted image 20240329140757.png

!Pasted image 20240329140835.png

分别对应拖曳基类的,两个继承子类

!Pasted image 20240329141450.png

大卡的拖曳具体逻辑; 其中重写开始拖曳的相关逻辑是调用了对象池管理类的Spwan加载函数通过卡牌的Type类型拿到对应的卡牌实体再设置到拖曳根节点即可 重写结束拖曳的相关逻辑就是调用对象池管理类的Despwan卸载资源即可

!Pasted image 20240329141507.png

右侧小卡的,实体拖曳逻辑,也是继承自 DragCardBase父类的子类其中的_miniCard是通过Init初始化函数获取实体挂载的MiniCard组件即可 Direction是方向枚举分水平和纵向 在开始拖曳函数中调用MiniCard的SetGraphicState函数将小卡的背景图片设置为显现方向默认是None_content组件是父物体的RectTransform组件

!Pasted image 20240329142851.png

!Pasted image 20240329143027.png

对应的表现是一个纵向布局Group组

!Pasted image 20240329143303.png

继续看小卡拖曳逻辑的其他函数JudgeDirection是根据 PointerEventData 的 delta的x和y比较完成方向的赋值 ExcuteDrag函数的相关逻辑就是根据不同的方向调用不同的逻辑其中水平方向移动就会调用父类的OnDrag逻辑如果是纵向移动就调用父物体_content的Dotween动画插件的 DOAnchorPosY函数接口纵向移动即可

!Pasted image 20240329143414.png

父类的OnDrag函数接口是之前提及的根据拖曳数据修改拖曳根节点的锚点坐标即可

!Pasted image 20240329143659.png

回到小卡拖曳的具体逻辑,拖曳中的逻辑重写,就是调用上述的俩逻辑即可

!Pasted image 20240329143758.png