From 7fba61f7a0f909082407618299c8bd0301cfe07c Mon Sep 17 00:00:00 2001 From: Valentina Date: Wed, 21 Oct 2026 14:06:44 +0300 Subject: [PATCH] =?UTF-8?q?=D1=81=D0=B8=D0=BD=D1=85=D1=80=D0=BE=D0=BD=20?= =?UTF-8?q?=D1=88=D0=B3=D0=BE=D0=B2=20=D1=81=20=D1=88=D0=B5=D0=B9=D0=B4?= =?UTF-8?q?=D0=B5=D1=80=D0=BE=D0=BC?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- Assets/EchoCloudMat.mat | 6 +- Assets/Scenes/SampleScene.unity | Bin 660972 -> 662444 bytes Assets/Scripts/EchoTrigger.cs | 256 +++++++++++++++++++++--- Assets/Scripts/Editor/CharacterSetup.cs | 8 + Assets/Scripts/PlayerNoise.cs | 37 +++- 5 files changed, 268 insertions(+), 39 deletions(-) diff --git a/Assets/EchoCloudMat.mat b/Assets/EchoCloudMat.mat index 40d38df..c1c30c4 100644 --- a/Assets/EchoCloudMat.mat +++ b/Assets/EchoCloudMat.mat @@ -80,9 +80,9 @@ Material: - _BaseColor: {r: 0.015, g: 0.015, b: 0.02, a: 1} - _EchoColor: {r: 4, g: 3.026, b: 1.049, a: 1} - _EchoCoreColor: {r: 7.5, g: 5.5, b: 2.2, a: 1} - - _EchoPosition1: {r: 1.5618706, g: 1.0799999, b: -34.510273, a: 0} - - _EchoPosition2: {r: -1.1804235, g: 1.0799999, b: -35.782673, a: 0} - - _EchoPosition3: {r: -0.93470556, g: 1.0799999, b: -34.72166, a: 0} + - _EchoPosition1: {r: 2.9648588, g: 1.0799999, b: -29.737446, a: 0} + - _EchoPosition2: {r: 3.705747, g: 1.0799999, b: -28.43126, a: 0} + - _EchoPosition3: {r: 7.0987725, g: 1.0799999, b: -9.685643, a: 0} - _WaveCenter: {r: 0, g: 0, b: 0, a: 0} m_BuildTextureStacks: [] m_AllowLocking: 1 diff --git a/Assets/Scenes/SampleScene.unity b/Assets/Scenes/SampleScene.unity index 1364637d962f2a8ffa35c79d780cab5146bfd4f7..281d04d880f0baffca100703e43b9c12b0138796 100644 GIT binary patch delta 38069 zcmc(|33yZ0_V<4}(WX!gGYPZ=0R;;6bWAEx4~hd|AvjN9xQL=cjSOC=);J(?6$~mY zConiq#h_ksf?H=%sL_iv)S#${f&p=s`hM45dlyrD{?GgTf6w!Kd!OSuJ)iSkd+oKS zwNFCtcaIHze9ho!&*FO?vG^yy&*SQxc~4TE@t-Q&wo9r?>~l-4)<6IJGb3>I=zovS zIPS%av!7~=CNkD6elg>j{uwvpm$x(4jA_X@CnM+fT+7O!(VJY|)--*VF|b?z!}>2S zV0*!P#p*zua&Wx)!3uRhLOb_l^z!)b6CB4WAIDo7C#diT;K==g_hwj@50@L-)U}L5 z4+*ZssS}R5UAHRZF{)?mJS_N1oZz2ziN;OT2<(kY0IZon2jRF>W9w0B`5~jH$9WVt z@pCnf4miTKBRcc%2`bpjzCFgjSk`779dXRoI7Fiu$0V%Qn^~5X4Se?Om{Nyn7Gw8n z+{4dpIQrt4s&Sl_E8|ZxwAy@|rg4fkGPa)*+*Y$OuPEbj+Q&HbbUMCN<0K9L5fzXB zTd=A4I6~nt75)UD!)ryoQsaj|9Ivo% z9ZmQNKF8JxPvFF%cvSN+)w4YLAHfbzZX5$9&JuYOtzvnw2{-XG3kR3J^O2jib6X(y zI4?1@+Uj)MLE9BhQo+x_?pFnKhhp{oe^2H@tR@-->~&t_U(j)Iux|@AcE3(_Kcn!- z>r5@n!NEHFgp0L&Ia{~iz&-q!#(w>x%N35(Mz-#IQ?P~R;9h>#N6#qiTTiX9?v1Y( zZsb!mx8I_YUr@UJws0HzJX|)lyrA?Un*0m5%Lc(b5_yEatZ|GMF^)D1Hbd~-Pr7#D zI|*6~>J^SqEo1w? z>G(X2<5bT$vPrP%=jUsjqDG~DU$E(@Z-4Nhc72N~`y;_u~=wrc) zH2ywst->i9#W?AJ}Ve5zPIH+w_O)-s!6D zv{3VJ2wN!ME(`+V)OB@ zgqucvOmq8dD*6NFt?j~%dySfhsrC<;k88XXPqBC3pL(J)AN+6B9vTe1p z9;aErUi*8&#<#~b#?-oEAAAp|ggZE~b8npdw3csV>!IC(12_%9v0mdC?PKfFJ%Wwv zZ)@!Sfl69AuzQ8yfYTv38p6*i>rtBA%2oSWu<2BF5C2Eu2rXjl`$e!>vBDZR(OO_{ z^jEDW4)%PG#=)GWD`4C1AlOU< zcg%Q6sl!V*!gf;A-gt=Tfg=w~Dr)5|ZH4W4o`_Ag$7pQ3s3Zf%t$g98-p6PjrpXzZ zn4>f{%hpX9#XV4n6{1CqlO08Es=Ziatn-Y01%e$YxZc-n9--Ac8C#vxeY;NM2o+`m z2MUvZORdb4eTAE$a@Vdm6?Yd> zNj7+-Fx~!`iSH|J710#t(IVldddFz)^rOY#9>*u#RIjRP6fezIgw|%GX;K;+_iNTV z3WsSYWB0-7r8^p9Mb7~a4G?U)l&B zC(4DJ(Dl$fMr&E_t`zLRB1dlGtP{OBS;0!$1-Z9La}%4!3ug9V?o?4x9?U1JL~r;L znun-156;^G!6tO8HO5AcaZ+RB{EYAtWj#WTjIG1deZN5C1Z`pLj7azWn!U@ky1)hO z8=3CfbsEQL6yxxybl0xeI7zdVx<;^R)pxGFT^Wzka>ni>((#(kPw28YGPWGSD-kO0 z?$fNV6vjRd*lUj#Y#L>{#@3Nkl8>l{j}-1e%B`{^a7|yF(4Qygv-~K*++(;uZ@cm~ zh3zr4nB~ba!cC)mr8)9A$UXKkf=#1r*EmKy87DPNP;$*u9ZR&jk+H8q0H{A-`C((*d7z&}2 zgqvg{XYeS+-6vBsxF>qDa8vVK%|o=0%_mL~?4V?>`Dds6Eb>#SqyXk)rwTW-_g2k= zr_mH}kA1puGkZVtN~9mmSYcXJz?C~gu!-EW8b@g@GHg(O`*PTpG$SH=ZT#w+<^_Q&Dk@2KAfy1Ek6kEhR+im$1P6$rfTe)LCs1&L-=Me zet$Gg^9b#O+|zWvU^C|xfBTsaPa!!Q?gma?AlNuJTw@G<#=e zF7LoCr=B`@g}kX=U)=(O*Zc%wyLHH^F&AbKiU_=?3pp^M#wr zuhtx|Yr4U`*!6Z+W@9@V>7Vwr-)$J>XpYmh{4BX>Q+2 zHQ*lWw)E03(i{!n1LorzFNA3>eaAH}4uj<^r4=ksEfu+m?01?cXd~nvHwnH&%lDLy zP;xBwY~8+Hu<15?HMZ`clAf?0zC*YJId_}A&(G8H$vt7+zEkkSIC0&>+gB@`q(#8q z=-q-%+-Ga-UQX*^-J4u4+ys8E=D`)Ti+OZ~@Rcylb?;C(au80Ia}O2uf_F{#2shs6 zX^!1{FBEUB6zo94&PTF4AA*zRtfU5(CpC}b9#56mXdb0TmOJ-}{1=>jz}Ff11JuHD z--E)WSY}qWt4r2qKV z(F$XvE8}Ygn*{EoF%1f*sGtwj;dO#d0@roP^BRu=_QwAs*sKq=pMIyX(?oTB(AiT> z!uc&g0eqUMx%*{W!94h~@cY4d_t`M^A471mtXHTR+!J|4_$J)q-W<^!2_Adrye8Om zi9=U?t>pM{rZ2n;y)M{vi6I)>Z_t#!upWCuxC6`FC(gR*w4pd5>sZ9{$eV&qvrN(0 zT2JdB_a@d0H|-MA+`R=d%-b8Os1Q7~QMhTi`%b?_akSh7aF3l3 zz7j5RhoA3xMY~sD$hCV{u&LbwjqUen70YAq33njn+Wq6VyNYo_?Y6Ky@?XKGcIRkp zZKBRaT)R!eP3_Lr+6(XWc@c_Fekj<1 zguQFY{g=o;qGmSl{!}UD+;5{2f}*z zcfp&X8;@D`KB@!v#PrO4_cY@=fKP!9$yCLQ2dzMzp5XI((pm3T|#3soB}=eDf@Ui z&)A(MYUADE8e^Vk9LyH%paAx6q{i6CD|L?Gl|UTX?~dtJiW5F<*$M1*I;0!lrLjAg ziVi_&BDv|-OV8@7<+X>P@KBy$Q}uFdb{?7STN{v_ZLr{34k6<$zw-WU~R!8F=6loAI;jPu)B<=6eF;)GU3MgTQui)^WYx4Lb&mM z`LM2hiKTHZn|J#K55z6bI)-mARoL;H>341&BIhUj6+u~ax+>>HAW)OIHmDY zSmrKwM6KtbZ@}RoD;60^|(MDx_ zT)O%Ojj>;693P*qzJ1|9KbMUxz65O&t`+_gYQ^*r&e!aY@IIHH28NK zN2tIC4xS;{RBV^Vcr^#?wayf58vKd(KUBu;e^8x`s3!g)+zh1Enqx(0>ydK=a}Vr< z<0*}sXd_z>PZxYQPT9aO|9N`=C(Av9TG_fYBc1>HNp&@IGzH0@Wsd?%tLlwr$;KdcFnRT6TQ}bz>;|&d456%~C zYBpVCWO0nG>jj(qc=(yeDC=0yD^a+!K(NUMI^G&n*t&rxRPwTOLwex_n)?<~1Gp!( zFunAHG!IcDn~(iVu<7qV4d0~9J2z4b%bRW#ZX)-K=20rBg4|jp*g>>7avNU1brepP zvxsV{AWvv+#&Waf5t;?LCv>yO%~%dBUasWWvaxk1DtHqt^89 zk@x7D6;yNK_oo-$s4+fjXB>V&u<7nkXpE2AmHI)!W~46ieyS_J9N6nTB-jM~W{uqs zQ*$+Zi|_=19|s3VeMawXTE361haM4ZqJDwKnB5PD_4uQLjc+qG_B}>Z4#!{$Jto{Z z7b`#Z2oz#jkJDo2k;jD_@9xz+*huS`H#G`(AYtzwm@roKt7sSV=qll6I6S1e^8^)* zK<#{S;buJi`}rr79$&B+0r%Zc2{yf=dEGAxJ5Nyqb@zpTFNo2{8dmWsx0E}X6KPzgkTrV89#%Oq8 zZ|r%&D}h*@b>$}xPFC;*S}~G)-3!7^Y;!cn49{}+TEVR0&~Cn^Y&1?*a4oe$?v1=E z+)SenF8x?>_iI!#3g(+$6P|*G^QDJ1$HI>9|9Mic3pVrM6??lJ$>x#DF?PQx*f>|O zF}7@sgX;x5P_T2;6N|KZCu939!6xqKX&k4*8sNy=f=$@Z*EmJBjO`7AO{aXj{1RLM}r7?DFN5FbhLa_1eCXMZP zspbe+55Fti%&|i!FFOhWKsq&x<)QZke}_{xZa;Bu))>aY_h|*oBkv369?c&`uGSpi ziig}|e;_yl)C0$Td4rT3={w`#hk}jo4``gA;SLIqeI(fU{*cD*k7i+OCbaO2+7n)|j;(P&gY zwMDq`?-|W8+DEhdErK6`X&x|pemq8*4}L}sEKhtU+_<+_^B6U<+`Uz>11Wp=(&Y0* zzLi=a_cm#6ygPW#0>z!rsq>NGscoVk2yG6I8Sy(5_kBq<%oASF*Gn@3D zdYj0Q$N}kv|6JlUaftNVwI{{&axIvuQEp-llBf zCazO8cXDVQn|F5*ZUQ?^^9b#Pc~6tZrcW+Olq>UiMRP20DmUG^TQzQ?TE@03-MMMk zZ_(;{##X-I`{6f7Zo0BQ&-OsPl0=mHux54E!Slt;L6uTJw24Ic~hF|S|~`0ZzvjAiG7eQ3&9$P;~pn{Kf~ z^B65+xw}xX0||GF!1Ng+FQj!WPibzvJ6!WH?S$Op^hKR)D(_Oz#W2Ewook8iYkG}b9t=_`eK18tb{3wm_W^O!i z+uTV4x}8J$hA*tc|FUcmFb0Fqp`b+RzdDfRtY!FcAe%yKeaHA`h}Zz z+w{9etYG-?8hw+{P*Hj(MBae`_YTjK;rV34zho*HAQD?DECWkB4i0;}&;#v{}S z?2R5T*u2<0q3)^)c*?RTQcDo7hb9W2ujMZ+S)@1;`AH}|929J#zE)%G+JU{X69k() zexm2liEQ0{BGpaeK6Rq-tF`s#?;WPN58syt_asgdz8RbsfEP8#!p`PXCks9v-!9-! ze`~J3O3BfuT3MbvJO_98?@S%dF~Og}aUUs|8@&j}ks8NnGUKGiW;l*0ZC2Ltl?ujI zji^ndkJ30nYZ*I72zFqY+dMVsYpvd?%68IS+oLhs{6wfDqxZXZ5Y&4$#^#N&eWYNs zG~Ky(;3PbSIkXdmPoBgu;X4gwIF8+#%nuzC#zjoUKR43pP#u zp~m=(m2v!d!H;Nl<{9rPH4=En$y&jt=Ghv@Y52*&zKMbzsJY@pPP9(I3GW&vGq!?) zP0flmMvF5JP7-WtHeBN-TC3D22sWL$@r~ZfINr?xdz}*nr%+x2jwdw6zYQol1!Ez6 zl5jJ}#NV5%Q90B#3_OunC7bGefWyVPo-6CK7OijQ@4E0 z?bE1*&0D7nHq}+ccLvp*3VGrTk@KspY!rWRb^eJs;jQN^ zC7&#KK5lWNZ(Lodurq~Lu-tvNaPvO;9nBN8k>!z)V6$yow-GIeAKx@;h1?sQCY(2y zT>7%ECy4oTspK@651%WXdvrG(w`-1(ej0a+^8`nLcv-)Da7f9K$uV|j2sWWxp)uMW z*c&}xu!&quW9tIi#f3W;2siV{as8fG){|6tI@j$&!KPiuX&jtM6HZ6nnq~@j;21aT z@tWhqp$6uWS;Ea+kkRRTW!|o%Rp6d@UAp}&%_Fphi%(sYZobDy|2zq$Saz5?p8@lU zuy9lPUYZ9lrW$aMZ?V1r@O9bB!fAet+*BGPyOyJl*1)E$ieDfxy#-h$Ra=Bpc6nu3^!viPdgnuEm zh;i@=!KUJaHOBl7?2TP1*wlNd#_oFBbtd8xtQT&E^NP(|m31U@XF(or5NujKrm=Gs zO*o5N?JD689O71=G5)4gaKb+ZuZP?diU>B&{dV3`g_G3CIC8CEQ?=9A+@~I7tPQ;ahyZU{kfp8vCxNn#t%Aq3ea49{1C-ca?Sb0;&V|L>CA*b^Aqg?AF4+)`0~FZUr5btKE6=6soO!C+yA0gHgDZ1+_=|8bENQ7*n5r5H2mPakCl1n zCYmw@^3+Wt-^)egcv$lkErQ%*FBZHMh-a$ho?)lrgzvDfW$VG41)I9vqp>eayV!a( zD%^pDE0-F0gq9bc4eQ}s1)GNX{kv-w#IbDLmO^?e#QQ9ZCXx>T^K`JWnF%V^cv zDBM{l+-wT{Pv5Mpr)UdX_uV1bRPC_y9#*)C3PP~%+$q>ptyE+8T~rf-^~hbqP1Uyj z@T`{4Qu4b6zlmD&VEjsB{5ygbEN@yN-0arhI_8bj@ECgZMwUk(6l|)#L1Xtr)C##b z`H*l^_h!w54^zoh@aV(BAAm`2w@c1{Uzv9vp()^=rbmRE+FhzSUd2yE@z!I49Z0#| zwjDdl9@j&Cb~OM7nQ% zG{#_O9Ezv=_QLwBw7QY8vpT)(wHjlvGmbo&uKth4X!U8_>Q4!7(o5&wp5xBoid)Z6 z%`{Zpen$BDxW#epWWS_%jAlXZ39b>mP~(5U__D%DTFyB7tYGtfk~JFR;}^!s=L9d& z>ipNfQEF`3*f;A1!8}x5T(-v6i&SzB`?gm2A}t^P(=H`%qRHoQ)z+oUYc+QMLyIBz zhMR<&wQ2j*;b!$pXzsj54d5R8b>Wq;-3fC^A*Rp`8%Hrp4^bGZ|)pd+`W-%z&%axr1RGv`9*PjZSGt&T__>g zn7{De?8)pM8Xg#5<`=vjw{me@nV6$+@I7i~>&f?oo7tj4b9@HF^6)0X9GhM^njc!P z@n^p6Fbeid;2sW5*A1GzW+iEz`hhii^66+)tBsPeCbog-pAcM>h+95x01*`$h90K7*OT?zIRv?hn4|>a$snm$EZBc3TCT zrpt`<3NemSJ!5BEI=*$sScTE>z+U&)>G;E|f(kodQwtZK(%d-zvF6C+&u8o3h}=w7 zpK2VZQH)a>n^b$w&7`a&p9A(beJAR9aF+wW@!iv=;$%5HX~p>{Jh)4^X_%~`S1FD} zp5=*@V6%-ltNbaE@1|CkH|-W~O3!;G_aAH?JN648kM0$02K=1s@)h>|NK-C=Jn^G& zGu_P7JV}cn_xOGmY?|e(86%Y(YdhocFM>^EwriZEos8qZ3U=TRkM|uKBcrse&#e-v23dYU3DS86CP3lm2YQs11QiBM5z(> zJ?;#SH+EDwdf+&E^<<@w(iX-}reM?R$7+meekMmQOR%ZiSdFc0s+ox%?PLq*&+@Zj z{rJ*zlyxhY>cBmAu5i;Zb(4fAXgSQ|a|FQ;K+0El-2V7EI3btb$fesI1)K49m&R5n zYGv!;PQo2XIJ6hddQZ!T&w}+(fnZa&i#0|f5A2P17HsM^M`L_#d+{t-4;>`jtWlBM zK2X+Ew3e-h-Ga?3bB)GW+Sz)nt6-BgZThxwI$X5y2V;urV7;lEa8tJrG{=`}>L9mz z2zDUhsy%o4sUq(|4Ul^invcogu7GdBYVPYrtC%^|zBjdS@u}YFe4^$U z?H6&k@Cr7unWQmBJL8nbD^W5(c*xWXm36G{jD3AYZR$2y;}k6iE)5k5cA(_C^?d6M zQS18yajy)=b04MDeM|yuHC&YL(+e6WX&>WwzjUi>HBQm+FajF(2{x_yd%VxNCE>9vdipIZX1E9XshfHjnRv?*jKE z2MISZDbpOO-o+YT`uWiE)$-T3 zO7X?C3fz+_7QPvbUy0tMd4jf}c#nIyVB`I^;vGtkcXzYlon0c>IRBN#)?rjL8`i^z z33p(by+3|YO3P=l+_BT;6E(&M94lBJEER4#>m<$5@Q{0)GQnnl(y#AcWj#gv82c&( zn^pUU?kCKE4_Gya&q3kAD#4HAmKVprG`9RSWey@2_6s*D#gNmZN{$aG7Bg=O2)`d% zUbKrf4_DJVa8K}X;U?eOH!!C3cz?&m+oJ??r_RA~QvZ7u4vnIsxiD|l2sd>rBZzxf6=Uke?+aTuQ9*5WqJ4l;SQu6yS!f)NZ`Ey&TR*W(ha_;(|ScxgPkJTeM2?x^(l;Z>>?>zKB|w zCodLm`rQ$C&Q#nzn>t^?_GhQte|Ot@u|J1uz&+tP>HL@r-%=bKyer^-bZ$C6PGk2x zTEXU%^MrGq_|vm-ng=hTX6DgLgqwW0>-^2){$J@G`H(%9doNeIQ!2ZvGveA+(5gO zUUTz_#)b1f znRSZd_Kj4-JaMCN6P@oh$6sry1NZnA2{+N%tvSAW)4+XO<9e9p2cOT*3gcu27gICK zt(!$|2KI}ZBgKQ<~PfAM!o0NN3mjMdnTeZMm`xe0oC_Cdw zX>8p}i?8C2eXDQ>%#CBTJwwaavUU45!H)xRXzn^{vBKEqvGvGO!EqoS)yp-umr+p! z)|1PGo4+`6Pn*0p0(sLNg3YME+S;tFTX#|eCT%%hq|P z-k9IT{=KvU+|zWg@C39R{Cv%$wDD?G-@0G01LVdr^=K`>pIX^`Qgh?}G|fW~P{}ng zZ$Bt{Q~l|h$Nw#y z-Q~V|iRPhasPlEGPH>HIU~{=cD+9#-=NjOce9sw`d)kkG&;wlN=aG>$!Ft1v`*%M;{U_6ZuA(a6Qa7X>MYd{qktVon~ra9&Z-C;TiU8ireqd zD&~oIgx?0+eQ{)I9!^jTxW{={xCwra=1BM#z`c~l#(d`s-d5(r?@`SHZrcBfJPy;` zbKIIY(JYpSHwjK*`S1aE)j0G4t$^I?d??&>tUG6XsLV$`q-Hkn`$)Jc{%*}RIr%@M&<<-#s{~+-sBd+W?^17 z=TU{jEwt_i_?BuBz84liZw+VM3;cm0-k>y(6$nxNqg1-YQ!10yF&R5g|xi|8aa5Fz` z*BpNzz4O0dKKZq9Gkdq3lXEG|AabMr#m;{t*m#%JI7zb@2X_c|pkU{mQ;W5FIk4B> zDcDRG(fAPxhjvmk3irBG>HOGk4T?J{YGvM}c?_m`;r*jm&&zPKLc6KtMsRD7=uM|- z)jYC?rht2bKL|Iy#_BElCR%hOytnoWHd~nsYa+@#wt0-hKMJlyiJfrF(l|~#8Haun zY?^&*zmJtVL4`M=?vbAbb64Q2>o=qnwtk@rH^KM#FTzdWpPUuB9FJL{U#S7yll)b< ziTu-=V|&l$eZLEKAmPXldG{uf|4uDz-f9(YLO&_ethn7uofm;8H8-INs4af$afTOy3J>0*D1Nv zktQ%tXm0AZRr6pcYG58L5WV?^WYf7{OKdvRD(1c}!cEH_J2t?ktY8;vQRR0}=R1~- zP~7fLoukkQ8@PICu;kes>GGrjzKs>dsRxEIxdd)&Q+8~sYnvBpPvSa<}Rwz*GZ zv^-zB^(NW}>~;DGHf`h5*xi>(mZ0!RU*Qfa%x&{aZdl7FFX6%q1smUf z(-m*{^)oO^Vm?~rhdn29xkRj=E-8=4m4c9 z+((Crei*G_9v>#$)X$~4J)D}E+av9z_B|9oH7h$~_?p#cX8ll@Q9|!7%jrpXC3E|m>ldO~gJ{#ToNiQn zd6vFAfSlEt-O0HnE1OYY3g4628-hucGl1eiBJM{?x&IR7jF6{a$Z(a;X@ zj`{givm~phpy(2`1A9pB@9`vl9f>D5EQmEjRr7 z{<3?}FGtp9_r>o^YVllXBbrcM^CRk3cw83W%9xPNw^mQcK7{(kGJBY7ZbrEtfz!?j z*@xj&I5GQ(jM6oeCuYw%HKT0JyANiUyY@$DR2-&MJ08%0@p$(CWdnv*XOEO-Ni4yr z`TyC5Pd}L*yd$HWa*ogOEC9%8~wkW5f;3(BL_!^H81VReX65z@YBa# ze-pCbe=@Te=BuA``?gi#uR+6nwIs_Yv)KP6XgphW`8D^xi;PblpUeCkpZ=Gdangl( zxALgc^XLD^@QcRs{#S?JZTIF~dC*myGHkeG_=v2S0Ga*2*(n-|+Qa8_xJ{ zeTQDx^Yyi#&0Jgl>%}>Iy>b2(V{iI?#D#pl+aOhyC2)i*Pnk( zr<{Ao$T#@F#_U1*p`OE)_H6&JYBg8C{<0_UIC(B|gR4_U z<(f%9W+x=l#w2_OF6|Iz8T^6{oW=J`&D3kqiNCqrBz_+6RxZJt8|;TC0sKzifPiju4^-f z)BEqb4x{81NFts05QnB=m=Vmc72u=ZLx_^kAeR_UjqkaR5SV%oyOAK}VA}!Jvfep9 zxzE3;{90h_zpj7)Tn(U`ugLO{x;p#z91oqe$rXUr(eJwsrEkM|E?T?E)zREYZE|%t z*Tdd7*CWiW``d0EO3A-m_x(UUTKa*j?a|xhmMSJ8*Zn_q4W@z*UEN>~*ZiouHNWlF zV0!5<*ZbtU%SZbko%fMZ52n?Bx!x()86T@hcYln6rhlv+Ro5&3a=oSPnjKL1`f;;sXa~E(uBxu4(c`kZ<+X{!Ke&o|RaI1!1^lJ{{Sv+^rg>XjLk{*=R@io# z{1Mar52Sez?BgmrxU{UoE-kMv+y9I*g8#G?7JMEXtFSviw|{wQWo2o3C9kdff7s@$ z*KL^l_TY}0 zTDbb5I~e}+NE8^qk|^6IMcD&*ye9nJmBbx5yrJYQN}-oCc9`ZHH? zkJ3OzWqEl;S}PRO?$0pTxb{6uE33+?ssrg_bcQ4zi09{b=oRo+*a2Ahi#xbfPhjWq znJd3nd1)E?Mb!a5!$vkLvQus`AS8fTLnxxQ2B{D_2&OrAblZ7p@__sz3se z?KjC+sMxl)b}TFNSNiP(2G%ToB88UD#lR~q3sgz{z(DRi%E3R;a3itATWH;nA!w5xZ);+Fw-~XjhZQFJU+FIf7)DA-2_a8s`@LlAEcb zv=VJ7ZrWd&xRxR~r4{AXX%RqiU%{q|D|&GNqa=OuqDJP4FA#S>x=mSCdXGYpUvU?- z?TWHeUE#Wz`6L zyZMKkZaX|vL(uk@2mJohG|xHAv$iA5=(MGNc=A`vV2#_kS5%>=m8MroH6ToT@}RIw z{N;W-fR~Z`e^Bx_rsT>he^nVu*iZRNJ<*TfO=U~Z31ChR*rrLo!3uA8%Fpv)4XDKU zsSZ@98_;^}TeE3qUcM_26KGjwMOB%^a@Y>jrd3rOw08a%)A>8N3zhMl=TGY*#qu4fHMu$%y?8mb+zuFGh@S*u=1z?E z3JiCcZQs_9?1VpP#!9TJX&r@&V{7hhCRAmme=`{j+2tC5Z3iaAGPqP)p-bE)LGIAY zu7;mjgAOQn7n-u70`)jx9{2_(Rk1F#5IR3frFX|-Jv@gqb(NuVBE!E{Ad#K=Jr*MS z5oD;v^zQdAyv1g?iJy(vX7`p~$D}x6Z3Dgu20WcYimCvvbY}mTU&m*8^4|FU=?>M_ z^+PE9ldE5cYDCH})!a`aEv|n3{g@rfs?wW8B?@f@QhSgnlp`MLD^&VJDtD1JCVXtr?X2xTpHu4J#`o z97tV}UdRlwA0gZ8I}kCg2p}nF*FdU;_8UP&dfKIdfWNBU@>xuSe&kHL0wJxo)7JyI zxoN@L+MBNZVT9zI6@DbAI!tXO{SSmjX5=7SNu&&?tiW=JFl?I z%I(t9b`uY5u32=}LuH#skJb%V>aX?(^gw7ss^64VS5(=Re^Xl9W4>3=t{5svp|Dhy z9vH8-Cr!MvdE%+8L?S0^R^Ics7aVemyZ2Grn@T%S>DS$-4aN7OQ&g7Wf9-=*Oke(j zP62C}Wz%PU?z?RkRPk!lf`|mlumpha|KVrPn%;2oSP*!pAn9*j8^(m>^YJWGVW&?4X@!}%sI1pUE-I7!jNe>7%()AH!@Q}IUo5iK zm;~DmPg?&Ql9h@;MVY@meMs<<=K3AG|HKYgc8^lK3`bv zj)GMR6~Jh#EI%-jSkta+oh z%I||?oO2=@+TTa`s+iU@E3NVe{MeGFLDaZaYMj@j3cG>wb|FErt(;Xs`6^ytfx0L7u<@LE=9_O1TAgyQ!V|cDH(|q@}Ksejb$zwTzO@6sh+y&raxVS zbFeF@)*1SSKapDay5?sW@cM_bhIy$%?`xKJ${$FH@6egBU8=^;Hofvo$L8yOF}i!e zZl5|AFI|{FB)2MnZcr(OE!~iRNG}X96n@~=%9W9i4JT6Y^7iG>*bEdTRk1OZ`}KbQ zri^^NQ0HxT6;?qTd1{(}9Keix1Q6vRWjY|bu1r`>@b(xz1|6dPq(@`<0h6!!k#yMy zZrc}TsybFypmWGD-jK$Rb_R%0HMqd`NO&+VXAJ|7f@se6zQ)*iHJ~I{o(3Dz+CK5k$7$D{8RY3LfxCuW;U~Ifd!JaK`|65FpSR25+TX8@tK^yZBno1Z(?wU47 zu|EYa2(gx6Q7daV{;AdlU#rmP@UA3Hi1J+UM~zKCZ%NA9B zT#(OEDyu9;hh98cV7g4}LfkM*_z6Tfw`V!#g7&YD{r_(wO3OmRYhIcsVu`;n<_3(A?b^Lt%DRX#xICJ{BbC0>`qPa(2RL9>!R6mFH zU(8>qQ|Y~VmT$~H|GXIoJdFEuClBI(KbQ7A|I488%&C`6pFO(n{8>}yUNoDZP(L+o zeY}>2voD%CbNYUj`C1)D0@q3nLbN}2wg-;xjR#@k zL-#=fQY|k9-0u8={3@rcq5>0sb=ow75ZAgnP}_OY#6ph5T|71aMVapW!;rzej?CT#3u8)zoju*>mg^MH05)g^yGe~ybvNo>5H_G7FbFqrGR!1(|=rN2~x3g12h^)lf`~IUUV$YF z7@YMA1{F~eZk#8;-~=jQP!tEiFoOcV-?i7?g;Txv`TyVNeSdGB=iGC8KIgmkT5FGI zCwQM<*mL8*dd5onJTl+GpTdqC)j9i-j5_0gs(n6RMRkR5wBND+&p-dns-8G_!QiYD z-&lD1lB`AL3scYX_XZ3II{NT&kMJx={tesh%+?mJ3N&=@s93N>Mr)7-8 zPYB+g<#2d$xwKimkFoD*!Bsf5!Et@Nb;@{z`t1UCJtO#5obqwppmB^w0(%;s6?_#= zhv2wLULx;ooc9F(O8qe7AlHlgZj(uAh zkJ4PmzL)LzCXExc2G|o_AlMkcS>wzCD&B*@eXj_=8z&CD_u694k0VI~_rQ8&A^(A> zP$``5z8Xhq46r}>s-ljEvL*1(zb{kjhDCC}2Tpl7e!FFmx*wxuY}NIK;O#hZWj(!e zsKPGV$2hrIu!;CtjVijiWRY*pt-Ql)drU`<3y`zp3f>tP)Q{(r*31 zLw-^`ounnqqi+j0`r8+bbn%_U+q7Bf-?8iO&^-MPmHmN?Cf*fp+`CJ2FAe*HTjG0y z$Kb>X_m8+nnNPh(jgWi7@7wwNSKq97@_m}e=93=?Hx)K=)hmjJX$_lCeJGey>%?)s z#;K2}crWCRrNSrU#Kph4c9D|DXy9Jt)>JH6f zocu&Ew~BHcmunoQWxyWa3c;7-#ASbUMWs^5SI~a==J9?ie2(U$FCDLV>Qk!N2j9b= z2~Xj~UEng!y)<$k%*Q?#Y~jQ)ee~s1BLAG4AooO83O5zI@!FT9_?5JT&HGjf=lbPV zxw&Am;ttvb^X}MJg1PPT@RiXxOr`sQecuRPjS~+MTQzpkFknxZ@8dHL2gm-+wD-ih z)zr8jg~!)0bvS0~p0xe;PulU{7R_brku?9|aLmBL^3_ASwdcQGw1#nP9sl8Qn9Quz zxPglP1WtV?*usf3^X>eTwR#}q#P@mv}N7KZ!@!Gw;)nDbw*^r!4{YZe;C&q#depX5+NYzzv%OTR5>} z&#a#>>P=LZ1s>ik+_?6f=Bdq85AKftCfqppyyh+%pM}W68NsHpe{lNC%DjW-GPbq| zUXK$u*pD>!(HdY+V(S5X7%rD;9N$L8*>KLs{U4u~b#s~!c~x1@?4&y8-d(~?rCt5Z zzZFmJqOsuahTXzVtzDzJk7i|~`1l^d7EYX->oiX9q2)^cyKplv9C3oPgStceSnk^= z*o=W+4``!sd>>Whp!D#5;U+h)e%@EhN9G_m(LV(n=U&%1Oj8&q9a)N7_+NJJ{j$rn zdNJcfmS9tFA8L%boUtQEu&K6>HI7heE~_=32*cc_uKn&cW!$1+z@7|Gl=!U1!K1+S z8mIE8F&B}!S_wCiKYZDnN{-2#t;h2P&w-S!A9G|{VGQnUJyjss1b&>xaVHh$vGqdX z7Ni{cy;*%a;)Dg*z&sAEwO|wZ6pb;N1AD@41e?h3*ErdRX2ZJ2Q6zjCEV6TxR`*xd z<3+Tbxwlxj@ouu_nPS?{yx|bx7PRbLk1Y+NKZGh;vEC)zjK9CV5LZ0oqEX=PSX<%7 z{VkfiXi6(Ymu@H6xW7%~FfC>rYcJSLUGM(1Mp^gLCSXshgJ4r}?`xdsNM-pbJkwD) z_eJh0H|{&J1Sbb(^?bHoB6tdJac)MR-l*|-U{Ac0;O#&>D_^E@yfe*X>nXSJCv-Y(dJk zz9;pp$h%X8lWV<)a8s+EUq4Vh-h)Pg4+$S;=Up{V>HDVGQlmRuo;S^)Oy76WVkg`Q zA0gNT`|L|4o#B-uc?4}naqd`8;d5}0qy41AGm2v=Ux-vEdkHqBuFyC}!x%gI2)3Z) zU^h;GPpii>PH1dmov`A4g?%(v8Sg7jVjv2{mCut{4&<5Y+$+Q7P1Biw?7^LAY9aMN61_`wKTsc+&Ri%6zgvZC1q(5N_O?thtLyi%@)YpkU+O@<|Vg zd?3{q!Mv|dxN+~5;ujQ8)KMdI?;tzB(D9?<@j*0?dDyb^i#1PKv=-bQA1vI2H(GNS z6&1t1@X><*fy8l>{k7({t~fbTM^jxffPcU!}R8}GMij_!U4S6#he3l6jMSH}y=aB?K;X)~Mm zog&=07bQuod_}rcY6?V{g#);GH)>~o#)7+j=Lk2Mdrfl(&0_PBa|K(FaONJnex=CIrR8kC;XL6cb5CfVK9BaZ z`NT-!Cb*|G_fo%hh`nKy;2AK@jW)mT7iHc-BN<1}7i^q!YK$cw<79(i3rcpb{s@N` zCx?R;1AF2Z2{zT@dAqH`sf%cHJNOp8Sh(@MtL6?WZ4c|IO9UI&%QVIsk8yOg;3+7N zU2nL|tE^*T&p3Ih;G2Msz;U6*c#~u7yXj2%}9Hm>#6I7&qw z5Lx(2!N#=;jgwbWT?f>P<0|2%yWCRIxty)XucEQcy<>!%ypGpAGlpg}Zx}1wf`$_t z+8q@ASXvJ5PK^`(j9#d`wE6_aG0ww1cj6|&W|nAjKcFxwy(4h^AA;w=GH34UOMg;0 zOe29kshb5G=dRH>ehW2qMB%Pmg*;J_w=K#7^ZM0O7$fuJU&slu|7a^FO7%Xow-f0shB#A8)z=$ z_$0xmxz8K-u(FP+opJJZ!6x#A#xW}D1njs&um!(3@MQ8CtsclYrSTI$yfg8Z#u(s% zJq>q>+O)XrZxc!#zl&yfLY>F%6>fSknExCJc-_t+D~-Enfn@24hkw>Ku7cLI9ictUfG z@SQoc4+x$E#Km9r_y#2p(Ysv5>0>pHKS*V6Zc|f*Taa?;Ki}r$JfKYtbHjRC zW0TrnHIC7EU{7Sas7-3O`1>n$Vmi%(bx)Xtn?|!u^AyoqEoB@3w%p!Zl<4!xy6UGb?nl1VfkYs z=fv`Qf0D-O$EXQ%Px=Yr+#Pv#o2+^ANm|0@9Zv}#2gafQJL_s~ev>l)v|!WU%5RG( zoO+tdxOqEHy&zi99cyv(0Pm`ti9u)H~wO z(>&(ZT;V2nVa=0sX)PBYnE!j11e zHAlUB;auuH!KPXC*4UzfjHB-hHjR4ZeP{JXAt-zdILBZ9s zH+892FH>bN6>Mtdv9tfFFka(e54j zlV1onu3fA#mUE0#y{!4_HF(>%6Q^yns+DyPk$|P&KqwGtIyM;z~*cCV6SgzpZVSS@%eP*)u9X^fY4#@@Ad-#*YdMq?PKG&Yfaa^Ek? zc$j7}PJSzDgIASw>W4D$ox(DO(}H>Jk&oMp^1e_wO#6U6nePNAfC_Oe);Rt>RrEmM z;q}6|7vJ`!!B)rLl)|*0%|_AmO&|?^vPbvsi9%ZQx^EuhclXotCpawnMn_y-IWRawXp> z*f^Is=?Y~%y^|`AfV^RsaO2&Jn)_(v5hy*rTd)NW*tw(6xkco=sR?pVc#m-7-JW4@ zE1udzOO*NFg`2_o56v;O!@N85hhWpBo_qT$A4=L2sh64*F2L$W10JMg`3R%dVD88N^vA|X*TnQJUic{c{-1lgS!*0 z?Dl`t+)Ml5p1UDmu$fr`=XF))9n`NkaI`?M2|lPX-rE=_oq{bm#Iculj%)Q4U{AF0 zK-oO1chfjiNK1Odw@7Q@CiA^-eO1X(>uf#N#$I?|jT@-64{)l;UifD>XS8}4<7Ba5 zlejN5wrD(KmrJn8`$~=ReT-6TJOyrZUq0oN4gs9-cCd!Aqn)T-Xd6YiJzQf9?tOv7 z?FDml<~8p4Ef@!H1DrMn0=iJAY%RD~O;pZemps~x|jafC(!dm?3m zeK1}ClHBXJzTJfeW}Lr!)YFyj~^l2 zL^tHa>y$jzlh(3%hflcqKIV${&nq6Gq9c*ogkP}PxO*UHy~0?=0edn5!K>jAzuG*g zajKHW9*NRjLE+}h)7gF7@rdV0RMTv5ce+~m9NgnZS@Dx!as0T3&AVy@o6hRfI9)^g zSstzxZb8bub@2K*THenGx$h{!CO5}uoH&X``QTl&zi?A?$7!DFPfg5y1B9EZdt=2f z%6w`7Edh6j2MRatEzum`!*TJkI>E-fx3hMLypGEJociO1-wn?>_?6ucuf_>AJIs&N zyG{_i9k-k~zS0_zj>Rq9lj#s;|X;lfR3F45devsfM*A=u&q zam;=GCXtVzxCQd7ijLIDb*-GGEVS#6v;Jn)w~^2 z{5V>|a>tFr%~-j!+qQd6%g00Rw#ExKvHyO|YF+qT#;!)eCiJ};$7l@~-Y`M1iG07tsR>kEgUq?2 z!p&y*{9w@l_~1z1Ms>_Hw+Vk1_c%2dp3z(J_#_(3+Px1ik*~%ro+Cfe*g?a9J=Xn#O{=MGnx)j~`>F9LSWm`;PldD{j{cfsH=eCq{}gP- z!mK;iDLH;_!8oI_3GKb5t~wauFWUQ~aPL%68~lOB@u^hTAJr0>CftPnk>=@XG?uw{ zx^OcIxsE$una8H_Y;d=agqzhzJI(P`JBoKV%n)pr2ah+6R&u<;v3EZH1tC6Wf-IPQ znZn7LR51Y7ty#j&3|XkTMI#5mdgM{TW{O*O>P&5Y3gcv4uo+1|(Ktejfj!>G1h(;T~VFz;^Qj*5?IHJ5i@uVY)oIQpz$J3re1NktzluG3ghDkAar!<&!156~_zQAUKzLNw7)GS%(g` z@D%UW0DCh0D?)rsV$RVxxqz0ib>Az(Ej+`S>DTKqzT_dE<&K4dKfo;>rjFD&wUEjz z$fK_c=WX9o@a$W^ws68W)i8@Q_qt${*j$YxG#=Pvy&>2nww1<-H)tMP&uHEggB1TN z>d9$e4QA_JTEo^8?}(fmG&}dS#tl?77&!c%U^7zOyuIzwtj2B)u*dhlVB_1Z8YkYT zv4c@B(GP?h=NdK7d_c3A`#uzIM(EM0Daw56Ls|~*4u2%vWd1VE@!HPC$37Np!6Q!m zM-~4R`NvdoG|Weq3ODX8)jYG5MuEGN%Y+;EmTQiw{b&RqSuWW0=DVL+s?6h?H^#9~ z1RLk>)fnHmGESug8|QkBoPG>^#G{$laN*1)IDs))<|gar_&>Ca*6!>y&jY=olwg3pTzj z&^Si>7(3PqHok4yalBUdJC4iN*toV$W4yQnd#tqGwH+EK($sVuBFkuQMvAvaUaG8P zT4(F&bs{$dP50~WR5(VP7$?^Yo`an6ICFVohQgTDk4NE|9|W7ouGBdBBh?>|!hIWr zo6u&2FFy`eFp!Lg+@03gg!c2Kdlbg3&e-v*sCz(>hojR4Qx*2n8l~3QsNEW)r=I}d ze49jV>a2^#@l8~B0$NmB^PlioF05~=%sL(?M=C>O!QGB62TJGf0e;gQznF%3cS7SR zP)8gOoYqFkF~BoUZ56d~?m>;Q7th$c-R|5pjbqgBL{@A3Bn)%f=VlLA#_{q7>~ZWA zwMqL68mD$r(}{51+9lkAlw13%8zNf1nC0HxcHh3%IKG=UL+**}u{*a~bNm>*YzVmb zci}uoappeHpP|gB_EJ4_$3Efa-R_T99#tH_25$t%ufc`$cdq@Q->12Q<_%Zz!<)HdW(P0aXk|;#^MQ z6Jfa(j*IVDqpaiS;G@9Z;X>i7!Fbg$T5}BVLlIk~wP4d(kE+_Q6StUgyp3QJ+W?I* zt20g)3ASLELmPQ+-ibKzmu@Gsx>)cNxW)78`5I$0p0Up**i_od6$_ObJzc3g2{!ZM zl^49JutjqjCp!x^u8q+c?`@179>EsMW!E;GS1|-9EGUYG0cSKeE#ha5BQy}$V|5j^ zX%W9_oajnphasyO&CS$Od&y4*g`frvp?13o`jPlbp(~20(rEjaO2)DnqyKw1;M3y2{zts z)EJxbjHA5;o6PoDWhv`ez5{zweFQr&4iur#!!=IzrL`#BS0dVML#<6l{|7qQ+tBHyk(?6l{_+anei5x{pROPE-jt6*o!a zC{1CUsTOR(FZO-Qj@??lm~lEJ*toV$V=U!>J-%AO#E$dBA1~Z29NOPBO>v9%u{<(FFn4%fH+0lEK7=Yx zJrX{gy${Q>j5D0=;YDGEDi zG2_@Nf=%piXzZd*jIH5rC!bB8R%u}EW7 zJLB-_f~$bq;P}ElT&ZI;mvOq5{dG9Z)H`V61ck9l1MG417i=nhu*RwWRD1?EiUGnc znBZDJ%D-I82c7}Bcc5Ss_yCRL18FSeo=BZ=uJke-b(*K^Xf|{2AmL^p-E!ClWj-~C zmUHo8OSo}wo91|PnKZ)L^PO6Y}WM!i{^6XpW!LoQd3|juC8{ zyDhSb&PU@!N z;&^smysVd!V{&JC@os;Gmdr&8 zS(geogUPI(4az*e;u#C>Zn#XiN!_EGC}v5oEl@t*&3tP8GEm`8_(4kzob%X zjZNewt8P3E9`fcKuqP7{wF$hl#>s1_Y!o8%T`Syzgd;B;dz+RI8->DM*V%n*qj8MJ z1A7{-xBFJCaq4=S2kRc!IN_6FnHzN958hJNj(f3DIn ze_T3EVJ}T#9G)cjNeEbd&cesFda+X9F4#nNp2lI?#5g%wumvSYwqyDVtuDO)IB|zy z6WA_|F|9Lp+$Goqwnt-3>q@P$X>i3qe5QWIH zvVUkCe~!jp0@u@;o7LJ6C-gcSgd9^4&WDBSe8 zS2V|R?o!l@^_pPQ!o5i~~sQ5B& z(~Ir;lQmB-raEwUdWl`XVaP@2a`gCZ#bw;;l6Lve8e?8(?08GCX*a)W9HC`Ot+5%S zH^y#I#xbokj=wGHi71aN?vvkcRv3%9%Mp6|9l<{V@#M8aT-nUdQZ677cCz! z^gKM~NPa*~;O@)^!Y{`?Hs8wMs5rLbVIIHd7i`9&`T>&_j?yN^iKTYypA;vwy7UU* z*e7=5?>)O)VeHf}j-~{U(`8@vSnfz%Vs;wOII}|V-5QTiU8gWAopJax!LI_BplAjCC=ux!O8OxPAv670fMBu(v!ry_EUui?mKXu^)uY~pZSAtEY)oP3?XPo|8 zumvTLB>gqU>$*~ZBX}|pXLZ-`Eu(PafAs|H$*dM^T;HQ{Vh!zQ-x}5mH}i6@2@}s} zxr6#$1-WmXVDtS*PP9`4)AaW=>ME}D^>+ExUxp~2_>r2x-RU2Nn}KT8gs|dR%&~db zPlC-*@U_P2pJ+47!#@kRP$b8G?fsdO`e`n40a&F~IibrTJTTf>M-wMPy|Lyz>apHg3%Gj~pUih`Q7b@(d zqOrh9jmL3G1q1C(_a&0_1(-GWWxe%3fl z%NWP@2sW;NJ#?j3@8iM~dj*@k6~1@wMI2drFI8NP!c%|Rc^l0!z+VlyPc<}$BMM0e z9K{+Z9MlB4$Ct$o(cyR&2VWgOf25etq9ts;AzQd{{zT1vw295fa|BzEa-|RTUo7$* zDvQ8;yp?d{{g~mxQ?00;dBkbw4?Xn!#W3T**9eWw!-c|4avs(^RY>!|-SO7KO@ExJ zIeL2pxed1w{3J~BRbbG;W|NjMJS2&(Z4o*UnRFbah~l%PrXCC9HAUO`Ey! zut&HBIVa|@3$E1i((53%x(GIjIYQ%P7plK5yTl*sD%`}@OLIr5-Rx_tGRmw)b79t< z*4W4vX&k0CjJ@6L>ctv2P|@{pDy^}ZHvUL-84cGR5iiwUkCvA4ihMinIdSaMJX20% znR~knH}mnny>BRetUJwS?&=|Y7PNfji=TEWPL4zmS`O|GA12)7G@v==b9OIwxL^ws zPH9l%)ZtVyjyu8;!p)3Zw4+g(&-9{E%)PyZPllGSX1%vgitkNL;O>S#!dHXw_i>ME zZqed#NM5wBVB`JzKEEhAzIy@o#QO<0&i|-!q=L$B;MQ0n+=6BH{^ThcEgyCR4X9`lylRNuO}jV1{dsiiaG(X%}oJwr*XwE9)5C8OMTx&G36yhY^>-2h6HPH=^)l zmEh-b%Y)+{jU&}mcOx>Ft`=@Kk9wUQQ}RTJ#xnQS2!8@vUZeKW9KUIw4en0X3OBRE zz8-OA}J+c*YfX;*cJfeBY~a^jNC@2Vx5!C*1hHU-RT~)X3a%yl~@uQ~qjYK5;zF z19$sQ5N^DWY3`skTzuq2!4^DY=dZmr{|cNOi4&>#W-fk+aO2+fn&TJub>Qy!Ny3eL zH)xK<+|39+JXEl0cIO>)wleRaS->7&y&ac4@Q}jkFfHfOUBiXP@l8W6ygGLNr{djd zw4ZsynZixOaD4Zf;;}QS;udi0EaArcY|WEr(I{|t>}=u2`&`W(H02h!XPqP1^ysTY zbR{PzeGV;QdGuW2Cb!pUj%^yq-O2L=Taa*WuhZB;rMCh{M+&|hh_Bw9yG~hm(J)|7 za+Kh`K>Yggw#Lcxsqt3C=4cRZMzc#ozbkqCLYfEePF-j>zdzoG!{p^0n|EC-cr|YE zVCI-3ICC)-kB52RCBm-(;;W{+DwI5N3Dq%=juvjl^821UO7YBS8Vl}@Tq^uYt-qzq zAjPqaACKbWmkBnh8?SK$JF+ZKUoPB&oO4%j(L62R2e~_Oh2R8GAs-rJN4AkG?kd4% zJh?Xcic&|fqEU@-KBKv57gucU$#Gz9Lrsd0v73K=U7h0bv9yGF_!{A+-3@y9D#fGM z&}OCA+}K~S{zI{UEtO5+=&lvL;m2S3k>Xg$Pk{T5>+SeNjic97Bjld&IN=-avM_GTfa8o&bG*8`3b zgj>*X<+MHSc+uZNW0`wz6>h?7uX+4dn$0{iUO4-I2#$`Lr^nNBrEe6@zq#dZf91G$ zl>Jnc_A_@(6mBN!ucONpk4>bCiAb;OHsNL+vRZQ&jhu+aW8E&8f9%HQ7pz>b@M1@_}#+Izsuf~bB5yBAuYQN zdh1@{COf}rj{jauJ-9n|pKz0%Et=!q{WfmfQv{Dkk$m-fZcc=YPfnqEERQq^UyXa* zvER@fOFYQkvHJz{B*9nLpHQmgSk6!4K`AD9n#P;kc2^i%^1z<>1A9!(`Y|i4^J1) z|4i8n{%Etj-|dk5W(YRDexhTwvL2a1qi*Mldsz5XNW0>gqH%le*=9jtb4rg*sb5*|LyBIxcEC%d^acOT|2)+ z^W?i!2kwr&XD|LP%^fu6ZWM35FW5ANic`dV`a_z{=3O5NH*164kt43>;*%fIayD;$ zEZj8o-!(^5VDr(Xf-Ok6q4x?0M81?N?tyvVGT|n7xo-_tJh6;MG50RF^DN)HipQ5z z6Laem;ZtF|D~=q^)1S~1aCagl+$29wb1eApfqM-r?BBZ+{>icZZe-WI)Ncw3 zkAElFw3-zfN3eH01%;=-7j8kq&1U_xv$T8)%aiK`Zv-mB@uS9xA7}~W`0=}NGd}&K zdHhG(%;v)zgqzWO?ZtUF!3;82+QgarNwD!QtucOn!8rM|U<(3v&N{P?R*whv#5W2y z!$mAHNa55*n%4y9qQBYs3GEvdPy9w}nfo%r<1oz=@7_)&|GGCCbiGJ=U3LlGzQp{Y9-kC z_MFD?e471F`0gqYZowgTuH^m8wR{=N(;6p$cp&Voam-2kA@@WIMQ)nSw}IQ0JW)s$ z4}x2*g`3#cX`XCNqnIb#2sgXO$2H!ZTfjTL_rzW_Nx>%Lh*5!n+FQdwlh~ z#;AEzfvxN+|+&EtpCDCUvwcK^=NJl&m|l)i^>GtISs{WoPl)`ONX&m1QF zRsD*Xb^kua6Fq4&^E9ul@G%|ZxSp*V`R`aSDkE@LZ{a4s6Esivrh4Y#KEf?%IKKSn z`ii~}H8S`16>j2lY98-P^O(o`2{%o9VcRPwz>FhRL2JR?(If5p*EGjl-a}lwKEbB? z7HMqJK*mwOU^9(hw_>icj!ivaPck5wXK|h>$7!6bq}dO_IY&^qdBwbTz@JJU3DR=# z2^r0~^hz8P{NYsU(*8Xfszk?|uR$CS4m*FmfC-;ajmdHf$;@n=HjM)iCvM;p{?)xwE0vQN&V?`LOkZToSzL5bS? zA02Y%i*t^jwlJ$x4*9>%E?fBHquD1tMmLSg>ACQ(qjTC6X7!Eu zxs*CNCur`L56kI->ob3$eEv?V#AdjrCs?>Q1M;lHF1MJa&751`nN*GeGXGIwdFEu@Ca~ z{uvJ+c16eO>T7cR>FBd?U^wTZ*3gSTTja=r_?Gq+vAbE_H;{Qjz-GYhC+?YB&r#l_; z1d3OW$i6j&IfoV{gPM=tcglJmF^w*ISQ(GCA|j@|xq zPUO-oANhyp>IT?(cy4F85u(_(f?Ns?&+SSXZkzY3R5&T&r4_l|^_LZy1sksBx)xyN7xsfxo{0qzfm0RgN zkhm!?=jw_*s79wR$o>CTp@{`Bud2>FojVd&^8f!j&0Uy_|5k5+P7mjWaLO8*iZYxwUS%vh=`+yu(%V!c*#+lO@+fI|k4f5MboYO=3l^XYww;xC-6_VSM>ggi zJQ)1H92@Rz`&%B4Rtwwymj6;~9`&*1B)`zPL_SeJA8`sZ-= z!f#(GnA3{lMLE8O>BR*vS7sfl=lCrJUHE!SLCD-H->PoO1pjG40bRVczy-)RrdgOD zW;Xxbol;v1I#X;qrXV%Lt1C6bt1Ha#UYQ|}qzAUCBG%RC^cMkUc|EtQXVu)UuA-Rb zQQm9Y3kKn|XL~`Hf+G=pBwBElBHjpj370 zCewD1hVMLZOAQx6dUIz%e>{cL;cB&Eu6e@7^|)OHL)-FF?ciZ7xNya;f|trn`~SGH z;6Jth|Jjv9TetJUJmb}(vj03vB(vMnfNoA#^XTcNOfM`W%o4~pWKe8TPAh8sCa>iG zz`!xM+<8p3aS;PYTYBTIY?rz5|8lHd*!CRfb-t`BntYG54^H#%afam7jW98Gr5^V> zgShd)z0PjacjE7<_?yBzvB1DpSBmhx-22SEm+y1xWmjYe9#Ma)b%gozL`v=|aOI(C zVWr-7inFqZ$-;jb-#>01`v32a@9SQ2PAI3?y;u=n{Dt$XtZG{Eg>zC?UpoCu=aCet zN2gDIiJ)D6i~;7)Ao$`homdRNj-J|=`mJ;h5*S&D)TtX-QFP7o%3a?|SWw-tFO{xx z_LsZfRY;sjSvqpzE1(J^yQG^P?TUIq+y$uIGH?>`7C;akhs!T=S#qR^DoJt0xUU=z6?dKd}11 zqdN}5{xt_=W8`|`8ujQkYf;b-a!Xy8uT_t#>ygdZ?0~xUMf0tm)b`s0j}DXT3%)&I z_1%MTR$4teJdM%@HeU}_`JX<;*@0e8JNuILb+#+-TQtvVI&7V@kJncls;UhJcra}K zRO9OAvOvk{19mv3Ps{0C%HPNK^HunQ!Jt1_#p}NVpK5w?owIkVP;E`MzlJ8>>ug_O zv=qUMO)E&M163`E?|Wz2q1DwjHC3Sy?~@($IkZB1n;Q0@P3&!t)w!koXd%J+ArHk*rV zaC*G~f2gX`??2czd!dQ-cq&*~RTZpeXAXS$uMOps&fW4&K@R7tGj&~*Q_vM@wmoNi z42ko4Yig^4mG){-MK&7?_s;1&eZMoe2iIDlCg`hekr$gyl{|lqAA#5kmgE)9ynD`x zV}^@|?gIGitEdeGEA7FcIsM@5jVh?}2Wokda?pp3Hd}#fU3e`UMIuNv1zU|4( z+u5C`?{c=v_w$oA)zXBHZ0I?9K~>*Yl=7(&rCV`&u>zdh$nfjzA~?Blb+Qi)&A7dqM2#l6>)@rmEIoQzsK~%3oviUp2?$ z_guF9<*nZoaN91+hwp)4P!AE!$oB(x+^U+IK;XYwKwWh!4^{;+%KW#-kSW!;e8_^Y zx~iu3V5iviZmrvge*5DzC&dcU!)vR9mFP%+ZG+8^`F=v`E76Y75dM<-=BMo4tu_F= zK3jd-if(S#fofmCR~3+!^YGA_=UtbR-C7La&?T|Gjs4qIq& z7v`7q@E`F1ji*!h?%93)?C(4Ctk{)j3QQ8H(UwIauI49IcYwjl>MDCo9C`Cow(d|_ z=?nUhe9n*g*q)X_q`IoA%GaVNs(g;fx#q(aM}F5u##(=EO|VKYCYp(+snhW-L1q|>q8CvWyw>%1q;h&O{HtrKtL%*drEi60Yp+w4?nBigB>OOn()k%F z9UUYPs{KowF5iYHFwNw;c_`wEC}1B2;o$|_oP9cCF2@3*#VAE{SZKs+>RPj+r#Sdcedjd&Rps3VfANlhXLz% zp#1ai!`{BSQZFk~)DCBjXuUg~hv(N;qw5EPYSg9%-06fS;;*j!Yjw=piC{4^V)bRO zs%l!Z6NRC^TXjN3V$Jl|1~YP(vlq(Z7Ol&Q?^0z|R@UNUOAHdbW|yko02a4@sk+kL zrmz5-JqFjms7LY>Qn|d+^4Hq^h5cFlgsEICi2_wE)*|e~Zp0hp38O{hsHW0A%`R}4 z!tmZQfRTGR-dY}7Wc@<%J=p3*k@+QlEToV|dz(giFv_c3?lV4&GBy6{YFmpzxxd4u z%3xJ3!m^DD)im;V6LYAB2Lt zM2h#Rjew#;)WBl#IUnABE=Fq_zl;oR@z+y<*Et19hv%6Z?1N=1ER?QfsgQ22fr zw%C14CKv~+Y(=Bs{mx#U&>bh$S!@puNGOq(8YNGiC+? zp})KnQF6>=``Kz|l-s-tUy~zw62}5zEJ-H}02gT}f0(~{)udEE% zb4Y`8ki?oAo|=6v&_t+tBQ?JjFh*V-W=h0PCti}njX z7+jD3$aPh1ixoSbn3!AGCl5nQm2QadrzoZ*{imh@lz#5iO^0 z#T$wWi@IT9T@|RY^=poJ^sdaU%cs6KLcdpIQmWPOYRyD#+TgXy?`x4HRKUR&)V2s( zBqkeM_p?8R^%Y(o{n(qpf~7^3!P>~y@7?dZ_Pf(4^MkWI7sjN06*S)$Z$g+$FzL0Z zfrIsC!y&-ybu5)_kFwv*7S(%p04tMVix&WXYXAN>g6CPcpTYik^N>UHR@4l{p&E?4 z)qnSL)%;wuLm2g|eJ!RHTTyW6(6Xvfb&b6``I+kb=REc4&Qs6PTUyuz!IIIQMV0R6 z=gcBmy(m`KaEL8>kd0Qg2(l_2h5a|IwQ! z7Z&y|uf=;9UU2N4m1BNzNtd0!G`xErska;6t_=Ro%V+abkzaUA024L_IH(VNY_?Q- z0vLDklzr+@eqS~5qV(Zi+KkjYNJvkmZr{yB(u0LEc0TRh$Zp}_w=F+jB{93$S4!+x zvsE;y@(%DFD|lO{LFKf;2paN-TJHF$(X|bRM}95Gn&UvgxWZUh1X(bI7ZSV`v|xja z3cI)EpIWH}8U}RqcAsA8++Kuv0<$o7S=qsZJ{Zi43VUIFfz6D+*_q2KMu7;kx*99t zgJkT?;9~g68?u-rY>pzlVl#{*Ls%T>VZ2zzRrSsiLi4D?4rU9ZS%>h{QWHR(w^+%b zKxWust-^ZE9tKKeR>d>+Uzay;9s+ML3+K1O_B&P%;!Uor&@1zXzbfRfu{*-yxeB|N z^RH=DK7AOec$#h5IB24)5F7G%i>oxVhYPvp$NgAF+a5>#wS|{{o)UaMTZ`cG+QLg~ zH!o5BeqYGcT-!pg*$2khZQr>><+bI?L$l>qXIm<{wY0;`xDU%uyc7Abs&CPQXmC6B z22%pw0$OS(LaP^z*q8NV#ntkOH~9&*w(;>?Z5+;RZ_A1sCsRwKh5nv2G=rn=?c z9oIoeJi*J4yehm92h}J{w|B(q12tBSZT-K5^JYg`F5(>;{mZ@r<|-(GK`dPJOJERb z{!2iEOA3#~s`Z)@jv2dV==Ccr*s;s6hc*HEa@b-qz8nAbCRRX@m z&n+y(nzJ$xtktb`K<7gI{;;U9bxDY8qeXv2>9w7))=B3U78LQK*oPfz^(rELNU8B_ zrd;akE_4?7e3d*l=?(_iJ3Am#8Ch;FCky3Z<_zEk^5ClB(PW^T%i#wqF?9LR$!$;Q t2fVq3MIEp^9H_F@y69D=3-a+r0-AJyf1X*Ywi57#T$_bYxC;xi{}(t(QG);g diff --git a/Assets/Scripts/EchoTrigger.cs b/Assets/Scripts/EchoTrigger.cs index 17596c8..f4e5286 100644 --- a/Assets/Scripts/EchoTrigger.cs +++ b/Assets/Scripts/EchoTrigger.cs @@ -6,7 +6,28 @@ public class EchoTrigger : MonoBehaviour [Header("Связь с шейдером")] public Material echoMaterial; - [Header("Настройки шагов")] + [Header("Синхронизация с шагами персонажа")] + [Tooltip("Включить синхронизацию волн эхолокации с анимацией шагов")] + public bool syncWithAnimation = true; + public Animator playerAnimator; + public CharacterController characterController; + [Tooltip("Позиционировать волну строго на кости наступающей ноги (L/R)")] + public bool spawnAtFootBone = true; + public Transform leftFootBone; + public Transform rightFootBone; + + [Header("Фазы касания земли в анимации (0.0 - 1.0)")] + [Tooltip("Фаза шага левой ногой при обычной ходьбе")] + [Range(0f, 1f)] public float leftFootPhaseWalk = 0.08f; + [Tooltip("Фаза шага правой ногой при обычной ходьбе")] + [Range(0f, 1f)] public float rightFootPhaseWalk = 0.55f; + [Tooltip("Фаза шага левой ногой при спринте")] + [Range(0f, 1f)] public float leftFootPhaseSprint = 0.12f; + [Tooltip("Фаза шага правой ногой при спринте")] + [Range(0f, 1f)] public float rightFootPhaseSprint = 0.62f; + + [Header("Резервный режим (по дистанции)")] + [Tooltip("Используется только если аниматор не найден или выключена синхронизация")] public float stepDistance = 1.5f; public float waveSpeed = 15f; @@ -20,11 +41,19 @@ public class EchoTrigger : MonoBehaviour public float walkIntensity = 1.0f; // Обычный свет для шага public float runIntensity = 3.0f; // Очень яркая вспышка для бега + [Header("Звуки шагов (Опционально)")] + public AudioSource audioSource; + public AudioClip[] footstepSounds; + [Range(0f, 1f)] public float footstepVolume = 0.6f; + + [Header("Реакция мутантов")] + public bool alertMutants = true; + // Пул из 3 одновременных волн private const int MAX_WAVES = 3; private float[] waveRadii = new float[MAX_WAVES]; private float[] waveMaxRadii = new float[MAX_WAVES]; - private float[] waveIntensities = new float[MAX_WAVES]; // Память для яркости каждой волны + private float[] waveIntensities = new float[MAX_WAVES]; private bool[] waveActive = new bool[MAX_WAVES]; public static EchoTrigger Instance; @@ -32,6 +61,11 @@ public class EchoTrigger : MonoBehaviour private Vector3 lastPosition; private float distanceMoved = 0f; + private bool wasMoving = false; + private int lastLeftStepCycle = int.MinValue; + private int lastRightStepCycle = int.MinValue; + private PlayerNoise playerNoise; + void Awake() { if (Instance == null) Instance = this; @@ -48,12 +82,116 @@ public class EchoTrigger : MonoBehaviour } } lastPosition = transform.position; + + if (characterController == null) + characterController = GetComponent(); + + if (playerAnimator == null) + playerAnimator = GetComponentInChildren(); + + if (playerNoise == null) + playerNoise = GetComponent(); + + if (audioSource == null) + audioSource = GetComponent(); + + FindFootBones(); + } + + public void FindFootBones() + { + if (playerAnimator == null) return; + + if (playerAnimator.isHuman) + { + if (leftFootBone == null) + leftFootBone = playerAnimator.GetBoneTransform(HumanBodyBones.LeftFoot); + if (rightFootBone == null) + rightFootBone = playerAnimator.GetBoneTransform(HumanBodyBones.RightFoot); + } + + // Резервный поиск по имени, если аватар Generic или кости не замаплены + if (leftFootBone == null || rightFootBone == null) + { + Transform[] allChildren = playerAnimator.GetComponentsInChildren(); + foreach (var t in allChildren) + { + string lower = t.name.ToLower(); + if (leftFootBone == null && (lower.Contains("l_foot") || lower.Contains("foot_l") || lower.Contains("leftfoot"))) + leftFootBone = t; + if (rightFootBone == null && (lower.Contains("r_foot") || lower.Contains("foot_r") || lower.Contains("rightfoot"))) + rightFootBone = t; + } + } } void Update() { - if (echoMaterial == null) return; + HandleStepDetection(); + UpdateWaveShaderProgress(); + } + void HandleStepDetection() + { + if (syncWithAnimation && playerAnimator != null) + { + HandleAnimationSteps(); + } + else + { + HandleDistanceSteps(); + } + } + + void HandleAnimationSteps() + { + AnimatorStateInfo stateInfo = playerAnimator.GetCurrentAnimatorStateInfo(0); + bool isMoving = playerAnimator.GetBool("IsMoving"); + float animSpeed = playerAnimator.GetFloat("Speed"); + bool isGrounded = characterController == null || characterController.isGrounded; + + // Синхронизируем шаги только когда персонаж движется по земле в режиме перемещения + if (isMoving && animSpeed > 0.1f && isGrounded && stateInfo.IsName("Locomotion")) + { + float speedRatio = Mathf.InverseLerp(1.5f, 6.0f, animSpeed); + float targetLeftPhase = Mathf.Lerp(leftFootPhaseWalk, leftFootPhaseSprint, speedRatio); + float targetRightPhase = Mathf.Lerp(rightFootPhaseWalk, rightFootPhaseSprint, speedRatio); + + float currTime = stateInfo.normalizedTime; + + if (!wasMoving) + { + // При начале движения инициализируем циклы текущим положением анимации, + // чтобы не было фантомного шага из простоя + lastLeftStepCycle = Mathf.FloorToInt(currTime - targetLeftPhase); + lastRightStepCycle = Mathf.FloorToInt(currTime - targetRightPhase); + wasMoving = true; + } + else + { + int leftCycle = Mathf.FloorToInt(currTime - targetLeftPhase); + if (leftCycle > lastLeftStepCycle) + { + lastLeftStepCycle = leftCycle; + TriggerFootstep(true); + } + + int rightCycle = Mathf.FloorToInt(currTime - targetRightPhase); + if (rightCycle > lastRightStepCycle) + { + lastRightStepCycle = rightCycle; + TriggerFootstep(false); + } + } + } + else + { + wasMoving = false; + } + } + + void HandleDistanceSteps() + { Vector3 currentPos = new Vector3(transform.position.x, 0, transform.position.z); Vector3 lastPos = new Vector3(lastPosition.x, 0, lastPosition.z); @@ -63,8 +201,94 @@ public class EchoTrigger : MonoBehaviour if (distanceMoved >= stepDistance) { distanceMoved = 0f; - TriggerStepWave(); + TriggerFootstep(true); } + } + + public void TriggerStepWave() + { + TriggerFootstep(true); + } + + void TriggerFootstep(bool isLeftFoot) + { + Vector3 spawnPos = transform.position; + + if (spawnAtFootBone) + { + Transform foot = isLeftFoot ? leftFootBone : rightFootBone; + if (foot != null) + { + spawnPos = foot.position; + } + } + + // Привязываем высоту волны точно к уровню пола под персонажем + if (characterController != null) + { + float floorY = transform.position.y + characterController.center.y - (characterController.height * 0.5f); + spawnPos.y = floorY + 0.05f; + } + + // Определяем режим передвижения (Sneak / Walk / Run) + var keyboard = Keyboard.current; + bool isRunning = keyboard != null && keyboard.leftShiftKey.isPressed; + bool isSneaking = keyboard != null && (keyboard.leftCtrlKey.isPressed || keyboard.cKey.isPressed); + + if (playerAnimator != null) + { + float speedVal = playerAnimator.GetFloat("Speed"); + if (speedVal > 4.5f) isRunning = true; + else if (speedVal > 0f && speedVal < 2.0f && !isRunning) isSneaking = true; + } + + float targetMax = walkRadius; + float targetIntensity = walkIntensity; + + if (isRunning) + { + targetMax = runRadius; + targetIntensity = runIntensity; + } + else if (isSneaking) + { + targetMax = sneakRadius; + targetIntensity = sneakIntensity; + } + + // Запуск световой волны эхолокации в шейдере + TriggerExternalWave(spawnPos, targetMax, targetIntensity); + + // Воспроизведение звука шага (если задан) + if (audioSource != null && footstepSounds != null && footstepSounds.Length > 0) + { + AudioClip clip = footstepSounds[Random.Range(0, footstepSounds.Length)]; + if (clip != null) + { + float vol = isSneaking ? footstepVolume * 0.4f : (isRunning ? footstepVolume * 1.3f : footstepVolume); + audioSource.PlayOneShot(clip, vol); + } + } + + // Синхронизация с PlayerNoise или прямое оповещение мутантов + if (playerNoise != null) + { + playerNoise.EmitFootstep(spawnPos, targetMax); + } + else if (alertMutants) + { + Collider[] colliders = Physics.OverlapSphere(spawnPos, targetMax); + foreach (Collider hit in colliders) + { + BlindMutantAI mutant = hit.GetComponent(); + if (mutant != null) mutant.HearSound(spawnPos); + } + } + } + + void UpdateWaveShaderProgress() + { + if (echoMaterial == null) return; for (int i = 0; i < MAX_WAVES; i++) { @@ -101,30 +325,10 @@ public class EchoTrigger : MonoBehaviour } } - void TriggerStepWave() - { - var keyboard = Keyboard.current; - if (keyboard == null) return; - - float targetMax = walkRadius; - float targetIntensity = walkIntensity; - - if (keyboard.leftShiftKey.isPressed) - { - targetMax = runRadius; - targetIntensity = runIntensity; - } - else if (keyboard.leftCtrlKey.isPressed) - { - targetMax = sneakRadius; - targetIntensity = sneakIntensity; - } - - TriggerExternalWave(transform.position, targetMax, targetIntensity); - } - public void TriggerExternalWave(Vector3 position, float targetMax, float targetIntensity) { + if (echoMaterial == null) return; + // Ищем свободный слот int waveIndex = -1; for (int i = 0; i < MAX_WAVES; i++) diff --git a/Assets/Scripts/Editor/CharacterSetup.cs b/Assets/Scripts/Editor/CharacterSetup.cs index effaf24..963a2c4 100644 --- a/Assets/Scripts/Editor/CharacterSetup.cs +++ b/Assets/Scripts/Editor/CharacterSetup.cs @@ -149,6 +149,14 @@ public static class CharacterSetup EditorUtility.SetDirty(pg); } + var echo = player.GetComponent(); + if (echo != null) + { + echo.playerAnimator = animator; + echo.FindFootBones(); + EditorUtility.SetDirty(echo); + } + // 9. Проверяем CameraFollow на главной камере if (Camera.main != null) { diff --git a/Assets/Scripts/PlayerNoise.cs b/Assets/Scripts/PlayerNoise.cs index cf8bacd..a7e686b 100644 --- a/Assets/Scripts/PlayerNoise.cs +++ b/Assets/Scripts/PlayerNoise.cs @@ -1,4 +1,4 @@ -using UnityEngine; +using UnityEngine; using UnityEngine.InputSystem; public class PlayerNoise : MonoBehaviour @@ -14,8 +14,17 @@ public class PlayerNoise : MonoBehaviour public GameObject wavePrefab; + [Header("Синхронизация")] + [Tooltip("Если включено и на объекте есть EchoTrigger, генерация шума шагов синхронизируется с анимацией персонажа через EchoTrigger")] + public bool syncWithEchoTrigger = true; + void Update() { + if (syncWithEchoTrigger && GetComponent() != null) + { + return; + } + if (Keyboard.current == null) return; bool isMoving = Keyboard.current.wKey.isPressed || @@ -38,25 +47,33 @@ public class PlayerNoise : MonoBehaviour } } - private void EmitStepNoise() + public void EmitFootstep(Vector3 footPosition, float radius) { - float currentRadius = walkRadius; - - if (Keyboard.current.leftShiftKey.isPressed) currentRadius = runRadius; - else if (Keyboard.current.leftCtrlKey.isPressed || Keyboard.current.cKey.isPressed) currentRadius = sneakRadius; - if (wavePrefab != null) { - Vector3 footPosition = transform.position - new Vector3(0, transform.localScale.y / 2, 0); Instantiate(wavePrefab, footPosition, Quaternion.identity); } - Collider[] colliders = Physics.OverlapSphere(transform.position, currentRadius); + Collider[] colliders = Physics.OverlapSphere(footPosition, radius); foreach (Collider hit in colliders) { BlindMutantAI mutant = hit.GetComponent(); - if (mutant != null) mutant.HearSound(transform.position); + if (mutant != null) mutant.HearSound(footPosition); } } + + private void EmitStepNoise() + { + float currentRadius = walkRadius; + + if (Keyboard.current != null) + { + if (Keyboard.current.leftShiftKey.isPressed) currentRadius = runRadius; + else if (Keyboard.current.leftCtrlKey.isPressed || Keyboard.current.cKey.isPressed) currentRadius = sneakRadius; + } + + Vector3 footPosition = transform.position - new Vector3(0, transform.localScale.y / 2, 0); + EmitFootstep(footPosition, currentRadius); + } } \ No newline at end of file