From 4e7f89bd38679ef6401518a43debdb08240dc827 Mon Sep 17 00:00:00 2001 From: wyatt Date: Mon, 1 Sep 2025 01:14:17 +0800 Subject: [PATCH] =?UTF-8?q?=E5=9B=9E=E9=80=80=E8=87=B3=E7=AE=80=E6=98=93?= =?UTF-8?q?=E5=88=80=E5=85=89=E5=AE=9E=E7=8E=B0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 刀光扭曲视觉表现不佳,笔直的刀光可能视觉感受更好,先不让材质扭曲,后续如果还需要实现扭曲效果,可以在这个版本的基础上继续研究 --- .../Hearth/IA_PreCookTouchBegin.uasset | Bin 0 -> 1455 bytes .../Homeland/Hearth/IA_PreCookTouchEnd.uasset | Bin 0 -> 1445 bytes .../Hearth/IMC_PreCookInputContext.uasset | Bin 0 -> 4025 bytes .../UI/Hearth/Widgets/PreCookCenterWidget.lua | 180 +++++++++++------- .../Hearth/WBP_PreCookStationPanel.uasset | Bin 58318 -> 59304 bytes .../WBP_PreCookCenterWidget.uasset | Bin 58794 -> 53891 bytes .../BusyRabbit/Private/Core/PW_UserWidget.cpp | 63 +++--- .../BusyRabbit/Private/Core/UI/PW_UILayer.cpp | 1 + Source/BusyRabbit/Public/Core/PW_UserWidget.h | 14 +- 9 files changed, 154 insertions(+), 104 deletions(-) create mode 100644 Content/Data/Input/Homeland/Hearth/IA_PreCookTouchBegin.uasset create mode 100644 Content/Data/Input/Homeland/Hearth/IA_PreCookTouchEnd.uasset create mode 100644 Content/Data/Input/Homeland/Hearth/IMC_PreCookInputContext.uasset diff --git a/Content/Data/Input/Homeland/Hearth/IA_PreCookTouchBegin.uasset b/Content/Data/Input/Homeland/Hearth/IA_PreCookTouchBegin.uasset new file mode 100644 index 0000000000000000000000000000000000000000..efae4fe7456217f807bc5b0ceb39750fa1962cda GIT binary patch literal 1455 zcmX@utTpe)|Ns9Jm>C$jm>3wo0BI0l1md?D8=ky$n(~GFmf<4D-EMjsKrtOw1_m=A zt?!I$+D zq8O;2!4~L57ARj9!~gz(jlpU6z4Ipy zPd(KPvKwR$$RVsilUNv3Z^ZiN&e9rg|n|c?O1XlOK%O<$;>O zpr2QKGKi4|w7(h{M92Uby8l7J2C}mrNe;yH%g;*%hWSxmSs*7MF*!RiJ=G^aIWZ@* zDzPLpKhF;s%EbkV$*BxNC6yiI2mJSEGm}JsR_F&O7iAWd=sV{ZrH1+^Wu+#UF#Pb; zwG%^>+CkMTixrbS>ZK)_#MNP_gD z19WwNfa=)M6#@A$bsz`9089+V2hlJwWOcxZ#Q^_+_8<#_!U+UGDT^1(f@Byd6N3V! zL}*T602+m27P4ZPJJ8i|K^1{gmJ^h12@5PBAK84UG@L>=3oZdZ`j5_8JW2bKbP;DQDg%s^p006DM~f$9jBX$OHt@APj=8}zJ?Tm<<_ U2F>uYdlrE#r}k?aK*d4o0l{A(Q2+n{ literal 0 HcmV?d00001 diff --git a/Content/Data/Input/Homeland/Hearth/IA_PreCookTouchEnd.uasset b/Content/Data/Input/Homeland/Hearth/IA_PreCookTouchEnd.uasset new file mode 100644 index 0000000000000000000000000000000000000000..fcebeccfb57e53fdba5d3ebff6afa4018fbdb1e2 GIT binary patch literal 1445 zcmbVMO=uHA6rRRJYubWDtseX#6^WWQo0`NFB|?&B(?A<*f9y>=ZU*za86~6u*z5*WET3_LA!mT+Y@n%y<)J> z<38o_g-?p2#~bYTiyoio^*6zQCw@4fS=+o14Uog2aS5=ZmbBCSJ}~&|W8A(lGIwuC zTxw09z8R_9`EE6J-_Brftb+%!KqWIdx_roF1JCIkkNBJ;EX!z-_4r)gdY+I8Z?$FP zJZ!4V=$nZO8W*AeRUn8L;I@XOVb2nmLo=?(3>bgcaS)tgDrM*uHmFE6o4P^Olp@E0 z<6@pljM&uj%>UA!&E0*r2O0>YQX!RBg|Jd!$cD4DSS0GT>-Tqqx53SRb1VkhF@>WLl<@4twtupHC&Y%BN^wre%Jjgdw2cyo4C2|Crq0{xPgZJ0v2(vQH;2sfZJgNfv@B6K)UEL-AAp*cpO~nI{6KK z_#m=`f>YH|w;E4HGuJ7cLhTh0D7B^*57y6N#8@>DPE|;=1)VJL`TAPAsf@Ln2{812 ze2llTuJNKbnTaF7Tc>s;+_nj<3sU-Iu9-d;KTPzC_47@cAW|3i49?SR|zUp5av+}R&br(I{>F5*`mFchEq P)OX(ep>o`<#S#Apdq z&pKEjdT1zPQ)rwytK3sw;jOBv3C!|T2P&&(R{E;FHC4W{+N$yzZ>24qM{j3_k+*X5 z+c%0OwwFdcN9dX6T6y%HfZxCEt7D;)+J^JXUSGV|{b)hmzK&l{=x|v+=^oVoI&BiP?kW8qybLABp1e83Q@@np z9%ODZF`jm;-AZ$JQ^<%VEq5Rh)e<2d7TIE7y!YwPu%}jK4h_zlXZ3te;WKZ@is=b< zwjf~MgsEX@=|)3Oa>Giq;LeU1wzme&#<-T|M!l9yYOQh3Tx%-c9Z4%bU60%1qw;oc z63n#4ZD!|E*C(S$vL)Mcp7$N zi3r=WZLS9v0*O?+ZDHA$TNmC9W^W&9TNAe|+UDa?ZFNjHOcqH^-8%o8MCZ&2CZgPk zSyG2tYv}DVS;n4*2{?DMz;@4jVDs?Iy9i-jQ!)?XF5#=JdOc-wU&^v5!K2T+cA>;% zBqsZIe`=Lra7znQ1F%!;5C4d2tk=V_RWVN9PWdL@nMmwLE!3t(_!2#&#bawV96NNGNiD=#p_Sf<%=bxQ zLlS}}`(VS44deS0Q2AkdAN&0PDzUc;wg0GjayjynbtG*5_Cx33bdzPI98Q<9S1%&k zW@>gjl7n-sJxE!z5sO5Spzjy9zlE004I^HKBF%a#6!q~)EWs{xzTE2h2fG7_FpIZ8 zx8u41tZlMhI0nXL-}-ffugIJn>khi+6P_`DTr*8(J+kKcu`~`eUJ0HoRRy_S)eAc8HF*RC&8Er2?6cDgo)JC* z#O0bqzc9;xw&9YhbU-~-`tBFdGqNI?xoG29)P|hbQ%4B7tux->cM%_i1_xar3@pjK zGFViUE!RbIxM@JSSqx?XlKli!MuahjYI&=>|N65);-h;V1hJDZWJUb>unTBNQ^4jJsj zSz$y$0U$udj=M0!x$>)Qfpax`&#FS%74*bwofiNK?IvV@kTh{u!ne@ zF-Z|IWb1OSsra0{{@$V6?(!@IxEh-5BLg4GbBB(r$s(r;_taG{5T~?1+<`XW)Ka># zR`U!d1{@k3$XO~@i>_IBk@)<(j9i0&K_L0@D)M|shGo|rrrG%)k6MKiT#z8=CL{us zy=fDeqwzz8dsC4te8zz5ARLDxz^2`gVnTD=?uzVl7M(RrvImw>7%)jnI%9WwC2S!E z#EEZ0&_Kd=2r9EqO=9scs#Vp#&TJ_jEIBh)40HHE1@%dY>JJr+vX4)rUNk|@WTA>+ zfLtJ_Im~ebD-zM82toKx0`&M{?|)El?2Meu8$lOT1GwICd97s mukC*N6aG@yo9j#G9z2G|Q+*|Mu+`sHFUvdfadDYsK>lwvX|G%W literal 0 HcmV?d00001 diff --git a/Content/Lua/HomeLand/UI/Hearth/Widgets/PreCookCenterWidget.lua b/Content/Lua/HomeLand/UI/Hearth/Widgets/PreCookCenterWidget.lua index d5cc1b4..27c513a 100644 --- a/Content/Lua/HomeLand/UI/Hearth/Widgets/PreCookCenterWidget.lua +++ b/Content/Lua/HomeLand/UI/Hearth/Widgets/PreCookCenterWidget.lua @@ -4,13 +4,18 @@ local SlateBlueprintLibrary = import("SlateBlueprintLibrary") local WidgetLayoutLibrary = import("WidgetLayoutLibrary") local BusyGamePlayLibrary = import("BusyGamePlayLibrary") +local CUT_MASK_DISPLAY_TIME = 1.2 -- 刀光显示的时长 +local CUT_MASK_FADEOUT_TIME = 0.6 -- 刀光开始渐隐的时间点 + --- @class PreCookCenterWidget --- @field ImgContainer table --- @field ImgCookMaterial table +--- @field BtnMain table local PreCookCenterWidget = {} function PreCookCenterWidget:ctor() - self.mouse_tracks = {} + self.mouse_tracks = {} -- 记录当前鼠标的轨迹 + self.rendering_tracks = {} -- 正在被渲染的刀光 self.is_pressed = false end @@ -18,22 +23,20 @@ end function PreCookCenterWidget:OnInitialized() self.bHasScriptImplementedTick = true - self.BtnMain.OnReleased:Add(function() - -- self.bHasScriptImplementedTick = false - self.is_pressed = false - print("release") - end) - self.BtnMain.OnPressed:Add(function() - self.mouse_tracks = {} + self:BP_BindLuaEnhancedInput(self.IA_TouchBegin, function() self.is_pressed = true - -- self.bHasScriptImplementedTick = true - print("pressed") + self.mouse_tracks = {} + self.rendering_tracks = {self.mouse_tracks} + print("new track start") end) - -- self.BtnMain.OnClicked:Add(function() - -- print("onclicked") - -- end) - self.DataTexture = BusyGamePlayLibrary.CreateTextureBuffer(self) + self:BP_BindLuaEnhancedInput(self.IA_TouchEnd, function() + self.is_pressed = false + self.mouse_tracks = {} + print("track end") + end) + + self.BtnMain:SetVisibility(ESlateVisibility.Collapsed) end function PreCookCenterWidget:Construct() @@ -67,43 +70,6 @@ function PreCookCenterWidget:AddCookMaterial(pre_cook_material_id) self.ImgCookMaterial:SetVisibility(ESlateVisibility.SelfHitTestInvisible) end - -local function UpdateOldMouseTrack(old_mouse_tracks, delta_time) - local new_mouse_tracks = {} - for _, track in pairs(old_mouse_tracks) do - track.remain = track.remain - delta_time - if track.remain > 0 then - table.insert(new_mouse_tracks, track) - end - end - return new_mouse_tracks -end - - -local function UpdateCutMaskByTracks(widget, mouse_tracks) - local FVector2D = import("Vector2D") - local FWidgetTransform = import("WidgetTransform") - if #mouse_tracks < 2 then return end - - local translation, scale = FVector2D(), FVector2D() - local render_transform = FWidgetTransform() - local first_point, last_point = mouse_tracks[1], mouse_tracks[#mouse_tracks] - local delta_x = last_point.X - first_point.X - local delta_y = last_point.Y - first_point.Y - local mask_length = (delta_x^2 + delta_y^2)^0.5 - - - - translation.X, translation.Y = first_point.X, first_point.Y - scale.X, scale.Y = mask_length / 512, 1 - render_transform.Scale = scale - render_transform.Translation = translation - render_transform.Angle = (math.atan(delta_y, delta_x) / (2 * math.pi)) * 360 - - widget:SetRenderTransform(render_transform) -end - - --- 从起点到终点画一条线,以这条线为新的x坐标轴,将所有的点坐标映射到新坐标系下 local function TransformCurveToEndpointAxes(points) local A = points[1] @@ -152,39 +118,105 @@ local function NormalizeCurveYToHalfRange(points) end +local function UpdateCutMaskData(rendering_tracks, delta_time) + local new_visible_tracks = {} + for _, track in ipairs(rendering_tracks) do + local is_visible = false + for _, point in pairs(track) do + local remain = math.max(point.remain - delta_time, 0) + point.remain = remain + if remain > 0 then is_visible = true end + end + if is_visible then + table.insert(new_visible_tracks, track) + end + end + return new_visible_tracks +end + +local function DrawCutMaskImage(widget, mouse_tracks) + local FVector2D = import("Vector2D") + local FWidgetTransform = import("WidgetTransform") + -- 设置图片合理的位移、旋转、缩放的参数 + local translation, scale = FVector2D(), FVector2D() + local render_transform = FWidgetTransform() + local first_point, last_point = mouse_tracks[1], mouse_tracks[#mouse_tracks] + local delta_x = last_point.X - first_point.X + local delta_y = last_point.Y - first_point.Y + local mask_length = (delta_x^2 + delta_y^2)^0.5 -- 轨迹长度,确定缩放参数 + translation.X, translation.Y = first_point.X, first_point.Y -- 第一个点确定图片唯一 + scale.X, scale.Y = mask_length / 512, 1 + render_transform.Scale = scale + render_transform.Translation = translation + render_transform.Angle = (math.atan(delta_y, delta_x) / (2 * math.pi)) * 360 -- 第一个点与最后一个点连线确定图片旋转角度 + + widget:SetRenderTransform(render_transform) +end + + +-- 更新刀痕的材质 +local function UpdateCusMaskMaterial(widget, texture, mouse_track) + local transformed_tracks = TransformCurveToEndpointAxes(mouse_track) + local normalize_tracks = NormalizeCurveYToHalfRange(transformed_tracks) + + local offsets = {} + for _, track in ipairs(normalize_tracks) do + table.insert(offsets, track.Y) + end + + BusyGamePlayLibrary.UpdateTextureBuffer(texture, offsets) + + local material = widget:GetDynamicMaterial() + material:SetTextureParameterValue("Param", texture) + material:SetScalarParameterValue("VertexCount", #offsets) + material:SetScalarParameterValue("SourceWidth", 512) +end + +function PreCookCenterWidget:GetValidCutMaskWidget() + return self.ImgMask +end + +function PreCookCenterWidget:ResetAllCutMaskWidget() +end + + function PreCookCenterWidget:Tick(geometry, delta_time) + -- 计算鼠标点被限定在该区域下的坐标 + local size = SlateBlueprintLibrary.GetLocalSize(geometry) local cursor_pos = WidgetLayoutLibrary.GetMousePositionOnViewport(self) local left_top = SlateBlueprintLibrary.GetLocalTopLeft(geometry) - local fixed_x = math.min(math.max(cursor_pos.X - left_top.X, 0), size.X) - local fixed_y = math.min(math.max(cursor_pos.Y - left_top.Y, 0), size.Y) - local mouse_tracks = UpdateOldMouseTrack(self.mouse_tracks, delta_time) + -- local fixed_x = math.min(math.max(cursor_pos.X - left_top.X, 0), size.X) + -- local fixed_y = math.min(math.max(cursor_pos.Y - left_top.Y, 0), size.Y) + local fixed_x, fixed_y = cursor_pos.X - left_top.X, cursor_pos.Y - left_top.Y + if fixed_x < 0 or fixed_x > size.X or fixed_y < 0 or fixed_y > size.Y then return end + + + -- 更新鼠标移动轨迹 if self.is_pressed then - table.insert(mouse_tracks, {X=fixed_x, Y=fixed_y, remain=0.5}) - end - - -- 计算样条参数 - if #mouse_tracks > 2 then - local transformed_tracks = TransformCurveToEndpointAxes(mouse_tracks) - local normalize_tracks = NormalizeCurveYToHalfRange(transformed_tracks) - - local offsets = {} - for _, track in pairs(normalize_tracks) do - table.insert(offsets, track.Y) + local last_point = self.mouse_tracks[#self.mouse_tracks] + if not last_point or math.abs(last_point.X - fixed_x) > 1 or math.abs(last_point.Y - fixed_y) > 1 then + table.insert(self.mouse_tracks, {X=fixed_x, Y=fixed_y, remain=0.5}) end - - BusyGamePlayLibrary.UpdateTextureBuffer(self.DataTexture, offsets) - - local mi = self.ImgMask:GetDynamicMaterial() - mi:SetTextureParameterValue("Param", self.DataTexture) - mi:SetScalarParameterValue("VertexCount", #offsets) - mi:SetScalarParameterValue("SourceWidth", 512) - UpdateCutMaskByTracks(self.ImgMask, mouse_tracks) end - self.mouse_tracks = mouse_tracks + -- 更新正在渲染的轨迹数据 + local rendering_tracks = UpdateCutMaskData(self.rendering_tracks, delta_time) + + -- 绘制刀迹 + for _, track in ipairs(rendering_tracks) do + if #track > 2 then + local widget = self:GetValidCutMaskWidget() + DrawCutMaskImage(widget, track) + -- UpdateCusMaskMaterial(widget, self.DataTexture, track) + end + end + + -- print("Ticking", #rendering_tracks) + + self.rendering_tracks = rendering_tracks end diff --git a/Content/UI/HomeLand/Hearth/WBP_PreCookStationPanel.uasset b/Content/UI/HomeLand/Hearth/WBP_PreCookStationPanel.uasset index 2c7d41715e81e898cc595caec719215a4f93e8d3..2829fdb152958d329d0ca50207bd88a6634491fb 100644 GIT binary patch literal 59304 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 literal 58318 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¥uQ(sBO+}L%6 zE1Q6Gz3sED;;rJ+qAX$Tc{ggyl0KAzL?)wiT8|y@v|Z5pQG=EojNv`?i){X23W?s>5}Z<^%ws*?DS z;T`0Zd3I5zoSK%NdW6d!*0vf+{mRA7Yd4I&*aZ#ZQnu{Ko`Mu$-nBq-RFY(wDI2~U z<}Wa%Hk~7<-sbl%ODXZ=k67_2>%LRJ%2qOdzqOA-1@?O z$@y33%f-ScpC+)ukz`> z)j1U=h@>m?_o*_;aOzN;R{AvVPIB2c8F#(Sj{fQW4$a*Z*ZuF?mqkaUslr!dS%c!i zoX;lBPX1-?md3gF_IC|vc>aE2`r5Mor)6`(GxA|Zx-cf|j9uFqGmbpU5tU}`G+nWA zRpIMMA1 zJgbdc5`XiMz58TqO0yR?Tf27}-F!u^N!YxB7dtgF{P2`x`tA0gF1dC;d-nZ@KKqU} zSUB?WXp5!qyB;qbUY0eh&rd7ITyQ-yY%jFTugM0$!3sZ_Fsssg&T}7jcPt+$nV~gHjKaGy*B0fteJO>Cv5!G?_hq3 zNz#^IJ)xuj@Ihi+Y$)N$sT-N6WleI$eyQw!LNM0oRj;jq$wosiLoE;Zex_BOp zVr8;Ba_VJPmY*5BUq8D7BQ=9=@yLXvZ&R6#IDW8M^7E z$?UidS#S2HWW+yRR>bxgI$8xa+q+eD~>-jQ!>?Gd!0kD<2F? zxpgp87&(~p;aSG1qc;1DFUzS_CO_P9m%$tvQFsZ1DJAcJ8MS@j23@ zjmAZDlclA$aw`5jpeBRojr>lMy-#Lz6}nR{%#{-}%S(lCwuKKZY`yX2Ya{QVecvS1 zFW8>>jf^W@*OExIRlP(rr>@VrWZU-AiJ%3Z=ZzP-va9yPnw~;q>AEKNEqg|zG##{) zX2-O7p|MSdyR~ioU6(N%;;s4yOo6HW#qWmj9;QPpTDgCRdU4L&*yC?>{VL4l?HhkT zk7LSx3A!zLdjzJ;uCjJV-f~dYpO={$g96^P7jy3vN!~qcR9<$bbJ%hb}8MNc%n!83O zhnF>#tmq&ua4UQ4H-N2-IoZ91d)X7s|z4$qE_A6oju^;34K5pC~XI`g4&*7Wo^Yj~V^G`VtkOpW~Z zeQJi=m5n||`@B08)1z*m5u?~E$LDFRiLXV*S?+E7tG~;szk3%*|EL(h{e9x5^*L)a zJ?FXW<-76CpPb4xTD)!NY_of1mybLb`>hFB<{JykkIc-I8;!p_E6GfjuIs{DJ$fuL zYwkZrw7_J%-$CiZg^7N?+b6EbeR9aV$aa#fB`)GK3QxeUz}N{!8L+S^X$HOiDYo`fnz)0l(@5MHye&{D;MDDX~5$<*W~g@w{k_ z4=(lb^Tzc2@<>U!VODBds^mhi53<7?*}Tw|#%)GS%s9Pvs|~jiEabVR4Kyr5Y%dO>iX6;R9?}!{=-|c`ER=a`155dpBWsBjHng+AS3%xRBhkMKBnPx?0 zJ`CPEws^*S$0~av>^%k_mV8NXVxt-`s^++?m#IpJ*5=3rqcsC(&Whjl;Pf0H&KWt?!{}x)nVL;L*fI5#cS^_c);&Y- zWd;r(H$C;h^Bc7b#la{DK|G~ znXe2n%JQ{XFoeqMQPlg^FT0NW@P&cGW@jTO4#{fL^zem_g?n0VIgm7SjA{R&=A7b2 zBZjw_9^KQ|+Io#FU)uI>IaL*{LEe&G>0d;AK03X=%V*ts`gQ8IeBzr@({|5N;<>Oi zIj|!jXnk}C8SMNR7KS(STs-!-xD-Er$R#SF?S}b(Eg$n#Qk7p$JD;1on=W7PA(cGn z8f@l%?P&&^xfh!FoEvR& zYoEBwm@fTGo^13_+S;ccHD1(GG{WpsNLu1dr~alxIh^8#))v;O-ia>Ww}#Em_*i@o zIn`w0Vk!2-zxm0jC3_lg*`K#vnz3A3f9st9N!~*R^zQWMA64?pq`cL>9luWf*;T*~ z*x{bkv%kRq(A-_Kx){MGKPO9i^;@q$p6(gGWqDf3;=WJCew#d;v!th2!!+huA2OHu zzj&43A@9%dimx$S0V#jW0$($-zMjGU0tV#?@0sxxvC=b2-?_jS_G&o5H#Gd=-L`Z# z6oG&;Xu|6b`Q!^Q72g!>uY^wjVI({RU>m~|gyFaD@Y7B~_)!mhb*?x7QSq$~d-y6B z{arcC!B^-NIq+pS`g@A_QM->b6<>LyKj?;;ZGkGDto)P|W_`lWqQ8lysftxf)1PCb zQ{273ba&*A7mC8+8)|s^gZ?&+Qy4EeiasPVz{fZ+OBXoe1@8&z z|8|3NG1i#5SEL%i!z9*`i8;d?XCb^*9s|Gj@Wwd?-Y(CeqUh9UYCOEB76OGpY7{)t zoO#Lv?joTarba{AX>cy4x?F`sb(f(bBZDuzKUYZgaY}urOkL|sIJ{(zk6tl@ws#~*WB}*Z6uMBCPjpo& zM>FP$k3G!*x+9|5NLF2az|SHpKZw33Pge4o3%uq+ zYi|jp)T_oo600v%?ggus?ydfdUaCLK+h1*m-J3qx$odE=d{K}ung$=vQ}nLb6GAS0 zm6IP-(Gf<`r?vX@rMoVdDD0iwBEsV6bAV2~uqgQG9z3S_Br5wmdw6b(RFd`W+WvI! z*PG;2e(<(`l`l;7rU#Sp(czx_$T0X+Bz`ef@x4F+2#bS_1wG`s!}q7eVt$pO08f?a zQW89wM?OnuCx{4wPnHr9u!F}h(K(6W)3E%Az&QGtCw@MbwtLl&)X}|t#aAhDz^aP5Oi;(IX70n%#&VT{I1?bsfEMWOEe;MJvW^jdKC?GeuGOI5Q8w zrAv>kkou4LlCFIQPt!e@XZzNND<0aS10I3HfL#Ix%)p~wB;YYoIuW13vvU~O1@L?$ zJt;v$V!*?H?9d8N&|%;yF7z+fjW)j>^Z8>ux>*sl77D@D3e_Gmbtse@Bi=`qN0p&& zF?^JX303N*mJN0wYT39dv#Cx+J>UUa!Ps=shyk z=l$40VJD333L(%K*u7{6X9p!Q1Sl@F1ER1PP~8pbnBu1pFXNa5_5*mj7XvWPjCElWRb~>spaLj%7LZ9e(41*~K#VPyI%T&(L2IIH`p77rCB>jZp9!Nh zSYnO621_KIAhjS`XIFrv>CzI4N}xpuGP%~y5>~*FaG-hD#1gSJwFJ$)w#u#)lqgmk zWiP>6ji#$s)xB!q_Bw1g*!5vxi(Vs1h_PyC?tuVJIM8zZqvqc3prLJf+7m(lSLS}e z^m4T}cO?TNdM(ZUF{9d zd~4zdt7|%_)6*+^8b{^ys+Fy#5ns~~(B6U6;y))*{A)eb@>oXIc%diw8mHQ59im10 z!J7EO#G3j-PlV7gsE_`iH+!;lsr8^<$$+S_md*ZSMzw3*XcHnzjV=1$O7)}Wg9~}J zE7bvYQTBf;RnT7Lq=q=HTDR9|30$}n4iHuRi)*~HXKm{C4E|fGqNcFtsD}|IuqMN# zbE>qK{(Cu%<{k_({(H>*-%3@D-;gy>rLk()x`+N}ZqPtAO8!5!Qq|bHZT>~({%@sP zt>e{YrK-^n#@EFU{#&Vn_Wq6A8MPY%rq;z5{#&V5zNM=ii~r#{91dqy=5XW>%6zm2 z!$01FuWKK>dLF1DOM<#mBeX+TpA1oY3%U_W}5jS;dWN$7Y&t*x<`- z9Y_wX>8)-Gpn+29KtzRdKX#*x*4;?JA{F znpoYinW-B#Vy)T0Ul~)c;yB%~nWY;x_^%MOvy{e4&Cv~;xyo#Ch{M1h*&P%~syD0p zWZfS@Q9DL{pDh?kQ3)Ki<3S_fQl;YhgKDV^#m2?C$$TIKAXG61oLq=S(Kw{2$-vUM zG{S&_4|K8~Z0~4cImE%r$-#c0g}sG^rQP7cgRC6~3>e^K;iUMpj#wIn!GIjtla$6J zaTr9@YOM)mcEFMll&4`T&ro8gMW3m&7Yak|g%M(&Ac8M)i{XpHcyUz?P~E(zLc-y| zQmuqoszwshlLFl6Lo9H3MYXWc!~@COWOetS9@Tp!fP^!jklQJN$~H>;6^I(AN5 zO~Rp}Y9ySVoYPK|ka!THMnckswedl06BxQGE_4Tps|yU+Sz@P50^Jp1H-rJFUKrR9 zS}BrLKZx^K3~E;hcnDAJ6wMtn*#iju2Zxaz8(*W~*hOK`z2I1FwSr@H|E+@K!6>zY z;P#MNH^KGiIgK!KXk1hH59e&QM70Tw)|-s-5dpX;WI`jn;&R+S4%}?s%!K9}coQ z#zU>B#lxA0c6c=&m8$h0>;~2P56%Ir*t5p?xDkXwZ6A%}hgy7`+}91i+WKP?QHzgj z&br}OTYv0Z)Z*g?P!;?@NWg%bh9pcP5t`4W>Q=k{^qSae@IV`@0e0|b0xT^CJJ=1d zw05+#bF{Ir7&yez*1>TARSxeIZZ5y?tHEvS18}v{5vNzwQcLLu*jriK4z_f%8f0y6 zHN@K9&f3Y=YOsx^rGtZ$qmAt#_$!uj`IVr_Zg0F4OMFxTdmCgjqZ8%1DK>j*DwD~6 zK;ym%Q=YjbRGeTYbz^T87-FgBK-FsIAF~^ZSgmxVZvS7|4Lji~nyGI5!Zj=XPual_ zD?TnlRQHiv;Dk}TeqL)_XrC1yFj0$(yH+~J{SsJC1VSfPi#rN3b&QJ*8}U#Oz#RBjw< z8RL|uMvRr5SS@3pnljd>vsF7a#Pz2tHB`Jw{dY|bQR_7mSIKPu+nMZ?8jGt>XQ+0% zVyZ^mY6pIOE*Gkmx>s$b)~9P!D>ZttDo?If*Z-)8^r@}X`W&FD)pg(6O06_X>9q5x zc33r2BlW*_YKZ4hRJpV!f%Vx2tJQG7S_rJq=2xx2xLs6J4ePVzRVy&=Y1LF-bs(9CVYKZRvYQ$K{iPcJsFBfXWSjpM&-7W^)+9m;e37Y9>VK{#rFCwVFk4yj2 ze4a=g(w~{TRr!g1JQW7qv}{Dj6hHJ(#@y3~ z=ms%2)0iu}9?dWfpJx85?+m8QM=zZgKn8BLWB4c&{vf;@_pmUGqJI@X^jl2aWDQ{w zTQXOanazck6BBU)+zki=yD zPd$-9YYq?B6F0D7a@bm<3(bcNJm7%gBPXKA0LWm=hOhB3V1?NgqGdB1a%1eqvc=`#o&an`(+tNiomZ24!1v(0rLo<__AT9<2sv9j6TE>h{VV%ddBJ?Hr3L*jNa4P=Uh|%1 zBoAPNEl4XNuzjdl)z{HZ_m#xK##4K7EbFQrWpS{Fs=YV^bt#S~h@!QzG{2D1q0LY# zt!<`BDxI1RrPA7TnxxXX1siDVP@1H&(zRbT)P+>mx|9kxaJBY!>`0lesp<<49XdJ+ zq_v}~5lE*#jsj`z<7x!bse7Y9TD!LzfpqHGD3I2ktwtc7I<*f7q_tDGfx?Vav))qZ z(4$crtvyltycJRwa#2ec2bJ!Jzfn&+2#dFk2KVq|r_sR1Rx7Vb8}85!JPC z&W3p!BLv;1a7s!7?xd5@ltkd_%8KI}hJ@}Ug4d4Q=u^zNr-osk;zIvctaRY+D@>U{ zCs(e#@D_cB?so97F$VUkn=FqoeF6S-1HwMa0>}!;4G34?sNhJTfk5s+JfHxeKp@P$&?tk;8$kfgFHvV%-S{Cm~{>XrLIN ySfH6eVk`n>TOvc5gQ= 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 diff --git a/Source/BusyRabbit/Private/Core/PW_UserWidget.cpp b/Source/BusyRabbit/Private/Core/PW_UserWidget.cpp index 88e30d3..0b5ea01 100644 --- a/Source/BusyRabbit/Private/Core/PW_UserWidget.cpp +++ b/Source/BusyRabbit/Private/Core/PW_UserWidget.cpp @@ -4,6 +4,8 @@ #include "Core/PW_UserWidget.h" #include "Core/UI/PW_UIHud.h" #include "slua.h" +#include "EnhancedInput/Public/EnhancedInputSubsystems.h" +#include "EnhancedInput/Public/EnhancedInputComponent.h" UPW_SimpleWidget::UPW_SimpleWidget():bVisible(true){ bVisible = true; @@ -36,7 +38,6 @@ FLuaWidgetEventHandle UPW_SimpleWidget::BP_BindLuaEvent(const FName& EventName, TMap& FunctionPool = LuaFuncMappings.FindOrAdd(EventName); HandleIndex += 1; FunctionPool.Add(HandleIndex, InLuaFunction.value); - //FunctionPool[HandleIndex] = InLuaFunction.value; Handle.EventName = EventName; Handle.HandleIndex = HandleIndex; return Handle; @@ -65,29 +66,22 @@ void UPW_SimpleWidget::BP_EmitLuaEvent(const FName& EventName, const FLuaBPVar& } } -FReply UPW_SimpleWidget::NativeOnMouseButtonDown(const FGeometry& InGeometry, const FPointerEvent& InMouseEvent){ - slua::LuaVar SelfTable = GetSelfTable(); - if (SelfTable.isTable()) { - slua::LuaVar LuaCallback = SelfTable.getFromTable(TEXT("LuaMouseButtonDown")); - if (LuaCallback.isFunction()) { - LuaCallback.call(); - } - } - return FReply::Unhandled(); - //return Super::NativeOnMouseButtonDown(InGeometry, InMouseEvent); +void UPW_SimpleWidget::BP_BindLuaEnhancedInput(UInputAction* Action, FLuaBPVar Callback) { + UEnhancedInputComponent* EnhancedInput; + if (!Action) return; + + EnhancedInput = CastChecked(GetOwningPlayer()->InputComponent); + if (!EnhancedInput) return; + + EnhancedInput->BindActionInstanceLambda(Action, ETriggerEvent::Triggered, [Callback](const FInputActionInstance& ActionInstance) { + slua::LuaVar LuaCallback = Callback.value; + if (!LuaCallback.isFunction()) return; + LuaCallback.call(); + }); } -FReply UPW_SimpleWidget::NativeOnMouseButtonUp(const FGeometry& InGeometry, const FPointerEvent& InMouseEvent){ - slua::LuaVar SelfTable = GetSelfTable(); - if (SelfTable.isTable()) { - slua::LuaVar LuaCallback = SelfTable.getFromTable(TEXT("LuaMouseButtonUp")); - if (LuaCallback.isFunction()) { - LuaCallback.call(); - } - } - return FReply::Unhandled(); - //return Super::NativeOnMouseButtonUp(InGeometry, InMouseEvent); -} + + void UPW_UserWidget::BP_Close(){ APW_UIHud* Hud = Cast(GetPlayerContext().GetHUD()); @@ -105,12 +99,33 @@ void UPW_UserWidget::FrameWorkSetVisible(bool InVisible){ _RefreshVisible(); } +void UPW_UserWidget::_UpdateInputState(bool bNeedRegister) { + APlayerController* PC; + UEnhancedInputLocalPlayerSubsystem* Subsystem; + + if (!InputMappingContext) return; + + PC = GetOwningPlayer(); + if (!PC) return; + + Subsystem = ULocalPlayer::GetSubsystem(PC->GetLocalPlayer()); + if (!Subsystem) return; + + if (bNeedRegister) { + Subsystem->AddMappingContext(InputMappingContext, 0); + } + else { + Subsystem->RemoveMappingContext(InputMappingContext); + } +} + void UPW_UserWidget::_RefreshVisible(){ - bool FinalVisible = bFrameWorkVisible && bVisible; - if (FinalVisible) { + bool bFinalVisible = bFrameWorkVisible && bVisible; + if (bFinalVisible) { SetVisibility(ESlateVisibility::SelfHitTestInvisible); } else { SetVisibility(ESlateVisibility::Collapsed); } + _UpdateInputState(bFinalVisible); } diff --git a/Source/BusyRabbit/Private/Core/UI/PW_UILayer.cpp b/Source/BusyRabbit/Private/Core/UI/PW_UILayer.cpp index 1c6f84d..250448b 100644 --- a/Source/BusyRabbit/Private/Core/UI/PW_UILayer.cpp +++ b/Source/BusyRabbit/Private/Core/UI/PW_UILayer.cpp @@ -65,6 +65,7 @@ void UPW_UILayer::PopWidget(const UPW_UserWidget* WidgetInst){ } } for (i = 0; i < NeedRemoveWidgets.Num(); ++i) { + NeedRemoveWidgets[i]->FrameWorkSetVisible(false); NeedRemoveWidgets[i]->RemoveFromParent(); } if (NeedShowWidget) { diff --git a/Source/BusyRabbit/Public/Core/PW_UserWidget.h b/Source/BusyRabbit/Public/Core/PW_UserWidget.h index 631dcd2..e3f2f7c 100644 --- a/Source/BusyRabbit/Public/Core/PW_UserWidget.h +++ b/Source/BusyRabbit/Public/Core/PW_UserWidget.h @@ -51,10 +51,8 @@ public: UFUNCTION(BlueprintCallable) void BP_EmitLuaEvent(const FName& EventName, const FLuaBPVar& InLuaArgs); -public: - virtual FReply NativeOnMouseButtonDown(const FGeometry& InGeometry, const FPointerEvent& InMouseEvent)override; - - virtual FReply NativeOnMouseButtonUp(const FGeometry& InGeometry, const FPointerEvent& InMouseEvent)override; + UFUNCTION(BlueprintCallable) + void BP_BindLuaEnhancedInput(class UInputAction* Action, FLuaBPVar Callback); public: @@ -73,8 +71,7 @@ protected: // lua相关 * */ UCLASS() -class BUSYRABBIT_API UPW_UserWidget : public UPW_SimpleWidget -{ +class BUSYRABBIT_API UPW_UserWidget : public UPW_SimpleWidget{ GENERATED_BODY() public: UPROPERTY(BlueprintReadOnly, EditDefaultsOnly, DisplayName="是否全局唯一") @@ -84,6 +81,9 @@ public: UPROPERTY(BlueprintReadOnly, EditDefaultsOnly) EWidgetLayoutType LayoutType; + UPROPERTY(EditDefaultsOnly, Category = "Input") + TObjectPtr InputMappingContext; + public: UFUNCTION(BlueprintCallable) void BP_Close(); @@ -95,6 +95,8 @@ public: void FrameWorkSetVisible(bool InVisible); protected: + void _UpdateInputState(bool bNeedRegister); + void _RefreshVisible(); protected: