From fee3a5a398b72681a259c4cb4e66c49b52c07b13 Mon Sep 17 00:00:00 2001 From: yousan Date: Sun, 16 Apr 2023 22:59:44 +0900 Subject: [PATCH 01/13] =?UTF-8?q?fix:=20action=E3=81=AE=E6=95=B4=E7=90=86?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .github/workflows/activation.yml | 2 +- .github/workflows/build.yml | 53 -------------------------- .github/workflows/check-meta-files.yml | 1 + .github/workflows/test.yml | 1 + 4 files changed, 3 insertions(+), 54 deletions(-) delete mode 100644 .github/workflows/build.yml diff --git a/.github/workflows/activation.yml b/.github/workflows/activation.yml index e2e32d7..bd7fdb2 100644 --- a/.github/workflows/activation.yml +++ b/.github/workflows/activation.yml @@ -11,7 +11,7 @@ jobs: id: getManualLicenseFile uses: game-ci/unity-request-activation-file@v2 with: - unityVersion: 2022.2.5f1 + unityVersion: 2022.2.15f1 # Upload artifact (Unity_v20XX.X.XXXX.alf) - name: Expose as artifact uses: actions/upload-artifact@v3.1.1 diff --git a/.github/workflows/build.yml b/.github/workflows/build.yml deleted file mode 100644 index 42d417d..0000000 --- a/.github/workflows/build.yml +++ /dev/null @@ -1,53 +0,0 @@ -name: Build - -env: - UNITY_LICENSE: ${{ secrets.UNITY_LICENSE }} - -# Controls when the action will run. -on: - workflow_dispatch: {} - push: - branches: - - main - paths-ignore: - - '.github/**' - # Triggers the workflow on push or pull request events but only for the main branch - -# A workflow run is made up of one or more jobs that can run sequentially or in parallel -jobs: - build: - runs-on: ubuntu-latest - strategy: - fail-fast: false - matrix: - projectPath: - - . - unityVersion: - - 2022.2.5f1 - targetPlatform: - - WebGL - steps: - - name: Checkout - uses: actions/checkout@v3.2.0 - with: - lfs: true - clean: false - -# Cache - - uses: actions/cache@v3 - with: - path: Library - key: Library - - # Build - - name: Build project - uses: game-ci/unity-builder@v2.1.2 - with: - unityVersion: ${{ matrix.unityVersion }} - targetPlatform: ${{ matrix.targetPlatform }} - - # Output - - uses: actions/upload-artifact@v3.1.1 - with: - name: Build-${{ matrix.targetPlatform }} - path: build/${{ matrix.targetPlatform }} diff --git a/.github/workflows/check-meta-files.yml b/.github/workflows/check-meta-files.yml index 26b1af3..080549d 100644 --- a/.github/workflows/check-meta-files.yml +++ b/.github/workflows/check-meta-files.yml @@ -9,6 +9,7 @@ on: pull_request: branches: - main + - develop jobs: meta-check: diff --git a/.github/workflows/test.yml b/.github/workflows/test.yml index db8a3da..a6710f7 100644 --- a/.github/workflows/test.yml +++ b/.github/workflows/test.yml @@ -8,6 +8,7 @@ on: pull_request: branches: - main + - develop # A workflow run is made up of one or more jobs that can run sequentially or in parallel jobs: From fa353debdf45a4752e9f006f7375ec6a89937e0d Mon Sep 17 00:00:00 2001 From: yousan Date: Sun, 16 Apr 2023 22:59:57 +0900 Subject: [PATCH 02/13] docs: update README.md --- Docs/apps_script.png | Bin 0 -> 10841 bytes Docs/copy_files.png | Bin 0 -> 7689 bytes Docs/inspector.png | Bin 0 -> 25460 bytes README.md | 49 +++++++++++++++++++++++++++++++++++++++++-- 4 files changed, 47 insertions(+), 2 deletions(-) create mode 100644 Docs/apps_script.png create mode 100644 Docs/copy_files.png create mode 100644 Docs/inspector.png diff --git a/Docs/apps_script.png b/Docs/apps_script.png new file mode 100644 index 0000000000000000000000000000000000000000..5c2b73b9d3bd667b6c1c3cdbec534f49ec17506c GIT binary patch literal 10841 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 literal 0 HcmV?d00001 diff --git a/Docs/inspector.png b/Docs/inspector.png new file mode 100644 index 0000000000000000000000000000000000000000..2b1f498c76a3100a16cecb7f883cb84351548e81 GIT binary patch literal 25460 zcmb5WcUV*3x<9C*6ai^clnw$a9h6>_A|lNSA`l>mfCQAD5Q<2UPDG?P!GcN+B_IS8 z2)!2}^b(NXA$0hy_&w*IduQ&B1#Zz7HW!g=k*Cx_tSMl;U=)dxxy-;leKaynOnTh4L)JCHJvlw{s#s zmOgz072iF7KPuV&_WgxL$@ZcD(GL2Ua5!)BlUakBAH}Fa-4(K<&W!x`A3JXeEdRU? zxfOy>1MibRbWP(DiTqjcI+IBNBl54;k&L0Le~-bBvPZ!&+y2KZ$E^Q8QphSaUpt)b zUw`snWctsKP)GmgM{ehaRkp-SRvaI#9JkvxL~(~M{Ojl%!xu`fl8#n`)i2>KE)HRx z^vp&7eG+@Uv=}P0QfC8m$%_))O76E&H1{6N?vk%b%RuUBBV(!83dCz|Qk$UxRX6v& zW$4AvrO;Z@43CAr<;G}1o+#pu%KXDc-);G^A0k<*3r7pv$J0l!?vKka{5MJ;O`2h0 ziH#rSW(P~Mm0c!L$uhQgVpkt!8~>;cW)SI)Z%KYpH75rnyrnk!_#n$LO##PMcFx7; z=m6ohJgiviLcG;q<-4y{UQt(IT{~=~emM24H6c2rrDj>TwfEZt76-@Veh9LSTjAv| z-_0(a(Km{2e|qwIab_Sl0@3t3Jz}KK&3w`3-3zo;_?gnwG zvG?aTScjDT4&d8u@?&LwhkHWZXUX?wuE2fnzSqVdgYCJj^m0`ssm!9n^M_-9-fn@A zUfiW_6RP#s3OMF+ua#xB;{&&Jqf+M)<~77rSY?K0aJg=bu&suVk3mSN>XE=|l)3VJ zdEVlL^KqTicJHR$i2u=%dNy^0&uZ(Pqr?3X6HDJmPRe=aKPFkd zxYFu_dHrTXYs2k-e~+zjpL_a!eqDh8g#Gx|c4*jdv86%qY}w`C;54+iUL z7R%~#P6LH?>FfihS7OyH9gZCj@~gH-k)g%pIcIrzJ(ohK%|xtN zLb{^c7k7)xt2J)j`2N_IulGKxxWJiyK+(Ft@u4g%0u0n5YE{B`)Nmy4i!w{YouY^B z{w^7iFx7{$F~4sHQvR@QiQA=_Ctz%{KdlfjAI*xMMIwoj^26ErRY{CU{ab5n0#6!i zv1x6o%Kg5i0Xv>%`<^e63^OY=LA1Vmzq3uUyp1U7IL4hUt9%ewV1vaD%c)+YE>1(( zt(kn>dRVf$e^tlKR=?#oL{=~P(VO4#R6f(qvCjLXrAItpbIJ)G2eRN>P2sGxwZ`4! z&X5ADn@wrOtf4u`caLsCswOIn_BD@u_eon&o5Q`WZ%*Ntt2u+DXwsKPD!h(3tZ3B>O(jIzip-dH zzy>QB((^Nqd&H1U3k|&f?iS_lx&%qE9z*IGhOQf+q_=IY6A%I$*J(uzd@MerYE}$? zNrcpfH?kssO{uea-+-sc)#FE3j(?6-j2)2Vofo5MocBf(od-uRIQNn;Y7u37mq`hi zWB$zl&K{+xj@MR9SMx15YMFZPTRG-`T*(fnu9WY&XN|aAu~Ow0e2#nF z*`fJaVVVgTU#a=<>;xJmvx^(^(ATfwSXBW=F-hS+#=>b_^I?uD-oz-w3Xx)Z51GQ| z#+LqWH=`(Sk!wQ_nD zMi~~`9j~W#fAq3f+X#r|N8rke?c|+x@-otj;|Fw;pAP6EOgnN^^-MeBe@ibMUuzka zwyEE74{0a({jI)!2_`5=X^~yWo+9n*j+z9`y8cIJR~DqHKuJ4Ukzk^s!Yh_}cX8s| zICuQrSrCpW(bE%Uesw_`=1UC4Xbarw~iw+b= z#ZI4@aIk%;YWvu?KhI);=)E;REz$+|D4d7JxO5N1sZxs&jh_(=-(T<#_`R$fLDN+h zf%6eR3}Y4b;o43t{`2jcG_(2(0_PVZWFkm*RpN839^`#8o1NSQ4VnmtbmJkTzGs($ zaCX(}#mGAfb8t(ETsq`v_hij_IM#)^;rPxE&p)a~Br#i6OXG%|;|E0|*m#-7z!_ya zcJdz3!^ehP#3rdATw@F7!zz<@F6)7fM%7AyCrq`Sc+DY!P#fMrWlF&Aj^lOi_*dl4 zo37NQA*fG8-%x3QT@b9Y>qz?y7cLSeH3kM#qR;TK3X`n&;HScJi?+9 zOzl9ia`(vv#BTkZU3_b`{_%=N${b{&Zq3Fs2 zLYD=J*uGLMe`(1yWauR07nnz@sGww&N*JCeRRlj_N*)S_4%;L`%bt4Bjz2x)`c%Mb zWXpN-NDxJa>uIR3utn4s%sUf{(ckbBUZ(`|?`KfihN=qJ!H^oWYw~HA?5v?H>Hhm2 z%R@hp+QV@x$0X$Ta4Y-pfZ5Ej`oV(wFe@flCoB{)D}F+F8pcms2bndnhPI!MwHcKZ zNOOuxaice@(_iGL3$cTSH;xA~Pdrsmd$pd%z9y&>wK*5LBX}OC-~3e7r@t|;?paZ| zS3-!U*hB`uFXVzl%yV#k9=a^&ts&1CR=%359G_TgkS;u3Hq9O%9seSw${f?6&IrAX zZOhBz?rEM*Pju{_Y!ybLBXcuRZk7b$L}AkU@&kL5t|G=#iUdN-zXoS?t|#jd+v2*^ zihS0S)^ZIKzvX{+?fBv95VZR_v@*eaJ0Ok` zYtB#VR?CalE{ojg;Z^f!o560@ti-eMdj350|5@ocq!2)JW%MkbF8$?L>5KIAgMpR9 z0TgqrIuuWRyzAS&VQM@%@Fyg=Ma>Bv{AyE}v}!CxV>^j1)4I+40*a=&!U7$-YBzM! z^d=wusldVk8P37BORUPUWX|o=9o_ww{!5jYhIz3~+^XKaKTRAw?@L8FRmp#`yp1YQlaIc7&Qvu=evtZLv^M(9CxKOi? znhEl*m*jqOfaZTm3o7IO1rBoo;WEXfULk#eUj1opR*C7s=6o4Q+;07%8t(v=Bv&HH zyao@fKV<2jRrLyyMI(Lf#!l5}>cOUl0g{v;`n%ak68~_o;$a4%V(;*J>BQ8r{^Ze- zo&5H%15{_WBPKY0a>Q$Fi$zn|S06v{r9SvtNGXkwJU5!V0e-DUl5H}2TuC@tKVqQY z5sE%goKX@k!MnkrXseOG{y#rSFVew96LF`xJjvOo6%#3q)J?% zt{GwF#9y@KaGz8CJA{STmc~H}ywDn)s=!XPyuu~38hxsz5%RQMik>dVrGKz;P4sv` z$YVP$xMs^QHYv&WCBVScc4j(;JzfW55mq3Rjr3(JNtE1bd;SsU+A|3^TvbUV%y7B5 zt&UgYw_MarZ^p$`k0?{fOu^V7p4TGgv{qW1z+D$FmOV)cjMx< zS4-~gCG)6yUz+?2vM;g#@O@DR?g2Mx^Sf;pqI{-<+01|7VoUH%nAx|lYJ2K`k$&SX zsL?+>g8w4_e?$0d(3Mb;f71uRF;<}~CO`LL|HUUlZlV6aaSQv`D!WrL%UwFW9t>(b zAIM+7C>1div9R`-f&6P-c&i)mor&NPB3eCd=XpH&1M_iqX^1a_Du ze8(yCG$dKhDJfaW<2$Fq%Ma-a__;7L8cbI9%5xmWAp|7;OvhVFh^7LDIm2PhZu&t%aE}yO5p{dix&4#-H74#i;O%ToHq$he0L~giv&zu=N4AvS&`R zw9Ok%bwAt!K(Yb`1{%tDAzW#{+6x0tnw8WNE=Ke$+vGR(fyULDBM~zTOcd zd2h~6U||E312{y{P_aYIP%$D#eYC(j(6Y?tEls{D4vty*SSz*XW6VRmnZv~xN&wdu zaq)Vy$I7TGQ(FD|D-VVp^DF-Z0S1IRVj1DLoV?AiI99(t zQ(f)Qoc7%WpmRE1B=(G*B2 z5$}dDHC$Z=EUZ$-cdd?Hum9Y|YmJ9{{Xad)TbXEhe%0RdScRH5^qhZ`y(v{DIbMC; zMA5ML_+bpd+&YR^!IZkT-RZY;w=A`qJ0SRcV*u9Eo{CLR(q})yWjp=!UiGMy*{YE zQuRcwSaLfULDAuJuL|Mf&;jOX?yEiE(xJ%U1EJQ46M>MEh`1tga`h!fs9t!YjU2m%JJu zf3kj#*u7rjE$x}O1Xl}fDN0=+Ty5E@Cj?WUtBV}aNb5zr^y2NFm}N~jA&k{BMtb9y z(7o)|VF}gF_4n(YAn743VNF-FE;~=+LqG3FiF=OOVB&utz4fxpHONVOkG?DGk`VvG z*nH3p=p)y4#RfU_T-*~2Y%uitt4umcJLRA(P|H%@KwTUXe_SVP#G4(&!R~z&(qNxw zBUR|NqQFqc!>tfQQxPRIyQ!%{@%79`NT>Y0i!+Jw z=m94OCJo{HCj-J}(9%hcV#C50DYsfhMI_HL@N7{N?b9DGPM4@RAhxepssBzpBk{wAI$Rk?rzDc)^>bg?o&6X8(cerkbYv_AHKv@xvEG=cKbmMte zX2s1)S|d}{`sg{-e;s-gjyFf#vdTO-`yQDsMhizY>}#bv`PV97m(4D~jaLiCtEB^M z=4y0H>0jwL({s|*;+WXsxg6oE?Szu|OkZRH08qXAi}2Jb+7{_!0XM92LGpzK*bFjB zL$^Dyk@bi_(=1ujmAKCAy14r+lNn`S#IU}nJjZuiz_mr~^OXJ=*)CHp98|~2EmhTT zoz~)V3&HtpOg3tQJ?~yJJ~J2cg7}p0!v=lr<2IYmXd5LYWx|fqWo9JZHIg51!C76Z zRt$Ncd#{s3(Cln8SLmVV+Eb@lvd=pwp03)teL)UV>@?Je%$VIT!t?AFh%>%;KyAA&e*_gGQq@G*XqjI2)L36P zU||6u7>3TL?Z5~*GvHax#1su#`doOlckvG3iym52c;2auBe+ze{#0xXyH27D*AiEF zC5|Lnp6{Xxpbz<`P4NS5@2df{%Q#=Xv*tS=h4$qgjvJ2=#Dwkhj4yE=zZ6sDL_fIq zX+zNglmQKj6ilq2H>Oi)P6s}Mp~0H|{wY-T^vE9l!pKe{aU`YA%{)EYcVxaK`>?{t z0m@)>mc>iBKSg$@Gd}qSe~MEIiJuYA5aaBLlnQ;8QlP6Gj)LiYqMOuYsv*_fUBvjN zyS%blw|>`AW@B5}-DJ6F-CCe9u7o{wY5fp#S&EY*u%P3#wsDmMv<44JTUzs&P@E3J zzGa^&rk$A%tHk+C7MnuRHiI-BaWrb{b!H6;W)BS^Tu$u??Qw=tOpklT*^r1OOLt46 z_v=vb@r_9ZhID1HXE{K-D7W^q*a_d8=7qV%xRpgK7m=lKC2!J_Y{F_giUuoyX^<90 z>0d63Qr(YZTf5C6>V{GMTmHo`rPf4B`4@94rB8n|%llT-mAdrQcbh2LV1nT`>*(7b zf7+dDH+fgFA;8}g_KB1h>u;9wuVY}kao&Ld4gTOB_fJNI*rN78JO%^S@G^p>z z;4|C4ma2b0N2j0jwyV0{#oDJ#To!$Ir|X+$3gseE0$gNwXkFUjSEV5d>$$?uJW*@y z{Ii9At0~n%e)0z>ReajTko>yvH>xgW7QA8M2?Z*rzl7#0q}Bzgqu;XeI?G3bI^6cL zktDVb`-Vzt4c?E5HG(Lbx~%z*>t#-KsC}A_?mN=nzK(WXHwX{RdC89|V*yi=do~?N zw!g1o`T^q9+JXb&lnnbI7oY08OE=MDHub;O=AVz#ObXV%<^+GUnlv#{7alef;WC1~ zbCzH0fe@SX?*L2+8P{<}5NxIs#vH#;EJk{gw9Z2~t%J zHdW;Mb4~iiqKngDu`X)NpkVG-0L7zmKm43V*mBeG54RDZax+iF zG7i?Q0T4PuD~Wr1JN_2@XBdoCV=6|7^rtnE*q37(L!Ga?bI-|-_VPI+Vja7s`%Fi= z5vukrzvghXpw9ga%L$!l+e<_7WqBcIXxVmfODSU#-r({_KHLnvV|~DJsJwzB9@qB= zzc=fjAAAzinxKXn{ej(*jv0^grld7tity z`_<<*)4uEVNMWTfHyOE*Tk1mq81{gn%xrM4v(M}PO6i#2km~WlMkttZufS$a_dZ_2 z!WHQI9zaQVXA#za$u42OI)fLCQajoq;ypZ?uuen6Kyzf7h;^NAW(D{?SZiklNRMhR zz$ftX-P^npa3icI==?}bTe5uovZV*jl7<3Vqjm<8Zm7EhYCF5pm|sf`)W&;m#CrN| zFe<(CPhEki=6tZT7P@+^K8kw*;(xfMrEnK5VNniegzLqLT}f3Z5p1f?$-fvCqj}|; z2snnNexX}^LAw9ZK;>FJ=VvLl4#RY{)H1m*!{x^PeMzW2gQRQU+}=Oe!|Tsj2ZpYT76)2|)f*A&)trZKE}N-cx>rl^B82e;Izx2z_~IbJKHBe@n8ed3l?!zC}qs@}()v^_f5b*_Cw zKe}K0oqGcA$tM0}it-%Sten%}l=6B`aVHMprv5VD^5-a-V|cwqp@CYTs^rm}zs$sw zm3rOL_=?k$MC(fZMbmOfrT4DNW1-J^bP6dCp4~ef2j@e|Ucg6kDRxI*y#9SEwxv*- z@?Naajix}ECf*koEpg($aIp`K$x3g}<-;zM3KuUw&nDynf?I}G+xzOC_FH1@@T#{T zig6cgT6-{+$NGDAtqJ#pqN?c7{q>QYBb^zVw6%%7vOm7?@=0#I>dLaf!Mox$dEdoT z6)0cYl(Vf~j)t$pV)i_j26wBT*M+fGtrYHvan1!ZR>nE6P1dO$1Lr07^eNwSFAo5J zLm08|cIqTGi00-Q3wwM<7s+hEKC5%9z+X1;v?l&HxD;`2yhN3E`W4#uNWn^aO2Q!kk5tnQ2- zT37IjhIn#QNLaIo7;e_^i;5R0wVb_Z+xe|1HSnd19@hg2if^AsFgC#}AxxaG>-wTG zH?QY}hpKj4RC@pJcL1)>sH64;Iz#s=xZK?Bjd?0q7op0xqBQUv+XPHNw52}b@x!1_ zo>#9v9_gTYwkRybNQ}nDY=I|+yu$vuop}}&duL8WZ43%kSt2@&%q{t~-d)2415LJO zlKC(yNcO^%e>{!ovH#|ZJ~d5NM|kazH%CNZnr-^>9CD=b)vTTEn(5>%l8TEhjWzJU z-|kr|hWTr%iJM_}RIbG6VngG^I0O7r#e=zszcU#GT1RQgj^M&bMQJHL=Ug@;=hP4H zt>@{&dD*d{xdhEbJo~_%idCi4a|xeh2eQqVEk=nJrEH5OYix_rN+^ zS&@$M$7XbQ6tYld=p1Tb8Y)Y$>PS*fK6}3@?&c`rl|h7Ph(7*2G3<9sv#q{VSL|;! zhwV!%rnFAeX)fweP8(#=pwbGsyEk9jel98hG_r7Ko;zN5Kbau73=FCDEvwe2beAmI z^e-e|5M-)Ec%0G_u~F(c`FeeQy5;i>UyB6LLOvVfc|_mR3An(iW41cf_H(8lox;CG zyw*T7rm|9GTadj(V?@7%s5pf*#lzX_Hmq%V^rdIs$+6M8Cs9z+t=bkgx7_(s7leYM z-Q(0>qocaIG2V?=xf)F6WSgKbpS>-HkD_lpogUyA!cT?zsO^kXphL|m*-k&2WtxKU z-_pc1;NM_rmp&{CC@&s8En)S%XK5^OCGaE+kmk=jIi3MDHasCL^P>m3GD5gPK zOJ4vHAEqmL+yGY#`Dj$(v0&_wi7w!ypMdR74N9dPzc}L6Tsb+(v~sp#f(@I4Q~Y9C zLgUJ03S~gQr{OP98-&qSKH7|ZCP-@@!LI-Qo8XW};-U=Amq@XQ;!UqOstWoVFS^?D z`@+6f1c^J#16HAeqX)KJf zVVg;;B^1%M*1^wpFP=TtK{0N{C@~@RCu?=RFJjnf7_YkvaLFnRG+5{tJhh0AjoUs= zgKm-2SiAAWxQIiFPU%KXPct1&9V8)&wY_tre*Y4kAD7)ggnYzJzSi_uIW6O~NQ?oU zOo)uI<0~grjNDNHjoeLpe~+b*AwJ3q#<1RGnzKV6HEt&UmS7C8EK6D4Wzv{p30FNT zU2|S#-|>eQ+ONUSFxmnWcQfW;@`*1&!~iR3JL=k^FNqiS{Nf9=;|HT6fgEk0gg@z(HumnUFwvYhrV{LT*@kFWieHe%FAyILp4u92BFkLJiBX>24rx z=DgJEny3w~WEaNcs4xV*mO!aJKBU*z5a0_$M|P-eMC=3U@{s-VfYNPH_f(#v29zTS zI?9-`Hx0oq5_*dR{hBsI;jrn1Q2Dg$%PcIu!o$NN^-uO6Q|M z!7;(H8Ey+jyMQEsXEh7Q7h4nUopW5HS)Csn_eXJ2jI{3vQ3bwX%QWXzMgE+L^nVi| z9i)_4Y3h{fq22>{<{%D9KiyX$jEBUfdKw&X6)?8Ay|ptj=LNMW1Joiu9u9W`jd*0C5bV_2Yd^a3tP#fO_+aeopODD2(Y-?xL?+l?0bz!9X5wSY<(8h_>*I zu>LF&(=ht2r7+fJ5%_#V3yLDDW=;cnFZ%iJ)*dh^Of@xRPaZU(y;n!C&GZI4rRlFb zAhmLxZa!^2APv39rdFHR+D{ON5%IP4imxN&J~%;dG7m9fjYd_kcpKI%y$dnJfAGEZ zW`_G@EyufO6pzj9Mmm7&6(5H*xZtpzv{5!{dMtUJA7G)W1o0*n9h_&4^eMELGUD9& za`3be>Z^ZmBB3b%89&GDLkNS(8Jcx4W<|K>X`_YcmO=40&d2%MrV3gehH&`)3$E^U5gT-h+@znmFU5eZSh2VAFxVD^vH#0cF znoITVjy1PhKF(G#b{vM+)~YPyqplSWo|)VSH;-pcuHCi3$$a_^(J5n$UfteW3PG=~ z#57ZVDK_YGOR!fBbkU+jnZKj{j@2Z0pU5SESWL~*F{KAKMot$$Wk@pA)?gVjc;uqq zOk}`oDyY{=5Kl{t234DohS0|N^4Okp(ui$YVM(Xa%Dhjb*Kfw9t{qN=kHhyCao8nh zjb1Si36hqrl+=VcP@$DC=44_fLr#SC0PgL97!RNt)?`q9&v9v<7OvKx)3{i>nCkIVd;%IbTWek)E1Uf}LmYJ|KwNmL{%5s@l?^#1Z{)X4zW8(1H* zyOTLl15Xp)yz#%AR^(V(h;ZZK_SnjDHr@V>mOuuz z1bCAf`CWS2`i=eN3dyZXRdO269@@K|4k1%>E!){FcHpJKcU(*)r3*Z4P1A?6*> zg*y`ptV3T8elbXv3tg?yh5wBB8v+AN6P>eXqG8Y8(352(xvx0cFh}-7(BUxF%x}^E zlZi9Uh@|_-Fr`tduY%;-u9gDb1sOcIqU$Brz0j<5zrm%UQb`vJCR#SJRm9NlN3`1f zsPDFgynW|~`vjo7ERP~)xR2$l)IR+~F`t6a!lQW(tm@YI4+XbB5z2`5Ps#Ex(vVZp zI?RakU05eGufsi$?cN7QvHydQkNWK|b-VqNR^Ks%`xprI2Jb&$M|GTV+6EhzNH_5F zX&eplvI{oK`)0h?;G3V!Lu|1$+oAV``P zesVt|*r0cnhJmFu8LBqV6&j zq#JW*#(IcX*|U`w1n&ktmWKyQx4%Ei2E$V=duwO_@nh+Mmi_!=}yD?Ki&nX9g zL7(l))=#F_1fYP7B2Ul3sL>*e)F+f)R*?QO=k6&**Qwj`&wDSAbrDBQi|wPy4kg)~ z1CHQF$v{`#aH{Vh>!!xg4P=MnI~H-0mdib6YO3CwF9ECFn$uw5_AI=5D^2iLMB{m7 zVUpNSGDRQ+FHQkWKF{3%g0%geTvi}%*Ov6?c}v2MU(nN%M?UK7^XaxagOyE1 z;n?HZkLWuyrb`+_e|bNCoh~sKs`$bmaaBo3 z-f&gNeUUVH&EaY-!z0vX;<-aug8X65K)XV;v4jJMa`>P~mB`&?x7P$(?Xyln3MCsk z`>b*49{yt7uj4Tdd7mRWhH}I)Al={`y4SOe*lrxG{~&H!CN*@mvc1_3M;s-4!^g*F zn#8s_%+9;uhlhxxqg~~ ze)J-C2BTr$UzpkaoR^zAwFih+KJd#DjJIJTb71J_l(1Z|v8oXUK6egYznzQ~SXtD~ zBv)a>lvyh6bt)~Im}6k??gdwRal>EG%tQN_p@I}@<#Mn3Ds zAGkm&3K(ygK_yv)nynWYo!Z>A6`%#f;u#v(wzgwapbf4p0y@H2%#(@2RngIgxh0*1ilUs*WAD6Vv(y4tK(_DRMluacxL7N zT!M<=v)M6)EFa-%xiyg&9}K5%s<+}34}Ko)IhOh#`}w02-xtxx`o+{e7T)cZJdYeU zbKEDV_q<(F>o}((=?Qp+0LGgf(uR*KbIkYP8&=Q$*=7L^)Wigbd@x{A?1OwVsIWBl z>pPUj1kYyV?l|^ytN9SnZpA{G%YeLBi4*sF{1Dr-KpuKD80YBJ;yCE>r#dR12-(nQ z-2QE1xhwZe&J%~?aacC(leL0MwgzJ2FfpDt7iGT4VgwthLq*(OQ61{fHFe& zkeW@YZ+p!DXBfNK=6I*B)Jxaa@um;V-g%GLY@jbDU$e>x3(!@?y=kK1<_!!FT7v|H zR)T1A@#Ya*;8_9wO;_nz{sQPpiVVX3Vo}GPT`NHsx+B8t5$j#|5MUVnwrOFgW)IUb z{`1&?sE}Q`K5t-F|N6~2?_aM@(j=EzPHj|E@xt}3;)je8TOCEUgRdS<5`>Gw_hi1_ zr=<8(?y+!Z&2;J1nw;TsDncm0PL_1(Y}dn(I-V6nY29bgCan}T7D*PD&3pR7PMIB- z-d#f#O~*LazC5yA`xTtMw>bd+qj;`#*><{3`tXwhHoTD;3IC)|9kBJ|nayl&=87z* zX#sT6`jj4b;zL;)Th}|BrW_7)KgAe48Bi-6Z#+Kh?-dtV%znHq*kRn9p)y&34wbfH zI8_aaDL6=k2Sb=pS6N)wk3qon&g&5ID8g%w!s6m!gDN6+CegYO&AnMfaN6QqN%!0P zHf3>o@N9tgFc|HXx}?warP=jMF&;*RX(iXp5K(h0h&N2CD#(o6ZRM8Q+f)@7WI47O zzsFIooF|s6GTcZ540SJSL=aYrJRdH{g7i$CrkJRV%%`mzMXMh@E?*g5dGYhGPj#bJ z_Ol&dak7iF!QvY12@iGEU8%zHX7eCoF?L$blryL!IrdSnB{l!mkA`(Tsr=k$SSYa- z1>bGf-0#9FtV+61Q%(TUdv(Ia&nlCisYy#MqE;0Df$0s#^(j>H{LA-D{yBj+X(o#q z!zvY`&V>aC=O0MXX@F(l5N1D%ARe*|xkmqnAg1pd8MkxXrfU{f!G`V!T_!>TXf|Aj zzL$IAofrcxsI}+YP;ZtVW_)OU&K^<+F+Z1?P<=__LCBXIfbCj-elab%dR%>}ebO}7 zPNT`wM|eiA%aFDquo|C2lU#k;r!_(PC}~GEw^)VRuB9IY-dHG1F9M?C$I!mFD8QN6 z`A#JKK0%vfln2KL7Z;;jy)_>DYY5*?QBYQp_g=T0KoT%h^aFMP&LD!eZ>*5eU`VqZ zKh5i}h2L9H@bA9=Q%bx-5|)|%o21|8z_MqK(?dne*YE)u0UdN3rZcRD*#0y;gL2%t z!Tvf-+my|a=_^~h$Iq~31_2tT&^Bvxh*|xXWVsH;UKV3A=aE4OCz8YW>hdi`$wZ(o zAPRmldXK_|o%GzE3_VGI`^dP9T)A(7oXyL9ZU}b`BQxFIoLMQW!n3HXcHuew(IV_c z8EZS+a2loTJ95D2e~0);hr8hbMa$G|Qw7`%7pI|PBsfeE+UB1}6Kou<%+&(j3_^g{ z+ng;g=c1pgp@Dgd-)?Di%PlOFc)Gx6t)FIk zAlN$UfL9v~t&_n?!2JsGX}+r0{>n9pj6_qSn)FFKfmUBAe;ZcpoqC0Rjn6=NyYfSq zqh57VlFSi7E8TC5tS-==|6;3Oe9*|b@@O`9^3Vw)84{!c(;=v7Z=Y^P7*2YTE{8jX zM9d(zvuBU^aAmxo7}BrfjfUeEU;WL@hLj5wh;daonBXCw`zPwenUUHZH$Fopvz;&^ zxsi{5ea>-Ru3*gcSxzDl!^7zA=&xS*q;c}5h;@uRR!ineDMQ5gXlb>0N{0SnUQLLWb7`jy+_Q;)EKfRo`-nA?l|kg`0W_X_RLZa&ulu?Tig zet7qMq(N`XsAI7gYnvlG^O&Syey+y;#(cWnf2lhsh6)yG3mm3zFNS{62MRb91BBDVf0w7UfE}wA zD(=%R?)PCjzmyxMQhtAX`OZ+}m)eUw>jInmMsOADtRAcESE1}G%J8=w2ajXh2kSvZ zU0l?_{g2N?^W>}#$1I~{NTn;*#WkW6%6UHKq;bxw*l!d;^m%@cH;diYQ(9Wv0c>Z2 z%Dvd%#+XB}2^9*q3krASWqMkV6OTIO{&RcaY%DYIUslXfrRZEFtSxgz1Jlb7VW2e);tntcQ>f2{@ z2Dc_g$AZb01mU)IRrUBxpTHMyBicz7tnT%T%?n1iRHQVqn`w^qc{XkIvlXiav&Pvn zMXgEZE?o#teEUFWFl_CO-}TmH221H%cO|j$Pt4N@wCO>eM>}Z`*Hid>R;T!lcl5mL zDJH{~O}Y*-?yzrlhAfxFQ12v3{CC!#1G%CgYEAXjXmCSdh=R6CFt7c$&2o@%aOso1 zVg7fyEJ5r_?maHusiNh-n$?bnC`#QWH0VMJb{%{=IxG#g)!!e&+bdYuyaR_w%bKXaD|5{p3P6B ze>$2(H%w#dWY&8Nv28(pPi^bY;_plD58;tJ_XStv3a;Y6e?=T#6g4Or)d*2022k<5 zWKi9_3w`@la(qp9zxC%=->Xjh1T&NPhtD0IUfr%1wEgMPq7Y%yiSrYvh+HOBvSeba z%i76wKT>1ySSn?U2EswG@}szmbJVa?jj7H9G2?6NS^7f0YOJ`i*NDRR1k?```NN z{xbKxIRR4$-1ga-IKC9Juz0tpcgvU~8W5CP! zwz8!AS33Dvb-ekSEM{E&*!A~S$ohDT#Tp;bJ%G+a{~wLzBY$Y6aqbhL8m*BJSa$H9 zc4}xPxdDxW>KuI3XTw0=?T`L;4Xxy*?%(IF5x0K&9Wu{paNs>xMpLQf|FowrfIMX! zbv~+7A}Y%$9pb6HYBMMPq32~>!Y%&86?xy z{nePxX}+Oz(TU>H4e}!ayUG)|DSGB6_}6D>eMUWx0Ld%|SJh8{@!Hq(q#YuaHTZwcS(tGqAJoeR;il=Jn@Z&-oTm3)hSc%ev5!F27ea|+JV@yJ2&hB? z&%PXZhN?{GdOre>m*@28J0ZP0GiX&(LVhhs796(B1FcR!S*}eoZvX-GqY-e7#Zfph z@;*m+C>TydbIu3O7TJ!D1{#OLAPcO-Fmwcn+EE$khs*=1h^k7H+$XW1;W2axOtR=t zhIJ6oBXwsc=N*pH~sJbxcGhvXDUGVUpb(+Y;Od)Omi|VFOgmRG0VR$etJ?o)gp+LioIwb ztwge9HlKd@S0bn+O9b&|WQm~V|0)r1{Fg+)A^Tqv!HgM@2xO`X{v#1YF#VTAz!Bc? z_9ZSn;?X}60VW(s1ehow5nTBn5`m2Z@qOwHxmU9LzS0Nh5SOA*OoWmoVEO9FaS|O> zIJ;XQ`Xl3|y~uAh`*vg_stwd6F80Lp8_uE$gAJ#XUjiJR;y7zGP-En8z>5|Md5P25tkz#P?QLlu zYX0IcZpZmFj!|gAH{L6lZvAh@ zJD0lOaF*t6zuoD0KcDfx-uqG-;!omz4gaT#b-2?pL?a-s&F%g z;Fc(PTqSXQWwdi|Uio=k#V&@Ij<({v@zT_L^rRGq?3>4pKGIy3K4GS0eA<*oUlgsP z4$N!yx1e40;0{#7eOV($dVNdMkF(0-%bm+e&rj zkvm;@y-(>joUUmnI;Euhl1!UKY2eg0MwuX9swqZ-i_kKy0cjNxaP#Mz_)vvCdErI5 zF1t*_i!}r5O(oU}hunt`b`04kqf_a*g3UOK*8d~~$*^c@KMhq?x&O!Zl#1tj2e~(+ zSL@FeMW0c}xrA`fhrGO*!Y^kpNGm7~k!T4VVV_WbV{LIIMw%bSz6Wn^EQ)o#j8<6G zloF6)av>$5raLmNc6j(TVzux5!-FRybMpwVb=teTd4x%mfCt}vZ%su!?`fu*W3Ki1 z$qxi{1+_s1iBP1qu_S3Pz?u9AE7m0|$jw zLYkA1FiGPD=cvL)=E;?(1Y>lWiq-|&0GbvW7U4^3u$nE#xL7+Dgn5wGEV8?@{a`gBhnz}~c@s&JY@<4fZ$ zPqVio;ofArDX3xqUj=mY*#tkn7T-?)ztGJ9ISA%uvmwi0x;a%>U-56cX`;VqTcQdq zKI_(+KodhSP#}*?_HS_+ja4~+s{wiH)hva>>!>wD_{Uo}o{g`SKfuIeBUz+bt3;{k z?&3t)3B01!_2i`1y1Lz@qK&1R3`I1h(@a(%fI;EGSHi#e0sq0G{I z9A!d?UHAx_DYT=C=i(6Lsc1t8uZrWa2p;qs?Bg{q&BXmf`1U&XQU4-*eMt$>;bLr- z#cFYo!+SNdh_+oh?8$^@aN4` z9W@u%{LbtSbVw0yv>GQDh~YU&Bi)>`v> z14TP&k{D!>~HN zgK`FV_90QtYMoSjUeS0QXnRbNn^Me#sg0TJ zl!J>z1{IS{S>kIez6f1q-!IeQmv5AHc08M|R&HODt5N}8FxSigHOP}#T636jYBGh% zqrLf7XFobL++Dn9qLuhxo-7`!h&^TVc*l(jC-5pV!`D~@XYsxzt|RB*LO-0H%Z%fr zDPBwebBStr47K$9Z8K?4SqauyTAW}XCU7(PJ`L~4u-*2Az1yPJ@X#TOY zLK?sD@3q3YK+P&S{ihpNS^1{7Is=dLzU_?3nN% znbLt{sHUJ`N%L#4@1j^#AkH;Zk5*EkO-<16834<@EEt`J$l!?l`|CWXvcKh633yME zpHuKWjfw~UOLenTGxTO=)hivb1=-_F&wE3({93iBe~|xzIp7b~YZQNQv+dY(hd0W= z(YWCbNgyAYe|0_Z)eNcuBXA@_hKgV^b7Ju zW4YvBj4pmLOiiLj4`7{=lR-zgfC@T*g6hkl$M~<4^42vdE%3%M9nxS#q4293M`7pfeBSQC`mwYsR+_3T<2NtHw!KJSmqDW8kb=Z!XaW z%O_D8%ZUx>tg}^s&9il6o8*^+M|YHy`2=VV z`~kSc4|4k+{PYlbrok|HFiK_TM}0ic)FHX1!!?PJ0M z8~VN)^>v&FCij(MK2M!#1fxBs&sb=hbS%5 z5SuaN(*>ng>=rA{U$dMs)B1ikG~cEnitK3|jVRP4J}eNrY-kxps6cFdSpcVTh38~3 zY(PeGusuz6q3(U%1V*-lM-GKZQ*g<2=W!-3f*|HkiDHImIjdi5;?*X=w2KdG&AOg z8$%3;<##{DOcK8`UQ!P7m7~AsZe|MD%*y^}ZxnV8F!?r8ecb7>r($(l~X! z^I!|mOIB1<{rTz9Y3Fy>b3dRu-nSO|-(TiZ97Q>3_l(2pKJxK}$<1jVz?xn^&$^w^ zf}B38G%u;Y9&yKlm0(-G^3=>MH_h=*lYko;gzM^W4P`moH?UrbTT63AoolUlU*w-6 zkG4+JAFhbq*lU7v&IOWouJBCz>sR0;2%(yil;|jTXcmk5`slLlv$-#7#4T9VwefBX zH&Hy_4dw>qm&0V;9f;uLq~9|>b(W=ha6D5L5XwirSJXkjKiO)qb!Aaw#X}&*=Q=(a zDJFdNxlfKzBNe0LV`V8w`bKAxKxdKq*z4|0;|ElQ@s@nAr8P>MMfYvWvd^m!ki&mQ z*rKLhen`&A!1W^bbF>bar^Y$rWUQQU`o?HIvUqT}Nw4&%yz^f616`VP1?{Tr8=?zN zsDLzfqQ^dEhkLYeyg{AO?!lPcav`Q?is>ul-o1JdRV?>wnV4o#iX~gGN=8<8QOn9U zEPpU$i(Hv;AS)PLLPfUzus1jncTcc)#x*+BTw}i@f1-8$XG=?ord_c`haAZ$xju=~ znTYwXxbWMk^Y+&hy?RJcCi!eipNLU|9x>6|;aUFF4=BfE&pO{@yZ-GTJW&MU+Rw2Y z)kUFPA+;3@Iq=$_Hf+2*;wD*n8846j>*b&B?0W83Am(ca6~qvfbTsmB8m^MH8=HEm z=oKGc6bD%AA{fnIK>&{$M_mBCFv(_q&xOz%}9DA+Cp$8;puO|&Whb+ zW|&UAjvN@i?CRe>YQ$Uy-v=r-_P&2E?`xZ&nBtuRg1;slZ3AIM8;rB<;F#$LGw-M~ ziBqo3`J{>)Z9#w~fLS&%Vv@m1Ev4ygC+7scG}?}>H#czq%(rFOZ0YgrMKE|c0X!nwZSohu1Ez?bCMr|5&+WQRoB@1lAE>|I z4j4%LM6E%ZBp$gNHsNq*d7-d#7*(v+e6RlU_~5sw0OB&_NOkGiLo1x@X5v6=abD&- z=z6|=&T$zi-pF>S8B<@cNp8=GZmxbR z9}I_^bITL}9TLg=3d-n#NOUnwXKio+tEaWZ_Zr|aV#0DO7qS#&g2r{vor_75Y35a_%a~&5&HPK1~wFeWv;J>9EI(+DE+C@2{kj(DG3TGhO>rCIf8_r7I)R^Im z(3a+XQYeMmLVGMyn=ev~lR>h<3R!BlcyDW!t)NN+{GldtUy62p@!a6EBiYv`G^v#V zM{}G5K>9IBI|Ip2P#hoJ5~7~^;d(jZfF?ERh$;5~w6-=dZXh0{u8#2KP|ysGk=FsH zwO47%E*44BN_cx&zaJa`R)T+@3^ba&@M$3|V;6x*JJ}Pl8<3|B*3youoEH&<9MF&~ zE#9cx8kr=pXRoyL&T0%Q7Ig1s%^yM2gnPNorGzbn(PvNaO~e)udS>%_k?jY-C^N^s zi~M`9PK$dSlL8xaw)&`oyGvkK>#yb)C!M{wY=ga;joP zHFaV1*l62L4mH(IYjI?uP{X#$@@|x#p&fRNcvQ&$WJbjF)R9|@UEgM30%w%YcFM}uZ|UG8Li}_) zN}hD-W)9t6n=trSYw0s`!y~Q5d#J56yma|@53>R68U`bX_fk|1h&n9#(_N46l#1^I zI~Scd2NHIm-#j)g+__<;&rU@TQbL;p$NS8+!WL%mvvAK$l%`Sv=?I#i@|lK*E|DRQ zb7muMDCS?+1SWc3QI|nkrxy_?Wk&2yd1=omL-4rUGhKT7+TFyzX+MnrT4p<0^Y?v<)-y~QD{+=)iDUK2 zjL&#-6$BWNh$^vWmEs3zhvlS2j{BqOhbnh^uenye8uF&H^%usB)8clBn2EYj8u`B(3_tR|bw^)69(rTI8X z);5sQ|F4eahB*~H_Lf%+7YuO|u%moS4C@S?&MYZV{3+L5TwyTk3+t?La1LW*U$g(Q zHw8_5A`Z#t*t!G5;*bkuc$ZQP0YV`?V}N(RLgMon#;*g12e&yDb~%7vj`D09;)#Sd z^4RDXoAKeF*bL7+2oAvl<_~7d%*MSdbcWT9W+WU$=WL&u^5h{zL<3;1OV4XLaTU9+ z3EBj#=*D8C71iC_lbMTD;bM@OF8Pu|-{sZn52cdE-{Xl^h^o+|HuYF$93-G+=!7rP z4IZN5vitwH8M0*)4JVKnGT8X!3@pZ|85j)a`~gt&Y^7xt0g@Xs_~enOKNRxQY8c~wvsHS&*`Wdadh8L)n=yO0>&=DUGTm_{4NjzfH zp+t;;67{SvowIjKY zA(LdhR|vz!*Gs*t!3n_fkw*Nb;aTosA+7oO0XYJj4sFM|Em`X~n@B}3#Jgzu86hzC zFCZZaO*i7+zlGVa9q6HUOI-1--?iX!EBj+9#n9q5F(%lQwd;fP#?61x9QJ_+l8_$E zL3(f#9HFv%13LW}qM^iuPTG7=xfBjVVTqOZ36q2||K5sMAYh$MINieZ9_}bEax4nW zax5Xe^6D%JO?Ux2#s_BX2pD&?uurWF>kAsDv+Ssh=?L*!a_ZVGb0r(qJ#Nv@PkL#c zX;aE{gh-XzW!M)hbQ@xLqzxcHrlY|`fAZBg&hOAQk$v&>s*lT8-63qTe)_hpM{3q& zt%}+mJ*Upn@a2!YLRB;!mxy_}?odcNj+<$Bn9N=HX+`X`{^C?^$7%7(QD8Q*?&=gP z4nxq7p8-^`4fT@#UrqJC>yQE@NY%iKaG39v<8qgzAt)Mx?Op4%%LdSJvt=S1)yo{z_-+(~9q)b_a#h&Wq-fAb)b#CDiFK^ynCO0!Jcn_MhV zVOs%&QizQq#-cOwjjVOWhL2sVdmXCEt53KSwoV<`%n7E+C zSzDIDuBRNeew=3zkB(hK5guPg=n&XQ6dx71RQ37roDc1}+=It1-~mgD%J@@E7}=K) z0@#JJk%&$++FY7;=%lx+mf3)6%?n}9`)2Y$hL2>V5q3jMjka%xxhwS?>`XVb-VNwf z**3h3!2&qIqh-qq(hg>4COzcjijEFe1WoDsxt2KQ{!w|VcT5$%xgYeJcn(s>jVt; zRl8>7!i0E`G{C>99rTqJ{h;Bi;xBmEvtsDub893w&x4Bl89m6vfH}f9r!jYLtT+#% zKu$IO*EQw6GhG7rUFa4eUkRF>%tcNe6CFcJ zztx`F12Zi!e@d*SjI3zXG#)?vt=->S z-BIKwO;5dMB)9m(2z@?rTG~x<*d&yItllk$P7;KXJt40pk2udMF+9CMBK!bZbu%hj z%4382DjbxTa;p59m1%q;2LS*E!;P+ z_dfaCT7@feKNLI2Ps_^*xNVUM{yfY=D=?}<>L@3~&+3B+H?bg@qP|@VcdY%IIpbNf$M!rneu&_~2e7^cHknsBUG3M1Ag*cW8dH z$G~^C5)(}2$g$F1HsY+RM});fh;PKVIoTkOzi`K9X#|9G={BPn;qV*s+yM&kE5iY z6KdFz%L#K(axzQG-+6O5n#i!T2QT8kZscFfbJ9`T+NS@Tl~6Kw-rhiD4MFrh$)0krk{JMDJt}wPKKk7rgo{ zLB?4b z+sOpo^fS_bJW{oa3A#14MLEe!#Nab}p}fp)(^NEjjjoq>Jl>V#EbW%w&NJFq9~e79 z$DQg94vZw={^PteB3CD<-V#KKvjUBoQHu+g)^&N;^G8^w#Hq??O5W6JQsbA6J7U5U zHqjCRWRmu>ijGpup0rPvEFZ4R&DDAG`^XV}kk%-bjxte+1m@y^pttlR#4kk#&K|-$ z&oX}t)$I1>-z1z(eK~2vw_$#UKUYu0I& zPI!Nn3^7=oJXCrtjc#76Xa~~^{%gKS8rf2PTkcHO$fM}lF^cRR%_*m1g-H-C`Fs;(;93z99A~dHS`#fO~Z;SMc+*F*Bl>EX~rh@|B z0*~+(`$M{pSZy^0;x}Mx$-Ym07NKSme3)9S3zQ&PTWPKouoVFx>$rMw0 z0)kffxPOrm@u%dasdjN$Z?rcowXF{IT?p|9F2amY8j)Ys7G5l5h*#h$jF{_3PgXiA zZEQmAY`j52-JTpW`N}n#oEIR*snDzjk=eH|m9__IM|PYMtz10rrcra|ieJSeJ3fyu zGSPaLNr9aV-JX7>YF4u*z$>R4Up0fJC`YaNp--`uWztl`Z{kTmL~fl`Y7*+P-xvGK z=p{Lp7v`E8B%22beRA+vk`}mxrP4kKQ-eN@aF0Li6f!t{PzJ?oZ;%@2%Gdk+Lk8wV z&bGwx!UQ#ek7}A^H}*%f`R!*1-Htm+^9FwvO%iv;-wD0ybNl6lN>R+aJRQ|zEuqyR zaVr(<$)Owsd7~7Str6DkLSGn2XUbwvOVDrF8&D6Vc|HyVg5uESp9ICvl)OudPXMG4 zB_XJf{KY>BiIw;G85iIDChMq=z##R0Zo1ZD7gnrP2$+ESUm@a+h0VP|=VnePBH$4+ z_O|e@6Cc{~*oJC~T~JasFw}Q_vkG|wc{iW0MPOax=9$xn+3Cs(lfPcg7%{w(UQP(L z?S(RFxAG})M8p4;S{}goG1Sx!0nks$;G(KIR_KQXx?pOgeaJT3={8^d#_a?$Y|_o- z=oB#476D#S1lsNQq4UE9BZ&Os3eP%=2Srj=cXxkUY%o|nls~8d)5rIf6U*2?Gwd5a zR1uGHQSgQ>-bl{!T#lG$b@#&T1d`+&HI|HE?_e9*%!rv8e3sJ&eX$LRxdYg$9oZ8A z%9&^uq(%Jk=_r!Vg)kFX{EDWFvOC?3-JQAn{J?dIqrf+uMWhFRX!{ek3?mtNh}J6T z+lP$>kjbk|@CCpH(K_g#0cn$ha2trM+FTYtxx50q)N62i%&U<4j_Vx;$SRgh*Cecjp`{vK@cZeWT1cG8dV>gyom261M7N zm?G$+W?R?!&9ky^dbF$iAv$^liO$YIQlO9Ye5}gdovIh|xsn?3V}7)B+P|?Ev($|_ zIP^APnS)vGE?~%M1L(|N8tz=mI*blnC71k~pu?p`vxke_fRN)@{M`d_>iLrLKtB za`{^wFwkh7WJ%)&j8;!bgmWYmYMqmD!ArAg%fa7u+bW`F=BrB=EVcZ)-W*&25!e6> zbO*|}N$OpADdA3e>RU2f5i)$zX-U^ENXS=q zqZ_=V9gGukw{JC=sCozSzdztlvuMG(R*T?i91Xg|U)TTQQ9&ER=o_rxm@DTdPfDvM z3)!)x5Zs zszkvpIxjc0zDpavFCIA7wP#sOP|HuNjVPare`+mCNR0_b3AUal0fwp+N# zn~r*s70=1{j*wROu##(oMA#et<3K&ARTcX8ifS_bWQ=0t^O^pM!kq5U4Hngu_s>kx z9+q^4BgluDtbACpY|Ri9FyO%tDH3u(!X9-Q0;VV^T~{DISCTwY8E5NU^S4cd!x20&0UM#jBWx2= tt^KF}Q?R=7`v2wECjJdE>RaZOwmF#c5a-zjzoxOu++;sK+sO6u{{X~YnD77q literal 0 HcmV?d00001 diff --git a/README.md b/README.md index d7cdf21..043cd7c 100644 --- a/README.md +++ b/README.md @@ -2,7 +2,52 @@ Unityで ADVを作成する際に Fungusを使ってより簡単に作成できるようにするためのライブラリです。 -# requirements -* Unity 2022.2.5f1 +# 使い方 +## シナリオ環境 +1. [GoogleSheet](https://docs.google.com/spreadsheets/d/1k2AGDMgL6sLlIwmGZ5oQH2knIRoIAUhfyIYyVp93Nh0/edit?usp=share_link)をコピーする +2. 以下のように3つのフォルダを作成する + - `sounds` + - `characterImage` + - `backgroundImage` +![img.png](Docs/copy_files.png) + +3. フォルダのIDを取得して、GoogleSheetのApps Scriptの`AutoUpdatePulldown.gs` の変数を作成したフォルダIDに変更する + +```js +const characterImageFolder = "1JbdOEpA5ES2Rq9OqeNr2X98HyHu8ZTTg" +const backgroundImageFolder = "1TeW1IFjPKufBB9b-a9-BTDtJU9PSXIMe" +const soundFolder = "1pXyls5L5T_uWcw4lJyOtoCtXtm-8GynC" +``` + +![](Docs/apps_script.png) + +4. Apps Scriptをデプロイして、ウェブアプリURLを取得する + +## Unity環境 +1. [EasyADV.unitypackage](https://github.com/MidraLab/easy-adv/releases)をダウンロードする +2. [Fungus.unitypackage](https://github.com/MidraLab/fungus/releases)をダウンロードする +3. Unityプロジェクトに1,2をimportする +4. 以下のフォルダを任意の場所に作成する + - `キャラクター画像フォルダ` + - `背景画像フォルダ` + - `BGMフォルダ` + - `キャラボイスフォルダ` +5. シーン上の任意のオブジェクトに`UpdateScenarioFromGoogleSheet`をアタッチする。このときに4で作成したフォルダパスを設定する + +![img.png](Docs/inspector.png) + +6. `ScenarioSheetData.cs`の以下の変数を設定する + +```cs +public static class ScenarioSheetData +{ + public const string SheetURL = + "SheetURL"; + + public const string MainSheet = "シート名"; +} +``` + +7. Google Sheetにシナリオを記載後、`UpdateScenarioFromGoogleSheet`の`Update`ボタンを押す \ No newline at end of file From a370c255223c9b231961998b31c48761a2f2b5d6 Mon Sep 17 00:00:00 2001 From: yousan Date: Sun, 6 Aug 2023 02:31:00 +0900 Subject: [PATCH 03/13] update Unity ver --- Packages/manifest.json | 16 ++++++------ Packages/packages-lock.json | 41 ++++++++++++++++++++---------- ProjectSettings/ProjectVersion.txt | 4 +-- 3 files changed, 37 insertions(+), 24 deletions(-) diff --git a/Packages/manifest.json b/Packages/manifest.json index 12e6848..fe85551 100644 --- a/Packages/manifest.json +++ b/Packages/manifest.json @@ -4,20 +4,20 @@ "com.dbrizov.naughtyattributes": "2.1.4", "com.needle.compilation-visualizer": "1.8.3", "com.neuecc.unirx": "7.1.0", - "com.unity.collab-proxy": "2.0.0", - "com.unity.feature.2d": "1.0.0", - "com.unity.ide.rider": "3.0.18", - "com.unity.ide.visualstudio": "2.0.17", - "com.unity.inputsystem": "1.4.4", - "com.unity.recorder": "4.0.0", + "com.unity.collab-proxy": "2.0.5", + "com.unity.feature.2d": "2.0.0", + "com.unity.ide.rider": "3.0.24", + "com.unity.ide.visualstudio": "2.0.18", + "com.unity.inputsystem": "1.6.1", + "com.unity.recorder": "4.0.1", "com.unity.test-framework": "1.1.33", "com.unity.textmeshpro": "3.0.6", - "com.unity.timeline": "1.7.2", + "com.unity.timeline": "1.7.4", "com.unity.ugui": "1.0.0", "com.unity.visualscripting": "1.8.0", "jp.amagamina.overwriter": "https://github.com/ina-amagami/unity-overwriter.git", - "jp.ayutaz.simplefoldericon": "1.3.3", "jp.ayutaz.koeiromap-unity": "https://github.com/ayutaz/koeiromap-unity.git?path=Assets/KoeiromapUnity/Scripts", + "jp.ayutaz.simplefoldericon": "1.3.3", "com.unity.modules.ai": "1.0.0", "com.unity.modules.androidjni": "1.0.0", "com.unity.modules.animation": "1.0.0", diff --git a/Packages/packages-lock.json b/Packages/packages-lock.json index 2f6203b..055afd4 100644 --- a/Packages/packages-lock.json +++ b/Packages/packages-lock.json @@ -29,7 +29,7 @@ "url": "https://package.openupm.com" }, "com.unity.2d.animation": { - "version": "9.0.1", + "version": "9.0.3", "depth": 1, "source": "registry", "dependencies": { @@ -41,6 +41,18 @@ }, "url": "https://packages.unity.com" }, + "com.unity.2d.aseprite": { + "version": "1.0.0", + "depth": 1, + "source": "registry", + "dependencies": { + "com.unity.2d.sprite": "1.0.0", + "com.unity.2d.common": "6.0.6", + "com.unity.mathematics": "1.2.6", + "com.unity.modules.animation": "1.0.0" + }, + "url": "https://packages.unity.com" + }, "com.unity.2d.common": { "version": "8.0.1", "depth": 2, @@ -79,7 +91,7 @@ "dependencies": {} }, "com.unity.2d.spriteshape": { - "version": "9.0.1", + "version": "9.0.2", "depth": 1, "source": "registry", "dependencies": { @@ -99,7 +111,7 @@ } }, "com.unity.2d.tilemap.extras": { - "version": "3.0.3", + "version": "3.1.0", "depth": 1, "source": "registry", "dependencies": { @@ -111,7 +123,7 @@ "url": "https://packages.unity.com" }, "com.unity.burst": { - "version": "1.8.2", + "version": "1.8.7", "depth": 3, "source": "registry", "dependencies": { @@ -120,7 +132,7 @@ "url": "https://packages.unity.com" }, "com.unity.collab-proxy": { - "version": "2.0.0", + "version": "2.0.5", "depth": 0, "source": "registry", "dependencies": {}, @@ -144,21 +156,22 @@ "url": "https://packages.unity.com" }, "com.unity.feature.2d": { - "version": "1.0.0", + "version": "2.0.0", "depth": 0, "source": "builtin", "dependencies": { - "com.unity.2d.animation": "9.0.1", + "com.unity.2d.animation": "9.0.3", "com.unity.2d.pixel-perfect": "5.0.3", "com.unity.2d.psdimporter": "8.0.2", "com.unity.2d.sprite": "1.0.0", - "com.unity.2d.spriteshape": "9.0.1", + "com.unity.2d.spriteshape": "9.0.2", "com.unity.2d.tilemap": "1.0.0", - "com.unity.2d.tilemap.extras": "3.0.3" + "com.unity.2d.tilemap.extras": "3.1.0", + "com.unity.2d.aseprite": "1.0.0" } }, "com.unity.ide.rider": { - "version": "3.0.18", + "version": "3.0.24", "depth": 0, "source": "registry", "dependencies": { @@ -167,7 +180,7 @@ "url": "https://packages.unity.com" }, "com.unity.ide.visualstudio": { - "version": "2.0.17", + "version": "2.0.18", "depth": 0, "source": "registry", "dependencies": { @@ -176,7 +189,7 @@ "url": "https://packages.unity.com" }, "com.unity.inputsystem": { - "version": "1.4.4", + "version": "1.6.1", "depth": 0, "source": "registry", "dependencies": { @@ -199,7 +212,7 @@ "url": "https://packages.unity.com" }, "com.unity.recorder": { - "version": "4.0.0", + "version": "4.0.1", "depth": 0, "source": "registry", "dependencies": { @@ -228,7 +241,7 @@ "url": "https://packages.unity.com" }, "com.unity.timeline": { - "version": "1.7.2", + "version": "1.7.4", "depth": 0, "source": "registry", "dependencies": { diff --git a/ProjectSettings/ProjectVersion.txt b/ProjectSettings/ProjectVersion.txt index b2f0d29..e7e2f19 100644 --- a/ProjectSettings/ProjectVersion.txt +++ b/ProjectSettings/ProjectVersion.txt @@ -1,2 +1,2 @@ -m_EditorVersion: 2022.2.5f1 -m_EditorVersionWithRevision: 2022.2.5f1 (551d45108343) +m_EditorVersion: 2022.3.4f1 +m_EditorVersionWithRevision: 2022.3.4f1 (35713cd46cd7) From 4fc96dd704f8c88a9598c4c24fa9f399662b69a1 Mon Sep 17 00:00:00 2001 From: yousan Date: Sun, 6 Aug 2023 02:33:41 +0900 Subject: [PATCH 04/13] =?UTF-8?q?feat:=20=E3=82=B5=E3=82=A6=E3=83=B3?= =?UTF-8?q?=E3=83=89=E3=83=BB=E7=94=BB=E5=83=8F=E3=82=92=E5=85=A5=E3=82=8C?= =?UTF-8?q?=E3=82=8B=E3=81=9F=E3=82=81=E3=81=AE=E3=83=95=E3=82=A9=E3=83=AB?= =?UTF-8?q?=E3=83=80=E3=82=92=E4=BA=8B=E5=89=8D=E3=81=AB=E4=BD=9C=E6=88=90?= =?UTF-8?q?=E3=81=8A=E3=82=88=E3=81=B3=E3=83=91=E3=82=B9=E3=81=AE=E6=8C=87?= =?UTF-8?q?=E5=AE=9A=E3=82=92=E5=86=85=E9=83=A8=E3=81=A7=E4=BF=9D=E6=8C=81?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- Assets/EasyADV/BackgroundImage.meta | 3 ++ Assets/EasyADV/BackgroundImage/.gitkeep | 0 Assets/EasyADV/CharacterImage.meta | 3 ++ Assets/EasyADV/CharacterImage/.gitkeep | 0 Assets/EasyADV/Scripts/Editor/EditScenario.cs | 28 +++++++++++++++++-- Assets/EasyADV/Scripts/Editor/UpdateVoice.cs | 3 ++ .../Scripts/UpdateScenarioFromGoogleSheet.cs | 9 ++---- Assets/EasyADV/Sound.meta | 3 ++ Assets/EasyADV/Sound/.gitkeep | 0 9 files changed, 40 insertions(+), 9 deletions(-) create mode 100644 Assets/EasyADV/BackgroundImage.meta create mode 100644 Assets/EasyADV/BackgroundImage/.gitkeep create mode 100644 Assets/EasyADV/CharacterImage.meta create mode 100644 Assets/EasyADV/CharacterImage/.gitkeep create mode 100644 Assets/EasyADV/Sound.meta create mode 100644 Assets/EasyADV/Sound/.gitkeep diff --git a/Assets/EasyADV/BackgroundImage.meta b/Assets/EasyADV/BackgroundImage.meta new file mode 100644 index 0000000..69d3878 --- /dev/null +++ b/Assets/EasyADV/BackgroundImage.meta @@ -0,0 +1,3 @@ +fileFormatVersion: 2 +guid: 576c8f3745a2481e8d4ab1867c620326 +timeCreated: 1691256712 \ No newline at end of file diff --git a/Assets/EasyADV/BackgroundImage/.gitkeep b/Assets/EasyADV/BackgroundImage/.gitkeep new file mode 100644 index 0000000..e69de29 diff --git a/Assets/EasyADV/CharacterImage.meta b/Assets/EasyADV/CharacterImage.meta new file mode 100644 index 0000000..cb4ec79 --- /dev/null +++ b/Assets/EasyADV/CharacterImage.meta @@ -0,0 +1,3 @@ +fileFormatVersion: 2 +guid: a9d7841a61dc469ca6b8a9a9ac69019c +timeCreated: 1691256536 \ No newline at end of file diff --git a/Assets/EasyADV/CharacterImage/.gitkeep b/Assets/EasyADV/CharacterImage/.gitkeep new file mode 100644 index 0000000..e69de29 diff --git a/Assets/EasyADV/Scripts/Editor/EditScenario.cs b/Assets/EasyADV/Scripts/Editor/EditScenario.cs index 725f79c..38fb8da 100644 --- a/Assets/EasyADV/Scripts/Editor/EditScenario.cs +++ b/Assets/EasyADV/Scripts/Editor/EditScenario.cs @@ -49,9 +49,9 @@ public override async void OnInspectorGUI() serializedObject.Update(); // serializedObjectからSampleComponentのプロパティを取得 - _characterImageFolderPath = serializedObject.FindProperty("characterImageFolderPath").stringValue; - _backgroundImageFolderPath = serializedObject.FindProperty("backgroundImageFolderPath").stringValue; - _bgmFolderPath = serializedObject.FindProperty("bgmFolderPath").stringValue; + _characterImageFolderPath = Application.dataPath + "/EasyADV/CharacterImage"; + _backgroundImageFolderPath = Application.dataPath + "/EasyADV/BackgroundImage"; + _bgmFolderPath = Application.dataPath + "/EasyADV/Sound"; _isUpdateVoiceProperty = serializedObject.FindProperty("isUpdateVoice").boolValue; _voiceStartIndex = serializedObject.FindProperty("voiceStartIndex").intValue; _voiceFolderPath = serializedObject.FindProperty("voiceFolderPath").stringValue; @@ -69,12 +69,19 @@ public override async void OnInspectorGUI() } } + /// + /// コンポーネントをキャッシュする + /// private static void CacheComponents() { _flowchart = FindObjectOfType(); _blocks = _flowchart.GetComponents().ToList(); } + /// + /// キャラクターの情報を更新する + /// + /// private void UpdateCharacterInfo(ScenarioDataList scenarioDataList) { var characters = FindObjectsOfType().ToList(); @@ -95,6 +102,11 @@ private void UpdateCharacterInfo(ScenarioDataList scenarioDataList) } } + /// + /// シナリオデータをダウンロードする + /// + /// + /// private static async UniTask DownloadScenarioData(string sheetName) { return await GetScenarioFromSheet.GetGameInfo(ScenarioSheetData.SheetURL, sheetName); @@ -121,6 +133,13 @@ private async UniTask UpdateConversationBlock(ScenarioDataList scenarioDataList, } } + /// + /// Flowchartにブロック(コマンド)を追加する + /// + /// + /// + /// + /// private async UniTask AddBlock(ScenarioData scenarioData, Block block, int blockIndex) { if (string.IsNullOrEmpty(scenarioData.command)) return; @@ -209,6 +228,9 @@ await UniTask.Delay(TimeSpan.FromSeconds(1f), } } + /// + /// Flowchartのブロックを削除する + /// private static void DeleteAllCommand() { foreach (var (deleteBlock, _) in _blocks.Select((info, index) => (info, index))) diff --git a/Assets/EasyADV/Scripts/Editor/UpdateVoice.cs b/Assets/EasyADV/Scripts/Editor/UpdateVoice.cs index 7b79ad7..21b1af1 100644 --- a/Assets/EasyADV/Scripts/Editor/UpdateVoice.cs +++ b/Assets/EasyADV/Scripts/Editor/UpdateVoice.cs @@ -11,6 +11,9 @@ namespace EasyADV.Editor { + /// + /// シナリオを更新するためのクラス + /// public partial class EditScenario { private static void DeleteVoice(bool isUpdateVoice) diff --git a/Assets/EasyADV/Scripts/UpdateScenarioFromGoogleSheet.cs b/Assets/EasyADV/Scripts/UpdateScenarioFromGoogleSheet.cs index 3b855bb..17a5439 100644 --- a/Assets/EasyADV/Scripts/UpdateScenarioFromGoogleSheet.cs +++ b/Assets/EasyADV/Scripts/UpdateScenarioFromGoogleSheet.cs @@ -2,13 +2,10 @@ namespace EasyADV.Scripts { + /// + /// Googleスプレッドシートからシナリオを更新するためのクラス + /// public class UpdateScenarioFromGoogleSheet : MonoBehaviour { - [SerializeField] private string characterImageFolderPath; - [SerializeField] private string backgroundImageFolderPath; - [SerializeField] private string bgmFolderPath; - [SerializeField] private bool isUpdateVoice; - [SerializeField] private int voiceStartIndex; - [SerializeField] private string voiceFolderPath; } } \ No newline at end of file diff --git a/Assets/EasyADV/Sound.meta b/Assets/EasyADV/Sound.meta new file mode 100644 index 0000000..81473fa --- /dev/null +++ b/Assets/EasyADV/Sound.meta @@ -0,0 +1,3 @@ +fileFormatVersion: 2 +guid: 3fbd1d9504a54775bebfb54d0ca20379 +timeCreated: 1691256730 \ No newline at end of file diff --git a/Assets/EasyADV/Sound/.gitkeep b/Assets/EasyADV/Sound/.gitkeep new file mode 100644 index 0000000..e69de29 From 2a789c7f70881cc25f3c792c763f6396bc67ab8a Mon Sep 17 00:00:00 2001 From: yousan Date: Sun, 6 Aug 2023 02:35:45 +0900 Subject: [PATCH 05/13] docs: update README.md --- README.md | 9 ++++----- 1 file changed, 4 insertions(+), 5 deletions(-) diff --git a/README.md b/README.md index 043cd7c..7e333bf 100644 --- a/README.md +++ b/README.md @@ -29,11 +29,10 @@ const soundFolder = "1pXyls5L5T_uWcw4lJyOtoCtXtm-8GynC" 1. [EasyADV.unitypackage](https://github.com/MidraLab/easy-adv/releases)をダウンロードする 2. [Fungus.unitypackage](https://github.com/MidraLab/fungus/releases)をダウンロードする 3. Unityプロジェクトに1,2をimportする -4. 以下のフォルダを任意の場所に作成する - - `キャラクター画像フォルダ` - - `背景画像フォルダ` - - `BGMフォルダ` - - `キャラボイスフォルダ` +4. 以下のフォルダに画像、音声を配置する + - `Asset/EasyADV/CharacterImage` + - `Asset/EasyADV/BackgroundImage` + - `Asset/EasyADV/Sound` 5. シーン上の任意のオブジェクトに`UpdateScenarioFromGoogleSheet`をアタッチする。このときに4で作成したフォルダパスを設定する ![img.png](Docs/inspector.png) From 9f739cd65790fabb42ee196839511a8c3f370fb4 Mon Sep 17 00:00:00 2001 From: yousan Date: Sun, 6 Aug 2023 12:38:14 +0900 Subject: [PATCH 06/13] =?UTF-8?q?feat:=20Menu=E3=81=8B=E3=82=89Fungus=20+?= =?UTF-8?q?=20EasyADV=E3=81=AE=E3=82=BB=E3=83=83=E3=83=88=E3=82=A2?= =?UTF-8?q?=E3=83=83=E3=83=97=E3=81=8C=E3=81=A7=E3=81=8D=E3=82=8B=E3=83=A1?= =?UTF-8?q?=E3=83=8B=E3=83=A5=E9=A0=85=E7=9B=AE=E3=81=AE=E8=BF=BD=E5=8A=A0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- Assets/EasyADV/Prefabs.meta | 8 ++ Assets/EasyADV/Prefabs/Background.prefab | 92 +++++++++++++++++++ Assets/EasyADV/Prefabs/Background.prefab.meta | 7 ++ Assets/EasyADV/Scripts/Editor/EasyADVMenu.cs | 43 +++++++++ .../Scripts/Editor/EasyADVMenu.cs.meta | 3 + Assets/EasyADV/Scripts/Editor/EditScenario.cs | 3 - 6 files changed, 153 insertions(+), 3 deletions(-) create mode 100644 Assets/EasyADV/Prefabs.meta create mode 100644 Assets/EasyADV/Prefabs/Background.prefab create mode 100644 Assets/EasyADV/Prefabs/Background.prefab.meta create mode 100644 Assets/EasyADV/Scripts/Editor/EasyADVMenu.cs create mode 100644 Assets/EasyADV/Scripts/Editor/EasyADVMenu.cs.meta diff --git a/Assets/EasyADV/Prefabs.meta b/Assets/EasyADV/Prefabs.meta new file mode 100644 index 0000000..7e7692e --- /dev/null +++ b/Assets/EasyADV/Prefabs.meta @@ -0,0 +1,8 @@ +fileFormatVersion: 2 +guid: 13d5864d1384f28448f6c7bd1f55623b +folderAsset: yes +DefaultImporter: + externalObjects: {} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/EasyADV/Prefabs/Background.prefab b/Assets/EasyADV/Prefabs/Background.prefab new file mode 100644 index 0000000..f3ce1c5 --- /dev/null +++ b/Assets/EasyADV/Prefabs/Background.prefab @@ -0,0 +1,92 @@ +%YAML 1.1 +%TAG !u! tag:unity3d.com,2011: +--- !u!1 &7114562640169053628 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 997822693772618305} + - component: {fileID: 2866147896293219298} + - component: {fileID: 45360905756024039} + - component: {fileID: 1689601321579300571} + m_Layer: 5 + m_Name: Background + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!224 &997822693772618305 +RectTransform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 7114562640169053628} + m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} + m_LocalPosition: {x: 0, y: 0, z: 0} + m_LocalScale: {x: 1, y: 1, z: 1} + m_ConstrainProportionsScale: 1 + m_Children: [] + m_Father: {fileID: 0} + m_RootOrder: -1 + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} + m_AnchorMin: {x: 0, y: 0} + m_AnchorMax: {x: 1, y: 1} + m_AnchoredPosition: {x: 0, y: 0} + m_SizeDelta: {x: 0, y: 0} + m_Pivot: {x: 0.5, y: 0.5} +--- !u!222 &2866147896293219298 +CanvasRenderer: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 7114562640169053628} + m_CullTransparentMesh: 1 +--- !u!114 &45360905756024039 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 7114562640169053628} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: fe87c0e1cc204ed48ad3b37840f39efc, type: 3} + m_Name: + m_EditorClassIdentifier: + m_Material: {fileID: 0} + m_Color: {r: 1, g: 1, b: 1, a: 1} + m_RaycastTarget: 1 + m_RaycastPadding: {x: 0, y: 0, z: 0, w: 0} + m_Maskable: 1 + m_OnCullStateChanged: + m_PersistentCalls: + m_Calls: [] + m_Sprite: {fileID: 0} + m_Type: 0 + m_PreserveAspect: 0 + m_FillCenter: 1 + m_FillMethod: 4 + m_FillAmount: 1 + m_FillClockwise: 1 + m_FillOrigin: 0 + m_UseSpriteMesh: 0 + m_PixelsPerUnitMultiplier: 1 +--- !u!114 &1689601321579300571 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 7114562640169053628} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: a1f4d01e48c9499f80ebc24e695fa593, type: 3} + m_Name: + m_EditorClassIdentifier: + backgroundSprites: [] diff --git a/Assets/EasyADV/Prefabs/Background.prefab.meta b/Assets/EasyADV/Prefabs/Background.prefab.meta new file mode 100644 index 0000000..5968501 --- /dev/null +++ b/Assets/EasyADV/Prefabs/Background.prefab.meta @@ -0,0 +1,7 @@ +fileFormatVersion: 2 +guid: 753e25e07c0e24d4f95d3448c7d12f56 +PrefabImporter: + externalObjects: {} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/EasyADV/Scripts/Editor/EasyADVMenu.cs b/Assets/EasyADV/Scripts/Editor/EasyADVMenu.cs new file mode 100644 index 0000000..168231a --- /dev/null +++ b/Assets/EasyADV/Scripts/Editor/EasyADVMenu.cs @@ -0,0 +1,43 @@ +using EasyADV.FungusExtension; +using EasyADV.Scripts; +using Fungus; +using UnityEditor; +using UnityEngine; + +namespace EasyADV.Editor +{ + /// + /// EasyADVのメニューを追加するクラス + /// + public class EasyADVMenu + { + [MenuItem("Tools/EasyADV/Setup")] + private static void Setup() + { + Fungus.EditorUtils.FlowchartMenuItems.CreateFlowchart(); + Fungus.EditorUtils.NarrativeMenuItems.CreateSayDialog(); + Fungus.EditorUtils.NarrativeMenuItems.CreateStage(); + + // FlowchartにUpdateScenarioFromGoogleSheetコンポーネントが追加されていなければ追加 + var flowchart = Object.FindObjectOfType(); + if (flowchart == null || flowchart.GetComponent() != null) + { + return; + } + + flowchart.gameObject.AddComponent(); + + // ステージ内に背景画 切り替え用のオブジェクトとコンポーネントの追加 + var stageCanvas = Object.FindObjectOfType().GetComponentInChildren(); + if (stageCanvas.GetComponentInChildren() != null) + { + return; + } + + var backgroundPrefab = + AssetDatabase.LoadAssetAtPath("Assets/EasyADV/Prefabs/Background.prefab"); + var backgroundObject = Object.Instantiate(backgroundPrefab,stageCanvas.transform); + backgroundObject.name = "Background"; + } + } +} \ No newline at end of file diff --git a/Assets/EasyADV/Scripts/Editor/EasyADVMenu.cs.meta b/Assets/EasyADV/Scripts/Editor/EasyADVMenu.cs.meta new file mode 100644 index 0000000..c564f6c --- /dev/null +++ b/Assets/EasyADV/Scripts/Editor/EasyADVMenu.cs.meta @@ -0,0 +1,3 @@ +fileFormatVersion: 2 +guid: 76db53e435b64772977b29f5f09e5eb0 +timeCreated: 1691291362 \ No newline at end of file diff --git a/Assets/EasyADV/Scripts/Editor/EditScenario.cs b/Assets/EasyADV/Scripts/Editor/EditScenario.cs index 38fb8da..fe2d086 100644 --- a/Assets/EasyADV/Scripts/Editor/EditScenario.cs +++ b/Assets/EasyADV/Scripts/Editor/EditScenario.cs @@ -52,9 +52,6 @@ public override async void OnInspectorGUI() _characterImageFolderPath = Application.dataPath + "/EasyADV/CharacterImage"; _backgroundImageFolderPath = Application.dataPath + "/EasyADV/BackgroundImage"; _bgmFolderPath = Application.dataPath + "/EasyADV/Sound"; - _isUpdateVoiceProperty = serializedObject.FindProperty("isUpdateVoice").boolValue; - _voiceStartIndex = serializedObject.FindProperty("voiceStartIndex").intValue; - _voiceFolderPath = serializedObject.FindProperty("voiceFolderPath").stringValue; if (GUILayout.Button(new GUIContent("Update Scenario"))) { From 3f1cf78907223f231dc845b9dec99c22be567a0a Mon Sep 17 00:00:00 2001 From: yousan Date: Sun, 6 Aug 2023 12:51:20 +0900 Subject: [PATCH 07/13] fix: package.json path --- Assets/EasyADV/{Scripts => }/package.json | 4 ++-- Assets/EasyADV/{Scripts => }/package.json.meta | 0 2 files changed, 2 insertions(+), 2 deletions(-) rename Assets/EasyADV/{Scripts => }/package.json (85%) rename Assets/EasyADV/{Scripts => }/package.json.meta (100%) diff --git a/Assets/EasyADV/Scripts/package.json b/Assets/EasyADV/package.json similarity index 85% rename from Assets/EasyADV/Scripts/package.json rename to Assets/EasyADV/package.json index a50ce8c..8da0a73 100644 --- a/Assets/EasyADV/Scripts/package.json +++ b/Assets/EasyADV/package.json @@ -1,8 +1,8 @@ { "name": "com.midralab.easy-adv", "displayName": "Easy ADV", - "version": "0.0.1", - "unity": "2022.2", + "version": "0.0.3", + "unity": "2022.3", "description": "Library for easier ADV production using Fungus and Google Sheet", "keywords": [ diff --git a/Assets/EasyADV/Scripts/package.json.meta b/Assets/EasyADV/package.json.meta similarity index 100% rename from Assets/EasyADV/Scripts/package.json.meta rename to Assets/EasyADV/package.json.meta From 0c11f3a7d03fef36a65a926ef106ce8ac2dba28d Mon Sep 17 00:00:00 2001 From: yousan Date: Sun, 6 Aug 2023 12:51:50 +0900 Subject: [PATCH 08/13] =?UTF-8?q?fix:=20package=20exporter=E3=81=AE?= =?UTF-8?q?=E3=83=A1=E3=83=8B=E3=83=A5=E9=9A=8E=E5=B1=A4=E3=81=AE=E5=A4=89?= =?UTF-8?q?=E6=9B=B4=E3=81=A8=E3=82=B3=E3=83=A1=E3=83=B3=E3=83=88=E3=81=AE?= =?UTF-8?q?=E8=BF=BD=E5=8A=A0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- Assets/Editor/PackageExporter.cs | 15 ++++++++++++++- 1 file changed, 14 insertions(+), 1 deletion(-) diff --git a/Assets/Editor/PackageExporter.cs b/Assets/Editor/PackageExporter.cs index e56f97c..92ec546 100644 --- a/Assets/Editor/PackageExporter.cs +++ b/Assets/Editor/PackageExporter.cs @@ -3,6 +3,9 @@ using UnityEditor; using UnityEngine; +/// +/// パッケージの書き出しを行うクラス +/// public static class PackageExporter { private const string RootDirectory = "Assets/EasyADV"; @@ -12,7 +15,7 @@ public static class PackageExporter /// パッケージの書き出し(エディタ上でのテスト用) /// メニュー 「Tools > Export Unitypackage Test」をクリックで実行 /// - [MenuItem("Tools/Export Unitypackage Test")] + [MenuItem("Tools/EasyADV/Export Unitypackage")] public static void ExportTestOnEditor() { var exportPath = EditorUtility.SaveFilePanel @@ -35,6 +38,11 @@ public static void Export() CreatePackage(RootDirectory, $"build/{FileName}.unitypackage"); } + /// + /// パッケージの書き出し + /// + /// + /// private static void CreatePackage(string rootDirectory, string exportPath) { SafeCreateDirectory(exportPath); @@ -51,6 +59,11 @@ private static DirectoryInfo SafeCreateDirectory(string path) return Directory.CreateDirectory(diParent.FullName); } + /// + /// 指定したディレクトリ以下の全てのファイルのパスを取得する + /// + /// + /// private static string[] GetAllAssetsAtPath(string root) { return Directory.GetFiles(root, "*", SearchOption.AllDirectories) From 99eea76967813591f97fa77ebd4be000d2231fdd Mon Sep 17 00:00:00 2001 From: yousan Date: Sun, 6 Aug 2023 13:10:52 +0900 Subject: [PATCH 09/13] fix: add material folder meta --- Assets/EasyADV/BackgroundImage.meta | 9 +++++++-- Assets/EasyADV/CharacterImage.meta | 9 +++++++-- Assets/EasyADV/Sound.meta | 9 +++++++-- 3 files changed, 21 insertions(+), 6 deletions(-) diff --git a/Assets/EasyADV/BackgroundImage.meta b/Assets/EasyADV/BackgroundImage.meta index 69d3878..237bd3c 100644 --- a/Assets/EasyADV/BackgroundImage.meta +++ b/Assets/EasyADV/BackgroundImage.meta @@ -1,3 +1,8 @@ -fileFormatVersion: 2 +fileFormatVersion: 2 guid: 576c8f3745a2481e8d4ab1867c620326 -timeCreated: 1691256712 \ No newline at end of file +folderAsset: yes +DefaultImporter: + externalObjects: {} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/EasyADV/CharacterImage.meta b/Assets/EasyADV/CharacterImage.meta index cb4ec79..4d78160 100644 --- a/Assets/EasyADV/CharacterImage.meta +++ b/Assets/EasyADV/CharacterImage.meta @@ -1,3 +1,8 @@ -fileFormatVersion: 2 +fileFormatVersion: 2 guid: a9d7841a61dc469ca6b8a9a9ac69019c -timeCreated: 1691256536 \ No newline at end of file +folderAsset: yes +DefaultImporter: + externalObjects: {} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/EasyADV/Sound.meta b/Assets/EasyADV/Sound.meta index 81473fa..3f4b166 100644 --- a/Assets/EasyADV/Sound.meta +++ b/Assets/EasyADV/Sound.meta @@ -1,3 +1,8 @@ -fileFormatVersion: 2 +fileFormatVersion: 2 guid: 3fbd1d9504a54775bebfb54d0ca20379 -timeCreated: 1691256730 \ No newline at end of file +folderAsset: yes +DefaultImporter: + externalObjects: {} + userData: + assetBundleName: + assetBundleVariant: From 81ddd18cddf00b07c1000e07881bcd116543a6cb Mon Sep 17 00:00:00 2001 From: yousan Date: Sun, 6 Aug 2023 13:11:19 +0900 Subject: [PATCH 10/13] =?UTF-8?q?fix:=20setup=E6=99=82=E3=81=AB=E7=B4=A0?= =?UTF-8?q?=E6=9D=90=E3=83=95=E3=82=A9=E3=83=AB=E3=83=80=E3=81=AE=E4=BD=9C?= =?UTF-8?q?=E6=88=90?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- Assets/EasyADV/Scripts/Editor/EasyADVMenu.cs | 96 ++++++++++++++++++-- 1 file changed, 89 insertions(+), 7 deletions(-) diff --git a/Assets/EasyADV/Scripts/Editor/EasyADVMenu.cs b/Assets/EasyADV/Scripts/Editor/EasyADVMenu.cs index 168231a..8df1fbd 100644 --- a/Assets/EasyADV/Scripts/Editor/EasyADVMenu.cs +++ b/Assets/EasyADV/Scripts/Editor/EasyADVMenu.cs @@ -1,4 +1,5 @@ -using EasyADV.FungusExtension; +using System.IO; +using EasyADV.FungusExtension; using EasyADV.Scripts; using Fungus; using UnityEditor; @@ -11,22 +12,88 @@ namespace EasyADV.Editor /// public class EasyADVMenu { + /// + /// 背景画像のフォルダ名 + /// + private const string BackgroundImageFolderName = "BackgroundImage"; + + /// + /// キャラクター画像のフォルダ名 + /// + private const string CharacterImageFolderName = "CharacterImage"; + + /// + /// サウンドのフォルダ名 + /// + private const string SoundFolderName = "Sound"; + [MenuItem("Tools/EasyADV/Setup")] private static void Setup() { - Fungus.EditorUtils.FlowchartMenuItems.CreateFlowchart(); - Fungus.EditorUtils.NarrativeMenuItems.CreateSayDialog(); - Fungus.EditorUtils.NarrativeMenuItems.CreateStage(); + SetupHierarchyObject(); + SetupMaterialFolder(); + } + + /// + /// 素材フォルダを作成する + /// + private static void SetupMaterialFolder() + { + var folderRoot = Application.dataPath + "/EasyADV/"; + // 背景画像フォルダがなければ作成 + if (!Directory.Exists(folderRoot + BackgroundImageFolderName)) + { + Directory.CreateDirectory(folderRoot + BackgroundImageFolderName); + CreateGitKeep(Path.Combine(folderRoot, BackgroundImageFolderName)); + } + + // キャラクター画像フォルダがなければ作成 + if (!Directory.Exists(folderRoot + CharacterImageFolderName)) + { + Directory.CreateDirectory(folderRoot + CharacterImageFolderName); + CreateGitKeep(Path.Combine(folderRoot, CharacterImageFolderName)); + } + + // サウンドフォルダがなければ作成 + if (!Directory.Exists(folderRoot + SoundFolderName)) + { + Directory.CreateDirectory(folderRoot + SoundFolderName); + CreateGitKeep(Path.Combine(folderRoot, SoundFolderName)); + } + + AssetDatabase.Refresh(); + } + + /// + /// Fungus・EasyADVを使用するためのオブジェクトを作成する + /// + private static void SetupHierarchyObject() + { + if (Object.FindObjectOfType() == null) + { + Fungus.EditorUtils.FlowchartMenuItems.CreateFlowchart(); + } + + if(Object.FindObjectOfType() == null) + { + Fungus.EditorUtils.NarrativeMenuItems.CreateStage(); + } + + if (Object.FindObjectOfType() == null) + { + Fungus.EditorUtils.NarrativeMenuItems.CreateSayDialog(); + } + // FlowchartにUpdateScenarioFromGoogleSheetコンポーネントが追加されていなければ追加 var flowchart = Object.FindObjectOfType(); - if (flowchart == null || flowchart.GetComponent() != null) + if (flowchart == null || flowchart.GetComponent() != null) { return; } flowchart.gameObject.AddComponent(); - + // ステージ内に背景画 切り替え用のオブジェクトとコンポーネントの追加 var stageCanvas = Object.FindObjectOfType().GetComponentInChildren(); if (stageCanvas.GetComponentInChildren() != null) @@ -36,8 +103,23 @@ private static void Setup() var backgroundPrefab = AssetDatabase.LoadAssetAtPath("Assets/EasyADV/Prefabs/Background.prefab"); - var backgroundObject = Object.Instantiate(backgroundPrefab,stageCanvas.transform); + var backgroundObject = Object.Instantiate(backgroundPrefab, stageCanvas.transform); backgroundObject.name = "Background"; } + + /// + /// Gitの管理下に置くためのファイルを作成する + /// + /// + private static void CreateGitKeep(string path) + { + var gitKeepPath = path + "/.gitkeep"; + if (File.Exists(gitKeepPath)) + { + return; + } + + File.Create(gitKeepPath); + } } } \ No newline at end of file From 9b024c0d5f0700aa131947be15286af6f893aab8 Mon Sep 17 00:00:00 2001 From: yousan Date: Sun, 6 Aug 2023 13:14:40 +0900 Subject: [PATCH 11/13] docs: update README.md --- README.md | 28 +++++++++++++++------------- 1 file changed, 15 insertions(+), 13 deletions(-) diff --git a/README.md b/README.md index 7e333bf..f0ac048 100644 --- a/README.md +++ b/README.md @@ -5,11 +5,14 @@ Unityで ADVを作成する際に Fungusを使ってより簡単に作成でき # 使い方 ## シナリオ環境 -1. [GoogleSheet](https://docs.google.com/spreadsheets/d/1k2AGDMgL6sLlIwmGZ5oQH2knIRoIAUhfyIYyVp93Nh0/edit?usp=share_link)をコピーする + +1. [GoogleSheet](https://docs.google.com/spreadsheets/d/1k2AGDMgL6sLlIwmGZ5oQH2knIRoIAUhfyIYyVp93Nh0/edit?usp=share_link) + をコピーする 2. 以下のように3つのフォルダを作成する - - `sounds` - - `characterImage` - - `backgroundImage` + +- `sounds` +- `characterImage` +- `backgroundImage` ![img.png](Docs/copy_files.png) @@ -26,18 +29,17 @@ const soundFolder = "1pXyls5L5T_uWcw4lJyOtoCtXtm-8GynC" 4. Apps Scriptをデプロイして、ウェブアプリURLを取得する ## Unity環境 + 1. [EasyADV.unitypackage](https://github.com/MidraLab/easy-adv/releases)をダウンロードする 2. [Fungus.unitypackage](https://github.com/MidraLab/fungus/releases)をダウンロードする 3. Unityプロジェクトに1,2をimportする -4. 以下のフォルダに画像、音声を配置する - - `Asset/EasyADV/CharacterImage` - - `Asset/EasyADV/BackgroundImage` - - `Asset/EasyADV/Sound` -5. シーン上の任意のオブジェクトに`UpdateScenarioFromGoogleSheet`をアタッチする。このときに4で作成したフォルダパスを設定する - -![img.png](Docs/inspector.png) +4. `Tools/EasyADV/Setup`を実行して、開発環境をセットアップする。 +5. 以下のフォルダに画像、音声を配置する + - `Asset/EasyADV/CharacterImage` + - `Asset/EasyADV/BackgroundImage` + - `Asset/EasyADV/Sound` -6. `ScenarioSheetData.cs`の以下の変数を設定する +6`ScenarioSheetData.cs`の以下の変数を設定する ```cs public static class ScenarioSheetData @@ -49,4 +51,4 @@ public static class ScenarioSheetData } ``` -7. Google Sheetにシナリオを記載後、`UpdateScenarioFromGoogleSheet`の`Update`ボタンを押す \ No newline at end of file +7Google Sheetにシナリオを記載後、`UpdateScenarioFromGoogleSheet`の`Update`ボタンを押す \ No newline at end of file From d0a3e4ac21e4dc5ac6695c088a1db7bca3fab2c5 Mon Sep 17 00:00:00 2001 From: yousan Date: Sun, 6 Aug 2023 14:19:43 +0900 Subject: [PATCH 12/13] =?UTF-8?q?fix:=20KoeiomapUnity=E3=81=A8=E3=81=AE?= =?UTF-8?q?=E4=BE=9D=E5=AD=98=E3=81=AE=E5=89=8A=E9=99=A4?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../DataModel/CharacterVoiceSetting.cs | 24 ----- .../DataModel/CharacterVoiceSetting.cs.meta | 3 - .../EasyADV/Scripts/DataModel/ScenarioData.cs | 7 +- Assets/EasyADV/Scripts/EasyADV.asmdef | 1 - Assets/EasyADV/Scripts/Editor/EditScenario.cs | 25 +---- Assets/EasyADV/Scripts/Editor/UpdateVoice.cs | 101 ------------------ .../Scripts/Editor/UpdateVoice.cs.meta | 3 - Packages/manifest.json | 1 - Packages/packages-lock.json | 9 -- 9 files changed, 7 insertions(+), 167 deletions(-) delete mode 100644 Assets/EasyADV/Scripts/DataModel/CharacterVoiceSetting.cs delete mode 100644 Assets/EasyADV/Scripts/DataModel/CharacterVoiceSetting.cs.meta delete mode 100644 Assets/EasyADV/Scripts/Editor/UpdateVoice.cs delete mode 100644 Assets/EasyADV/Scripts/Editor/UpdateVoice.cs.meta diff --git a/Assets/EasyADV/Scripts/DataModel/CharacterVoiceSetting.cs b/Assets/EasyADV/Scripts/DataModel/CharacterVoiceSetting.cs deleted file mode 100644 index e7b5b64..0000000 --- a/Assets/EasyADV/Scripts/DataModel/CharacterVoiceSetting.cs +++ /dev/null @@ -1,24 +0,0 @@ -using KoeiromapUnity.Core; - -namespace EasyADV.DataModel -{ - public static class CharacterVoiceSetting - { - /// - /// sample - /// - /// - /// - public static VoiceParam Character1(string text) - { - return new VoiceParam - { - text = text, - speaker_x = 0.50f, - speaker_y = 0.20f, - style = "talk", - seed = "15" - }; - } - } -} \ No newline at end of file diff --git a/Assets/EasyADV/Scripts/DataModel/CharacterVoiceSetting.cs.meta b/Assets/EasyADV/Scripts/DataModel/CharacterVoiceSetting.cs.meta deleted file mode 100644 index 8af2b6f..0000000 --- a/Assets/EasyADV/Scripts/DataModel/CharacterVoiceSetting.cs.meta +++ /dev/null @@ -1,3 +0,0 @@ -fileFormatVersion: 2 -guid: 26045c5a567e477aae934c4981eeb8a8 -timeCreated: 1679417240 \ No newline at end of file diff --git a/Assets/EasyADV/Scripts/DataModel/ScenarioData.cs b/Assets/EasyADV/Scripts/DataModel/ScenarioData.cs index e5332d3..68f1652 100644 --- a/Assets/EasyADV/Scripts/DataModel/ScenarioData.cs +++ b/Assets/EasyADV/Scripts/DataModel/ScenarioData.cs @@ -3,6 +3,9 @@ namespace EasyADV.DataModel { + /// + /// シナリオデータ + /// [Serializable] public class ScenarioData { @@ -11,10 +14,12 @@ public class ScenarioData public string characterName; public string command; public string content; - public string description; public string sound; } + /// + /// シナリオデータリスト + /// [Serializable] public class ScenarioDataList { diff --git a/Assets/EasyADV/Scripts/EasyADV.asmdef b/Assets/EasyADV/Scripts/EasyADV.asmdef index 1ac7ce6..b336390 100644 --- a/Assets/EasyADV/Scripts/EasyADV.asmdef +++ b/Assets/EasyADV/Scripts/EasyADV.asmdef @@ -4,7 +4,6 @@ "references": [ "GUID:007db7f7a4c8f944990d71603a110f82", "GUID:f51ebe6a0ceec4240a699833d6309b23", - "GUID:cc04cd67926c76747844771fb8e474a5", "GUID:34cf00d3f10a8f34783a2f8b914a0219" ], "includePlatforms": [], diff --git a/Assets/EasyADV/Scripts/Editor/EditScenario.cs b/Assets/EasyADV/Scripts/Editor/EditScenario.cs index fe2d086..742a5b9 100644 --- a/Assets/EasyADV/Scripts/Editor/EditScenario.cs +++ b/Assets/EasyADV/Scripts/Editor/EditScenario.cs @@ -18,7 +18,7 @@ namespace EasyADV.Editor { [CustomEditor(typeof(UpdateScenarioFromGoogleSheet))] - public partial class EditScenario : UnityEditor.Editor + public class EditScenario : UnityEditor.Editor { private const string SheetName = ScenarioSheetData.MainSheet; @@ -59,7 +59,6 @@ public override async void OnInspectorGUI() var scenarioData = await DownloadScenarioData(SheetName); CacheComponents(); DeleteAllCommand(); - DeleteVoice(_isUpdateVoiceProperty); UpdateCharacterInfo(scenarioData); await UpdateConversationBlock(scenarioData, BlockName); Debug.Log("Update Scenario"); @@ -150,28 +149,6 @@ private async UniTask AddBlock(ScenarioData scenarioData, Block block, int block .FirstOrDefault(x => x.Key == scenarioData.characterName).Value; commandSay.ItemId = blockIndex + 1; - if (!string.IsNullOrEmpty(scenarioData.characterName)) - { - var inputText = scenarioData.content.Replace("「", "").Replace("」", ""); - if (!IsSilentText(inputText)) - { - if (_isUpdateVoiceProperty && _voiceStartIndex <= blockIndex) - { - commandSay.VoiceOverClip = - await GetVoiceClip(scenarioData.characterName, inputText, blockIndex, - _cancellationTokenSource.Token); - await UniTask.Delay(TimeSpan.FromSeconds(1f), - cancellationToken: _cancellationTokenSource.Token); - } - else - { - var savePath = Path.Combine("Assets", _voiceFolderPath, - $"{blockIndex}.wav"); - commandSay.VoiceOverClip = AssetDatabase.LoadAssetAtPath(savePath); - } - } - } - block.CommandList.Add(commandSay); break; //このコマンドは要修正 diff --git a/Assets/EasyADV/Scripts/Editor/UpdateVoice.cs b/Assets/EasyADV/Scripts/Editor/UpdateVoice.cs deleted file mode 100644 index 21b1af1..0000000 --- a/Assets/EasyADV/Scripts/Editor/UpdateVoice.cs +++ /dev/null @@ -1,101 +0,0 @@ -using System; -using System.IO; -using System.Text.RegularExpressions; -using System.Threading; -using Cysharp.Threading.Tasks; -using EasyADV.DataModel; -using KoeiromapUnity.Core; -using KoeiromapUnity.Util; -using UnityEditor; -using UnityEngine; - -namespace EasyADV.Editor -{ - /// - /// シナリオを更新するためのクラス - /// - public partial class EditScenario - { - private static void DeleteVoice(bool isUpdateVoice) - { - if (isUpdateVoice) DeleteAllVoice(); - } - - private static void DeleteAllVoice() - { - var voiceFiles = Directory.GetFiles(Path.Combine("Assets", _voiceFolderPath)); - foreach (var voiceFile in voiceFiles) AssetDatabase.DeleteAsset(voiceFile); - AssetDatabase.Refresh(); - } - - private static bool IsSilentText(string text) - { - if (string.IsNullOrEmpty(text)) return true; - - text = text.Trim(); - if (string.IsNullOrEmpty(text)) return true; - - // 音を発しないセリフを表す正規表現パターン - const string pattern = @"^[\.\!.!??]+$"; - return Regex.IsMatch(text, pattern); - } - - - private static async UniTask GetVoiceClip(string characterName, string text, int index, - CancellationToken token) - { - var audioResponse = await CharacterVoice(characterName, text, token); - var audioClip = audioResponse.voiceResult.audioClip; - if (audioClip == null) return null; - if (audioClip != null && !audioClip.LoadAudioData()) - { - Debug.Log("Failed to load audio data."); - return null; - } - - var savePath = Path.Combine(Application.dataPath, _voiceFolderPath, $"{index}.wav"); - await AudioFileUtility.Save(audioResponse.voiceResult.audioBase64, savePath, token); - AssetDatabase.ImportAsset(Path.Combine("Assets", _voiceFolderPath, $"{index}.wav")); - AssetDatabase.Refresh(); - return AssetDatabase.LoadAssetAtPath(Path.Combine("Assets", _voiceFolderPath, $"{index}.wav")); - } - - private static VoiceParam GetCharacterVoiceParam(string characterName, string text) - { - switch (characterName) - { - case "主人公": - return CharacterVoiceSetting.Character1(text); - default: - throw new ArgumentOutOfRangeException(nameof(characterName), characterName, null); - } - } - - private static async UniTask CharacterVoice(string characterName, string text, - CancellationToken token) - { - var response = new CreateVoiceResponse - { - voiceParam = GetCharacterVoiceParam(characterName, text) - }; - response.voiceResult = await Koeiromap.GetVoice(response.voiceParam, token); - return response; - } - } - - [Serializable] - public class CreateVoiceResponse - { - public VoiceResult voiceResult; - public VoiceParam voiceParam; - } - - [Serializable] - public class CreatedVoiceData - { - public int voiceIndex; - public string text; - public string characterName; - public VoiceParam voiceParam; - } -} \ No newline at end of file diff --git a/Assets/EasyADV/Scripts/Editor/UpdateVoice.cs.meta b/Assets/EasyADV/Scripts/Editor/UpdateVoice.cs.meta deleted file mode 100644 index 540f8b0..0000000 --- a/Assets/EasyADV/Scripts/Editor/UpdateVoice.cs.meta +++ /dev/null @@ -1,3 +0,0 @@ -fileFormatVersion: 2 -guid: b46295463c5a4ed08b7dde35646730be -timeCreated: 1679412368 \ No newline at end of file diff --git a/Packages/manifest.json b/Packages/manifest.json index fe85551..5d12aa2 100644 --- a/Packages/manifest.json +++ b/Packages/manifest.json @@ -16,7 +16,6 @@ "com.unity.ugui": "1.0.0", "com.unity.visualscripting": "1.8.0", "jp.amagamina.overwriter": "https://github.com/ina-amagami/unity-overwriter.git", - "jp.ayutaz.koeiromap-unity": "https://github.com/ayutaz/koeiromap-unity.git?path=Assets/KoeiromapUnity/Scripts", "jp.ayutaz.simplefoldericon": "1.3.3", "com.unity.modules.ai": "1.0.0", "com.unity.modules.androidjni": "1.0.0", diff --git a/Packages/packages-lock.json b/Packages/packages-lock.json index 055afd4..7c68804 100644 --- a/Packages/packages-lock.json +++ b/Packages/packages-lock.json @@ -278,15 +278,6 @@ "dependencies": {}, "hash": "24c16816637242c4aad552ffed8d4fafd283fbec" }, - "jp.ayutaz.koeiromap-unity": { - "version": "https://github.com/ayutaz/koeiromap-unity.git?path=Assets/KoeiromapUnity/Scripts", - "depth": 0, - "source": "git", - "dependencies": { - "com.cysharp.unitask": "2.3.3" - }, - "hash": "ba10114a43a5d5450f801c7a35f01c13cb26ef19" - }, "jp.ayutaz.simplefoldericon": { "version": "1.3.3", "depth": 0, From 9a4346a0ed247d4ddc0dba75c9419837f0f173d9 Mon Sep 17 00:00:00 2001 From: yousan Date: Sun, 6 Aug 2023 14:19:57 +0900 Subject: [PATCH 13/13] docs: update README.md --- README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/README.md b/README.md index f0ac048..62404ad 100644 --- a/README.md +++ b/README.md @@ -32,7 +32,7 @@ const soundFolder = "1pXyls5L5T_uWcw4lJyOtoCtXtm-8GynC" 1. [EasyADV.unitypackage](https://github.com/MidraLab/easy-adv/releases)をダウンロードする 2. [Fungus.unitypackage](https://github.com/MidraLab/fungus/releases)をダウンロードする -3. Unityプロジェクトに1,2をimportする +3. Unityプロジェクトに1,2,[UniTask](https://github.com/Cysharp/UniTask)を追加する 4. `Tools/EasyADV/Setup`を実行して、開発環境をセットアップする。 5. 以下のフォルダに画像、音声を配置する - `Asset/EasyADV/CharacterImage`