From 1fe51f992b65e20ae54e33160ee9bdc1162879e7 Mon Sep 17 00:00:00 2001 From: Larah Armstrong <29762984+armstrongl@users.noreply.github.com> Date: Tue, 15 Nov 2022 17:15:31 -0600 Subject: [PATCH 1/7] Add Network Simulator docs --- static/img/tools/netsim-1.png | Bin 0 -> 4469 bytes static/img/tools/netsim-10.png | Bin 0 -> 24041 bytes static/img/tools/netsim-11.png | Bin 0 -> 28101 bytes static/img/tools/netsim-12.png | Bin 0 -> 70625 bytes static/img/tools/netsim-13.png | Bin 0 -> 24914 bytes static/img/tools/netsim-14.png | Bin 0 -> 24985 bytes static/img/tools/netsim-15.png | Bin 0 -> 12357 bytes static/img/tools/netsim-2.png | Bin 0 -> 23021 bytes static/img/tools/netsim-3.png | Bin 0 -> 69259 bytes static/img/tools/netsim-4.png | Bin 0 -> 37663 bytes static/img/tools/netsim-5.png | Bin 0 -> 24164 bytes static/img/tools/netsim-6.png | Bin 0 -> 22153 bytes static/img/tools/netsim-7.png | Bin 0 -> 7950 bytes static/img/tools/netsim-8.png | Bin 0 -> 25046 bytes static/img/tools/netsim-9.png | Bin 0 -> 33693 bytes tools/network-simulator.md | 414 +++++++++++++++++++++++++++++++++ 16 files changed, 414 insertions(+) create mode 100644 static/img/tools/netsim-1.png create mode 100644 static/img/tools/netsim-10.png create mode 100644 static/img/tools/netsim-11.png create mode 100644 static/img/tools/netsim-12.png create mode 100644 static/img/tools/netsim-13.png create mode 100644 static/img/tools/netsim-14.png create mode 100644 static/img/tools/netsim-15.png create mode 100644 static/img/tools/netsim-2.png create mode 100644 static/img/tools/netsim-3.png create mode 100644 static/img/tools/netsim-4.png create mode 100644 static/img/tools/netsim-5.png create mode 100644 static/img/tools/netsim-6.png create mode 100644 static/img/tools/netsim-7.png create mode 100644 static/img/tools/netsim-8.png create mode 100644 static/img/tools/netsim-9.png create mode 100644 tools/network-simulator.md diff --git a/static/img/tools/netsim-1.png b/static/img/tools/netsim-1.png new file mode 100644 index 0000000000000000000000000000000000000000..45206edd1775529f9e1f8b4cc6c9f795a4b46e5c GIT binary patch literal 4469 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 CZtFk* literal 0 HcmV?d00001 diff --git a/static/img/tools/netsim-10.png b/static/img/tools/netsim-10.png new file mode 100644 index 0000000000000000000000000000000000000000..5fbc978cec12b71fde3964346e9873274a532d79 GIT binary patch literal 24041 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�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 literal 0 HcmV?d00001 diff --git a/static/img/tools/netsim-11.png b/static/img/tools/netsim-11.png new file mode 100644 index 0000000000000000000000000000000000000000..7c076f44bb09a45a11ea11ea125ab2bdc312ec65 GIT binary patch literal 28101 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 literal 0 HcmV?d00001 diff --git a/static/img/tools/netsim-12.png b/static/img/tools/netsim-12.png new file mode 100644 index 0000000000000000000000000000000000000000..7f4185d3eadb85f7cefe9df04b79a5059bab6127 GIT binary patch literal 70625 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 literal 0 HcmV?d00001 diff --git a/static/img/tools/netsim-13.png b/static/img/tools/netsim-13.png new file mode 100644 index 0000000000000000000000000000000000000000..654e8409589fd0d633eb414a34e7cc222737e861 GIT binary patch literal 24914 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%0DwUrr}QxgBuunZXES8pDs+*)zk>M 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%0AJ2D}yB~c5 z!uIXSIJG+aJDE3s=+wIjyUgmb-rL?I zjYz@Lxlf0v?(f{UiNdDUzODoRnZ0P!>jf96BpkI=q z=@EBvrQeegv$|Sesq2r%ofI+RHEvfCG zJaAUG#y5BG%%WJQ%;n`nvyB6rPT$zrPMy5YYmmQ*{g=`W=FwezdAB~c$5WR0lMKx$@|UgT6S!|Fbhbr17>Px{+Z7^aSJk?WCX3X-)w;hx-%J@npm z(IfqPbGkH+X4{r`@yVwz9i{N~kZ2!rnSYOs3rnmNDJ*4{eYlxpjaA^b#D?A0eW%0Q^gbmQ8(hdzacSi`M|w_U zs$j5h``5Y`aXYZZibIcLYHT^^})oTi@$<;x_Vo5R!EA5t*rAp z93h|VzZ{@nmm#-mX*JpS6OtG-bT+hQq%3LQ5#AmXY^Ezmc|BLRjPRw5Y(dej$;?~Lx|a>EZ^V1ei2%@vnk)T`x)FB39z@3 zCjv#uRL+9z$Mca$sn=pe)d|_&e>302U%0*81seWdcE6>5^?~y?)J>J}9YUy!I?Fzz z4z}EL2X)P7eEl1=IQR^VNx4;}ChAMWXUWaY6fC=D;@)f1MBX%zl>K{={dw_ydF8%+ zhdEyKMAL~W%=PI``A8ULNc}zfyzt|n@#VXTIx=xizhm;3KWcv0HjeA<6@IJFTdMVe zEOhe|&Ukf8rnz&pw5mroW?lILmJjAWz4GZ0XGK8At1A7yRjgTUZTE;Q1aderLC+SY z|3?-;8~D57jk^w1Eo8txe@TU;17G=*dJ%ni(wRRy_wJ2-`}XaZIYL5)9AngyF1~D( ztd^5^%&^tqaozg4sOa%8*ymd-I>bj+lV2A6ogf`}ZyKduW{iit9WQaAWJ#5Dn|^*x zlUGn%<$mJz?z!Fc8@w%VkL`XESuH)Y@wn~s^`#K5PdX>|d;9h57ku`?yQrMU;#qo9 zqd^Iq0WE99no6KOtD%5_ALA9#4j*o_9am#n<9ei&!~c6hB1uZ>E+REn%M3aXLYD zlRwu#ZN|CELZ0+FR2pUEdePoizk@H4^Z%G zQF7$G$xRi!S3oAA9U(CPcSCog_RG7%@$wDomEk8<$9<0P4cq(laK(oU^*3Co9!Rw^ z>W5~E4=}|SEL5|c95UWxY&kJwJoC!G)0j$s@TWt-tNzR(%9Hw6c0bqT3O#(C?)ujq zyh+)|-tG-E;_MW8yu`jGEv2%@UTELGNxs&VH+6!R9Rq7Fk(N7r^L&2fNa`0lJRMej zB$xB{ND6nV)K0&+?%CkOdBzzT`e}!H#;7iR8QNk~k>Dz1+{9)v)3Eb6<%G7uFQ=sN zWpw0q_~Ze3A(Ss}*sYRVGE}d-<_aj+K3HyK)hS~+W;EX3mTUj$qu)x+8V_4IqeN6G zv)Nhcf#=yyUf(C5s9ZI>`lvPyCi3?Pq3YT&o)}$X=mmq~c{XUt$5q#~FwkB{cZ>GudinprJ~Nv(n|$z z|C-?adTWXQdEN4Ov8|bQRv8-kAHP@)KVT0rYAEB$*Z7f-gv$dKcf8rN zUF&O|8_u7uAHMDRlJPJl?6)M&om)4ToQ%c2KJc(L9>%L|E}_V==&QQp!)^pO9`x-J z(^0zx|C^LszhIT3XZFi6w~9Fb{3&17LcY~~%A=@gZD! zh}-TWzVD?Uk>leg;5et0K4`BW-dBUWSTrUmaT@+UPeSaoc)UH2&v`k$)%scJ%g>nb zBGRqUhk&)aenef(NB95oab|sGVgPesFljA3-_w2rUMPbziUAD5xKPP5nL==N8e>JOr@^u(#coju)7^uC!vh zF%mv+*6@*or!aAXS?qsWq@^V%$iCA|Sm#LuJQ3hI)^zm9kxH;-(VKEBqwRT0G?x%2 zDq5{BnuIsy^s6=FGh(GtCy5o0>eRP3^4$f9<;t`E49 zzSY!dK{i1+auO20yrQBgrbuBSG^gpN!SU&^AD|-@&Lx^+Y>K#F0K{|+3}(CC^+5>g zJc8pGEtI=;>oUG0QjZL{JpbMi8Z_$)W{Y#|XPA(Q<+^xr3a+#{v>_svjUmc{f^hgk zAo{q8$fbnFX~$(seXS$^;y)V#tD02@fM5J-Y-U1u$^f&yu}X7 zUf2ntm{2m)GcrK)FJrKQ1R*gqlN(Cf*Wt#53Q_SVPoKU+gaUbyumQXs6nnn&x)QI(q>c^~VGbncPm>od zmb2Nx7HgxM-dRb#v2t!!-K8|TXpyXh^SIaDFv=L#03+W`M};oq5{ZUPy{EnN`l4Y_ zuO=o5{|a<2J%43`ZH6eQpWyTp6>HyY<1*xZVdEVOHZ?ZZ1`onWEdw+;V&2tksNqze zJvEDR86+k0*V4i;2(=-k$vMF9KuLvGf%{I>f%TAhar*$cUwgG-4)^11>OvD;?IIJw zW@u<>A-{wT#UK7%^fA1CPRDs8Oz_si9>Kix_O~%Hk5Gvb5{ZZLP7H3609bL1f&o>D z=VDyIRxDgY?-qrkV2HqGa`%vD()NSXyXyUJ7!&o!?bhd$#Ha-Vk31|0(*^|{it95p zFd+CDLXn^YxRFLJa-zC<_G@cv#>0jtCOR$Y`g=#_r>4xK$^ML*V8X>u`mL60;svx0 zSlJc*A?0KW_wK<;H6#WQv4b=*O*7h25Qd-xU^ebQ;9mvX07VRIYEsGDk)viyuHhz7 zqI}t(O@+r|PgUBV_x>p;1%{?`JptnDiMYT%MSe=f$ z@7IB&}n>3xEwOQTMl} z$F9eld9g9sg9&tWTv%LqWl= ze_*TI1BRmVK=2IVg~#ttKMQsL;q&qBYq@4o@}_yet3Uk1gM8loxs>y?!&@Z$${DpN z_qJi=inqP36b;HbBCWXTESFYXpnufGo2+D9&F`s)Z+SD4;p;yq(p{Y}rTL&;;-u2@ zHP~*mLQ)?^IpAJ@(&50HHT#4Y-CzX1#GMb+r;A)C96SHwMn2oS8e$}gK7z5vG>wwY zuOwm=xN#37Q>VX2F(eBjUy4{@w!_?64aG|+*>H$9)ocMlx(s6nkvuKpAY$Y>y8e_G zvC7yqxB&r#a>4mO56-I>(z=( z=Z-)3A;^hJV%oxi>h{R3=x9aLGfJ0DLNTxM_O8aE;hoz zCzN#b=ex)j6L)@DS(vb0`Q&-4x!tV4<_JN8g4omv>x##utxMK*nF?a`rW!GkLQJUR zCQ6<-DZ(qGoQGJHw-!UI92y_jL4*k1aT>W*jJ5777GrQOJK-mIMM8oc;w`Z7kCqk* z)L4Y>2>H9=X&JB7u-1%tc>rqo;62Jd@cr_*viBqUBpuRp$4Ut{c%xu!LK(LI5{q+XhK-TD= z)vFRS>)SM59rRRF;Op&+dy#l#Sy4sB(+8DKN)S1mO4N(H1r8Yp-V&cX|V}rZIWfOD)qMBkfKTaupA&+Q_xKZ~zp{(fiz{Mg*SFIL0oH2;v{!jcyG4oZB^ z0N0SFi@%Szaeq}1w;PHHo}8K4QbYa)5W^nK`NHAd56%Rs;%*bfu7e-+faU4Gm(6;# z{}v@OtN2{zuRGe>o~fB`Xubhxm!xJ8!u^JbY|d);KG(xLQ$$~3EhUvM?IJ#{88iEF z3Bt68WM>&Vz86TY2f!|H-E}xV?uN8Dp6FWX~Py4) zuiP~;A&bine7L1XaUX0s7mSf_nZ%rMs!lBpOqXrNsoK>imoONHW#|)G|0}{CB1KGC zBlWM4%}OjDd(x4V*PiE;lGvS>t-?;6@fD4(PIwMqnega=JcyYG0Q!AyvcgMS5l>^s zEY#rO;AeAvgt1>Iv06^vFg9j^428)m%A-dmWo7+p@BSu6UEj9GH=y+|;5PcF5zwjv>Q z9k}l9-7|Nu{pak|J^OR$8{%S{$V&pxDGiQ~+ax$S{(r2!cRZJW`vy!_B=xmID#|R$ zN+dFpEo3ALS;@={$taYSY#A9LnNdcv5?N7*tf){3WrpNAuD%AKeLpXb{PaBO~!m}7&(gvQ|CC%GdvJ2f0{=~ooNd(TI zGr7C$MK#sbX?!ZUO$n7w?Iij~(ThG@zY_yQfKvV0%R z#0)-A>^L;&-CgplH9NKDLEoRpbMdd4yxdQk>%A7O%`#K=agLo3ycui#kX3WvTI~++ zC5dk%fAT+C&(<8Pzh-&LFwPjbqlXFaH`QK89N9}BJ zMAhu`P&k!fj{i;O$E_Aedwv<#m@Q;v_WG;nQh;{Y;qV8`n0UBoLZ6p~p94-8_XV$O z*HA~a5Me@pQ3&CRZ8^U`!A@ZOU4i$xJ!Cx_aed+zKi~Vyvn$Q0Q>IRs9QH9@60034 zO?e%E^0MaRyifF0l}`;ir+CLm#F7gxX@1{UmwRLBTzJZ<%@cHw)(;oi|Dx6|Dlhf) z94Q@MH(PSf;Z_R%$AyZ|`+H+{$7?P3dS#)E zVE#mP9zl~D+JrZ24U#KF*Awg?C>PElm9f3Lez)v_X`b8K8#d zeCE8-z(RyL{>a?7aT~-n3BUu@ zY($m~dUb7*$)l4KPGvm$JY`>gIgGP3D)Fq*fr5nH%ghW*LwQaeBK_031JpJvtxCn( z(p8&nC(NWBq)A`@b_(Me!x#NQ?ejS&|Ixwh$84Xc8=#(Q|*_AFi;nNNDyGdxbW}I;U zp0K!ro&+M#3QyXjILuzGP37T{PWA($^400y!zwBg&SP5vo<|7FS*~sgEPi-4Q**S~ ze1h0afOqI|aM|pqP@-`-;8r_+v`WzLqRaO`HH)=#$BORTX?$Fsy4n!)d{d$3+G0-i zA#)caUtdc-6T@KV#5c=PtShlI?v~ePijI;EzA#NG^w2hO+}ylBUQ+8mSfbQ^yz5(% z`eS$bSJih;Rd1TjT}%0VMUUnmVNF|BcDKQ|`qFRYc^P6Fev${9TMagGe5~F*U-4Ug zz=yYN!Y4N@y7OJ+y3o)cY95MA=LD3L@k6a&5Be27ecCg-fa1lYt`tFFDpEV@zBiFb zAjb^PnaI>yXhh=U0)iylz#rx+cnZwYZUcb?mrND+$j>jYC2#z$Xn0Q1@QGv2aqH*? zX=nUAAIadVcah=Z>iFV)6@w>6BDVX+HjasUPRdH9ua`D^3i_#a>OEQY8~SeKGkfg% z(kae`4;>@N7^BOcrF=E_+c12wY#_am`mJ_1y5YE3x?J(tmc^&Ib+fJS>@Neg69IWxAKT5n z1WILveiqZbbqP*zdzkh6)$c%QmIbe2N6#6_UwvdV?FyZ<)~S16Jo;97ep^0U?i!_> zqw!0FCwlqk^tQ@=t4{p!)n50#{J`d(mTTk>uNDrOG@tMe2^`!gXDcP8{XAS1W&P;Y z@5rw^ei!%caer%PlXx_NhH`cF*>2_5Z%b!{W_QMs*N^e?+~fP0-PP)AwESo1@7(I8 z7|D6V!AytU1CO&#eOTY`!P6HQo%}4pWx6cApyc4$C5Be-HnHDJ1{?Z~RPScr8$FxJ zkTKYB8;C0{nO6S7`}>dE+S=Y|<(~DEpEmAAD3Qo^Oj$pe2>rUY`o%kQCS_%$KB0fn zx_Itm;E9Ic>OnG3g5y(-TC+;MR;JlnzxHtouJI;_ZB+{xr5lyoJF<4L$bKsaRdId< zWi9tRoij9&MJqC1i&!SVOlzs+D4hUSi(^p0AZ8 zH6#-!Rt_HGD|_t1ul+TZ=c~hl=Yc~P9X+%kg#I~h-^S{!v-e!PBn10ioWU``y=3- zTKdXa`c3WLNHXVR(`@qll0QB54QL5avaoo_FD~w$KfY6);O8)bWG4>>){)dsv9S)t+kjBOpbZ5pbtD!H^y<>s~=Ry0!|+FnplaO%{luxWorf}=Gp zL8GGzynp!d?D#%Q&+llWyA|;FrRrHmVQ*U=R^9KU{r3m{7kGLksqr*G=x!L4MAUFx zzN%->GJrGr0z61W7P%LtGKbMkjdctTq~_$jwWYvUaTn%{AxFn4o_{E$+`BUosTUHm z|LDN<$TL}NHlxNkOo<)t0k2j(_qYVIzQqKW@M)0R*AOMMo9kN0P z=D!T{=>4mCT;x<#3*Zz>U~uH@djcYvi0(R6^kRR91;K{4_wrc;;J#uaPL0Q1|><@!jmR z`3T*JD2*c?-X`GJPIa%Qlqe2FYKO>u`~E%j@!ZsubD}S3hUW1D*MqA~+0!_UcogCa zo+Ld!qOQcFmh;w~F1p_+~6yyRm^qabywKPq!3S|-ZR^N(DJyVzX!*n3?f z?SgdRM(!JJxbq%A$mKzY(&S=H>6F8+gJ><=vTO&Fo1YAeD4A zhYQgdgBjMju2=n`uz{H`+De?;^Zc}X_nO9w zo9v=KoU6x=Ua7KVUl}&r#CNflf1>DaPybB65atU?QF&c`Pm?e|7IGu<3cV~9hoCp<&UEHCf+BV`v zb8I4muS`!ymxAJvQ(#uU|CZ@?aeKqe4B4dMl1DvOZYL6iyW?YJPt!@Vy0=QizLVQr ze6PzF9T~OOB6Df(>{-=&UOsaPkDFVj3;N!<_{*9$ROrxyb(nDfh!1hoUP0)pa%=ys z{T`+7xgO;RnJ8WC@EQ!;XdfZVAJCul$+j^ly#0sAMd@2^p;jaZ)uLsL?jysw^9PF0 zzS-H@+832BkkO+mTmG6>+LAl+iGIX&d&-y?$zpd}`P1*cdYCHhTutMgOvI~V&uXOx zvcK({(&AaN;h!g`V0!Nr+=;z$_=~CvK$V+RkvdQ5`ij;dBG$%iP1e~=)(83sN)r9# zPrALJ;}D%pq*}SUfV5hYMFmTj#*Y^J2iN#CJ9y+qoDR%^qrG9`M4=tFlP;@)s{FZg34@*r^77yR zNcV{2BHW$%M2U7t7jDnXChAV^iqPiEB-6f6l!6$#GH;A0h)IKQs?gK2;=R!y6 z^)&ZBzwT0Z-^xWWM8mL*As1Acex8vhb5ak};$e>1G5g8Gq8xAN*3P@?Mke*zsx%8Y z7qcCuVwvEz;V&<%Hdt)j*Ie34^>tg36JymVEw{=Bk72xdP~-dJvX#o@XRMJ`{o%zj z@f*?6dJfvXlm}^Mn|VN($6s|zh?4R!GGckmU9Yzry5JThOM|-FK{Da@8j%Hs#+5Gt zs3EZtXAaTbjvioDOHol#YNRKFO8rXkY&d?&rfPw0;o_6c($Pjj95N%om=g|IfY!mW z?T9Ww$!rN88e}dZdyo{PrBc7pSjEU_H=KD$BLHiutgg-l(>q96aGvroaiV@cl9H10 zmy#r?P$-#OejoynGrq0Tb&?+7{bYsP^o&P!#(%v4%-~yyoRZtOw-V|SVqWSH6W9o$ zlUO+f-B^%$n@h4fP60wuH?@0v<2Csx{@A$lRkulrx)?v!l0&5A+ zEi|f+-ru}ZEc)R3Vb)e-)uR-ThTJ5-wejU@73caI3BGP;7dR)!R$@H;HS02sZp6BD z!k?DX4^am4=X0}7!Ww^!aI2F3>hP#(z@wlZKa@8x*wq$y_zTes1xcyzqIY;i1l_UISMwvIpQ*?> zSQWl+?K>_>O3};nU4A|^e`A8lr`~q<*M|4B%fuzw(nRA%9x15BlVZaoBm4Z8m)-H;gRt~$ z(9NiLsCxs;h3J1EK`LYiR5H7H!+d5i!<^F6!#syMIQ$9=1);f6)q&oos)Mk~#eW1r zDX=C_{tgBTe%swmL@=Jtyecb&pcx1vB;d-2hlh#Ka1u1|?iQ+Y5b*i)>&soL;T2(} zScO!2`tP#_VoIwyIW0oImtw|j+6s6yxkIMHn=K~n-KQ?y3{9boTg%t)pSnb=-)81h zKo=4c$+Q%!Gm$tQ`f1^pKBnwGRXc6d~UgTIo{7%6vruqXv@ zGW4kD7d(6g7}m9f*uvfKMv1e9i}!JRV~e*>hXF_9!U}FUt_}`*8~bn#$twESH=Wkd z_w@hbinj|A$XQ~f6|yzz`{dvgH|CtowKChbFT>=OjR~zpq1#S#eNz+dDC<~rC#BQD z8!lX#>m@egyV5^eIN6&yaWyzKUF4`xU@@2tg2iF`!A+1`?fB<5; z0L9I8^g2V$ghLNqDidG{$O(Z3DJd)nl7Y@aXdr7xEn8#ER@8)aLz>ygRPILa-kznX zFeE?qbimG{L_Ng#E92JLtxd5}KcHAVPgy}v&54C}QQ{wVN#|EH&K;j=(HHRxJ&12s zYF4C)9@__h7I{gKod}Elm)xAx&*)as`SZs=h~&Zbd1`{#6&4nDAB2wcc=+qg%nVuT z21qD4)F_YvcCjeu`SbgsyN(beD2VM&_z2N_Y*Q|y#LS?U{|ZM$0AlN*KFA;l`S*;Y zFBy>@f#xita6{gLpMD-idtoqs&-oN1N4=?V(ev#J(o0u$GBWCH>b_~^9sU+x#S-|O zB7pk#fAGO_nYb4rgJXqfZ_LNnx=!~r5@Q#@ei7=gCk`6pIHJ>GbM?Wdq=Xp-*)Ooh z8qj3?G`=^?)D67fkJ8dy1)MPP^$=49B^=F$gg6hb(ERXywJWx^S?9#8!>SyIGBVzY zE^goj_B?xzA^}o>U6>R%I{S8fpfJ6Q?i0Kv*i7z2ZH5*JiFakzZX=!Q3fHN>CH-iG zsc}$AEy`rbnrZ{prgsryRyBT!#D(3DyXG%Nzs27>OiFD_LiyL~`PM_?MvFlTI831} z9MFmX`wJd4UvyMR07{UjJ6${EEM2i5MCRb0WPYNeu0LfxbdcJ#jE|u4N5NpGm6SN2 za|6Zic-Q z*cnt+SZImmWJ+$5mCKvple-Qfdk;I2{k`Ry%+faruy{F?jceJtB z`MH2?jr;&;|2H>>!hxe`8?S_jc=HDk1Wu+?E^Jdo=hJuPlAgWS$o&dB|#_8P%nInp=e| zW~X%EZWnFF!GnB{w|EHdV>34N?B(fU;$GY*?~=as=$&>R)!$lstsMTj%F3B&WYMqIV)D!di9;Xkj_ybA)=L+$8oH{q-sq>^b{Yjm!QI14<+O%$OcdjW&7^psWW`c)pV89NF7Wte%&}9V>9Uyf%)n8^qY;4F zKNP|$pzt01$F|S_(_30kE~cpDW|PFyER3C^G#b-7JpS%~RPBqR*Nz9CZ#!5XF!Y=D zDJ7XRaZh&h8&9{tN#m^Q3%mGVRa=rTt)=5sd`_0BY)EpxGnrxBam(tNE$0dbmI5aq zj_aGcQ&fEV!*a^d$4o}CmG)_uOKDfswlu*eEr-N$Jw}$NjM+JyZ4_=#{I?j;)H$ue z>g57)9zAQjWMpK}#u&c7n?o8_E;>3MGcM+4683si(eVkiho-lIts!uPhA@DUuv*3=%lh;>~-N zM&-;Q#j|N8&N~(l9wmUIg+-MPV^BAhziF~4B1Ha&2Jv`l%rqki_CUxpvWWX8eXCgD z*z|leYh3PyGX)(f*QaVYWNwl+`1R|YFhbxR%3WiIb}eUhbf;dmh$PD>>wS3skAMTE5`a{FGbo07E_uyf9*WAu%E%|~ zX{55LegXR*N@|!W-?;az_C>~#A8+=UcscsG^J;Co|7PrVYlF2cpkNxI9*UbBT`9c&oEc_?Xzp3##=v2Ka z;%klpT##4HNa>!C4*c0B!&YLMmG3bo&N9V|)zBae5_>dmtd|tt-YRln=hmQzVy>-};rKT^4pPiib_)ON z5ey@N?G`Ghdc}e-Of%G5w-$TXbtN36hLx^s1hwQT%3ciSf#J-o&pbRhIQVJ6(M0u| z7p3n$Rqy>G-sQtYyx=HQDI{_sRgNc_yZ*9R7lcnGB`Q2M#cj+Va}oZ6Yu-tUKj!B@ zqxBLqZy=-w8GnU~hZw>|c|i$%#K3eVNpWb}Lohy`Y@o^B4iCS9;SLt2ur@FJh_DNy z+n6QhLF(MD6>3kR`5etS)NcbYYsHyyw z2GH8*2RR2Kip2F_KkVZh5~D~kqR0>+j5=X1^&Cthc)%yi_^i3#;d=+8*I$oS0XyKu z0Vuz42M)U%5^`kSEf?X%*Y6rb%?r8CA=Q>u_i>HZSI}&jTX6@0)4(C{3w?MP7#vK7 zHb)AZE#+27;vr%nHr7|n#n|qIh8~cS*^4wWcruBRD5%xphM`0tB9Tj^nezoFu;#d( zz5O`IIzUTf9isV>P-sU+2&*Pic2N`W))Ghd2`-Mx5~0nakc3~Y5vk#jw@6J9ONRLP zh`rKNy3BYd$fm@#L(&j_ife!)s>wp+>QoPZ%jbKksU7ecV)?zoEk}bQzdho11VFd} zOTgsxsHli4t*ngM58@jZtm0@IF7}XISf1nW$jF`0)JRM9zbI#W z!rvvxM7|Bn6!ZkNOj6|JQbWeUyp3o=6tifFB4xOOmq<@fhu=OJFVWT0a|$cUw1x|u z)%n)l3=9qEd>@KZpCUKV2`giuU4;Es=gCk971AqL{!L`OyKZ#+iW zE^)U}^w8n*g)BwHW7%Mj^uxb~bXE^F9xS$sZo*ZBKr104c2q>fIlqyW-rRveDZD36 zu%jv`EOjVm{A!r&Oiel9#Uo52HBsNbT}Cv-js%0QxZ1;*NwEjg<-cAZN{)jEX{s;c zp}3Qn;nh6eAeCBBRka(hMKrpiYMY#zigM_Ee)S6_zB4>v%Bu*=2Wk8ozDL{%FE1}H zPa>z4pAByZfgZ7fm&-3;S)nDD#t(WtHWT0lDZFey;R{922@4Bfc#Z4 zRvBfQo|o6gBg2UxYh3xRp&@l!+dRfcR1+#)hNhPgo$5Eb&BSDc^nS9mN1Z7aVRm)( z9(bx?{lz7Z?ZWwB=g#RT8D|FG0iHPQ!~IK4X_b|UfN^kFsh&D@>+B%{^?OyXzDg#9 zZ#Wp$s@MTml#pr)iwl0)P=`+7!(iek_$92Zzxs&_5N3s4yS`qLAoj0cf9*-w7-d$+ z7~p#aHH1BXAC@s2&J)@!F5HML|7cb6bSGjzuoGcvCPDTCKWO)GTwe=;hPg{g|_>S3O@Z(qN*Zgxg?T@viA&#S6z?Cl!|2M2kq(BWey#A0Vm z2gHPn8i;L{OJ@r}cRM122l3vZt&ZD|bgkg$1n@$@07^g(8JSc>+N-GEY*hRb*4wL( zF^x$7kJ1r#o6;>bsijMJy^ggHo`LiSq7$m}33vLeE`AGOOg!`{JY66Nl7(ZgTn@`i zAh*R{1ue#l)^;2l!pN=U*C^`4swYAPV7@~f*oOos>|a#-7;&fia~m@8x$zl@--cfV z#*nwj1e)sNEnaUK7q^Q_e79zOS^8bdY173_2$Ts{-dm!9}3-Kag z^PS+}<==p$B4At*iRS}7GxJ28F>a_+4%*Aj`;KEXNS&tNo+7MA?=V#HNoWQ<=hO0X z23V`H_F;I4%KZ&z5E1Qw)^PlJ6D+S>wzu49>u_R25yA!x!9~XYysOTGL!TMMJ3_SP z_u_cP z>ALMMtMirwfkELLaYW3b&7!$v#^h8!G>VB{A4IqUT7tfL;3`G& zMx=FZBcVvYOk>((xTGf1by{RHkT$>CMHu9U;!fG@u<)bq*_FtM(_`-6l>b;`Mln`3lAf~o6t@JpE6}vx<4i0hp zn;VtxGxr-~Pse-Yh_TSQ03|9UUC>IIoVFTL8lfTMOD1tc*Ic^6X^ zD>>WTWW2v^%e~-Or)3()YgBgc<+E{d=ho8JCxsVH5;{&hYmwfcqUmXLcTnls6_u(l zAJi-B>3HG(ce_Q?udS9x8^y~x?-w=it+I^`9;gZWuFfaUqP4VJO`|OAH`igxn@e@f zrb79=M*7F2UTz~NTq2x8LT@LY4rAk26)yeksBk+rWCM2N3FJO>a5=7LshIX&$AqFc zI3_AL|E%LwP0$J!2>VS3PBgO);yzqvG-CTh4HP0^?81hWuZgjtWj^BOIp3B#The;c;Vewo!m!p`fUVS2>L8np%*h| z$m6D#A5g=bB662KHmgI!XQ@)v#g^9i=}F@rpD)?xi`*3`{Y@>dx~|lpLNsT8b+vPQ zrwX(X+ST(SACwa*Rb4&p_*pb9y{@>`c^Ry(QBlz4=Lq>6u$$Z_d(>zBm_ zq@|QW*hFuYG)!U~vzm}^8t~WtGf&QVu8NDMD*o`#`PpH10k9tIKo)Z5q4fHfv9iDk=&l9gUlqUpJ;H>@p6ozul5>tK^Zc^If}+ z#_#vF3zROzj7Y_K(JX{&-Mv;9BsmG7pJf9y=)n{-T>9?-kbEW!^ ztvUMm(S8xtzCpMJZ#NV{*?5S+^W0$D- zY{b9nq_?}g_^hO0bMO9=!|PkL;mV$P ztm_uHoY3W4+@CZR&X{?zRd&5&E$7wJ=3tpSXGD)XfP)+V%x+Vi-A3*~4&Z`c3wy?*@Upv`0XI)YyI5uSfkdLr;z$rv7u%)a%bv0z zl&u;7S$|PfXMz>_{Xe;{*^s5C(vhA}rKFGzpYlkVZPM5FL~{?@FoF!^Ic7fPfCjKc z*OYAVuK$W1|3XK^r}o$SZu(WdxbP1ux*s2J5q+a5=MXvt_=Xyr=$$B!=!Z?%0>MJ4 zj;yujB^pp6qlh7TEAF04>9}lfkFw_Dr|tLue$eDFPjy0Gy6oUU*&clrqbo53p=!n% zkmdE{xGM78dV234sm3f(9R8N=4ys`h5oMKIyq@Ce$A**Rbzh&y+g5^+9m*xp18RKO zSXZa=iX5g_mX(DkR0ED;m>dzC*R_e}ufOqNMCFOo(O5OL|a=0q?sbURz)S@xZ6RrNDzfT zBq1~|;dx5d+B)tGogvE$u|KB?wJiP!M(jnQ%ppPV1TmitjRa&@RYlE8GGGV5VLru2LFI-Kpp-GIzXOj}0u58fzI(uD^>hmz=NK(Z~7%|wFUYbAU~ zIHX;2InLoO$Cg!*5alA=u}?haE&@2iluh<|7xCu^LnPwDi0}y*F?j_A>HP4$0OI+_ z!^6T{B{(rG0Y$0EXl16t2>?(4EtJF3LoYm|0f2}=IqL^LXp0cSi&Jm_ii4~q66{=$ zr#x&Y5j%ElFnN}jpyAiSX$av~B7yOt;w)^*iML;G53A%hgPR>`NMrzbuxw*KCTXPl zCMhW?3dyeF;c(CwrurnrNWz2zs)v1z62$G<5Pg9MyK>)NrBkPzFy9IB%p?n~*D8+W z=j2e~bwCqf5ocFb8Qpinq_BTkRF&2dc-bKl0_g(%111td-R-@R_!{UugDQn3GZ6C( zQNaG#ZUBj0rTCPCV^4lN@{hnEk3Th)`QCuGQMPz297OmKjfarWF@we#CQ~30LBoGY zj!Q{lJ+&4$sSzlI{9hE(wIWc5q+HbN9W1Ix#hQ#&iox&LGd$SI#@31P6hz~OWGG^p+VNxLGhgu@A z4GJ2$(E6t1@N-Ls%a`ZQt9uaLT}ai!`*-*D29=kWYqY#HKTR9pfAv<3RMm8 z=C*B;UKu*TPmL!|!+;y{T|8)TIl4New*e=1v5VhhF%YKi#a8il;uxESKfA%$nTYlPK1|(ez3`qQ+go zZDr%(puX6{pYJWC1Vwjxn_t;z_hA+5FY|da8O<{|m6&H+cGSYCc3WNvxY^NRRZpcK z2OaBgW#HLaS0}sM)>&D(Sz?3Etpg0{F~^Ut3Hs^sBumAuQ{giE^M7OlPG^Lp7Q83PefBopiO?IMqQ z^Y{-wyMN=aPVrFPaY;E?MCD^&gh2R|hR+O3nQWqNVAKhfpi7LEHXA%+auG!}k=Ik$ zo(+pAG)lATQuu6W87<{qw`YYYW;a9-wbS-~oqqhmZtroY9}apH)ic{>b#Y)- zU|ZlpOVu7KP-*N?x?qI5l8T<3$- zm*JIsA=|}UgCEz0=j|L<;d6WTO`8*bG;Y56`L}x0^}lbG&^LeBUvBeyg3Zb^jx0+_ z(H~d&JpcVIv95QzO`8lH9g^9_OP=^9nhE85?D;@QP?v4!v09A<3Gg&O>;Oz{xm- z5^ZV@{9NWLIvqTWl}QEdRVcvS#>N+`xGElajwG(ucIJO?W%`s&UFA`tP5ReKRC=jbJAe22{`hc*BynBF80$nmLEAi94nq7J9;v;w(T zUx$Prl~-Zm#dKG6HH|M*O`_HjH)2$ZMyT;sdqts4!a{ec`(F#4ekfs~%bSv6c=A8~ zIR%kJQt}FA&#KZ`=4Tj%*4r(cRr}0~FLoFe*kzq?Xq0MJ(bCl#&g0UJu0LNHvUFw7 zGcQWbbG?VYaenFewe0PX*&asj&^nrC=P##rTIIgaxYKQk>*a`Wko!LoqT~nlQpsJ7 z*#d(t+5|$>dj^DfrOjen8keJ*VE*Wu!z8dI@yxxN`&j$;=&HnX#j6>J9sTa$wo5g@bl%jk@(N8$-}pVz{J@md^X2la zJwEkLls6aNKYZ+WDfBbv8CkixR$sowChp5u+#Y#9+q*hI`$#aleWQ8@RRx`K#*xfd zp9_m^y5Il0e{<_0=WZ?!&GQZv$__h&Q#e)nO@hw5(kfCOi?n{iea2?@?@0mglPfPt zxM}T13PvMd4G!+kd?&%lL=oL`>)qw2-U3AL6|?J@(R;~WV^p7V8aTfX#``K4o6E^%#wi)*bKU87(nTw5HM;YHaI_oi+zU47o+O0K_ zez^R%xqIT+a)exJ@2JH5NXxG)s-ap|m)A9hs-5Gm@M%fz)zI^gd$B0iB|w(ju3$9F zQQPhD{gFTUV@v%FgI(s$QAwR*&1d9|W?$KJc4oY&n3GQtpHh zW*M9P7mstYNc|U>I(W;PZ>p8f(t=}DHFPX4f4+;B3d~s7(neWug!-G$DZ`|Axc%Sk z^B!INe=(u@){y3y$>wglB`w~1S+N-AT*JAhcZ@gl#CIE7{gc)d{w6U%<&>J*Hk6DE zf`auJmWM7_X#G?Vsk!AiSXLhK39+zDR;s6E)Cti{Ux%aY<~1V^HW({W>VpHhRmz3` zg5f@BMP%6-|6}um)WVNPc`iSFqf~fyt8Y zLpagV>P^kd)f1g7o+2Zq)gyCtFXlW)R+3$~*Kk%5$W{yI&C@%!1m48-DDAe-;dsJn8s_JfmNEp&e_GO2$0yxs{72pU^Cd8@u4D7yz73J80_#>w zOxwMLgl0lIeV?74j_J&llMBeukU*b5b0|e|L1IcXcL0VcK&Uf)xwbn3zzF33E4)Lt z9r3yq#>B`tpb<2uJ0sQyoe|ka54A;SP6r%7Gw4`$l0%eC-rv0Y$+@|&Ap9Xwo;zrS zzCDzAej17IdwZWRVP32fRA12GudY0cii{*Ya+r>az-oYTB!FR}6DiUY#O*%F0?i^x zX!pGrP`(I1D$H5u=1mcxm5MBI28`W+?uQ2($|~hnAEdZIUmz#HI}+VO3~$A#vAtLu&chgK^aYTHm@|j`gfkfO45O^m)FDg>NA@tr*dQbf zB_Wa4O!$O9R(m7unLyQA7cXi$Iv&9!;{)P5jWKXJ2lN0QorItZQ48`RCIzWb27D2n z=`W>9RG(m6xf>py_2R|Q8(AlxWA0GN3B3d98u+f|S_I{QC|)E?GeGu&SVDY4$a?&0 zaRQ{oZ=ue|=pW*Js;ZLkKkCW^05X%ny+ll=5Ke&D+mP^x1taNv>i*abL^rfIg>TCl zjz;Q?Ce$Uga^o9eCKm};pDz?nkWd(Rr&37?0hs;7wVlP5F$0@rq5$!5Sz~};T2avs zKji5Wjz?;0QoGWz+&?eDV@N_S#}Xic#G4e#bKbS za>KcD=*=L?`xEtNgvC(RgMoNEdC|b2FJbKpI0<=L%rp%(s;Fm3)xUxGW6ZZFmM_Q+ zT#~B@rae{^NE{}ogD}%8DPn47X3trj4OeU~d2}XQut;25If#`^S==~3^Yfbbgbz+u z)1>s3l@&F&9iSz!kt=WkAOw)7!C?yIimUig__T;ZS+FF=!H^DSGnj{Wdbqg}%Z2|R zAwIs#%I2^CIU{A(e^ot|eH&miOL&>fJ?t8FdHH}bZLAe1k+%e^CnQE(wpGbI13;R) zl9r+=tg+Ff$}oLkXa*2EdcqF{Qj=&VOUPl{;b*556^Wr8If-bT_=1R?I_&i1WLjBl zKA2sR1w!a>Acw##U1bx+=EKg+@kXjQwj42140AcqRCKX)!`s{2u-Md}QS;l(j9Y7b zaT}CaMXaoYv8o}PI}q#b-nu;j&Ao{4K1xJ*caJPTQEJ6vAUb1l=zzq6!9x=e%yeDp zaC}=?QbGDQVGyk8)khf_882cY)fMpA4&8CY?tjr_GGLO>PXf2 zXuoG9xM9JfLQHJzdGn$7d%j#9-r~OtmI^4}?(-jm0t3y&lXA2lKM^iC9U$#Kdk0+x zc*+r72H13Qam+T7pTNX`v$_{ELx`1*x6HQ^!+U@TaVTiuvJ)C2ydDHKFfh=HbMxVI zV&fteYVQgKy2UTy|0E7f@HRQIj1i^Z;Y|TT<+Lw$#c)SJD|C2mv6I~LH-q(SCtUnN z!0RfNyBa)sQ3xS}BrYrqo_f%S6Yi1+U0=)WSzskWyxX=9FPVvV!llKVBc0@kCv@!n z54}W_T)V=sPLGeQ?!gQvFm`z-Ju>$q2SCE&24*H?!YvR3#nnc{Iajk{CwQx%r19 zh4I+9gM6)C=;P+^4}ZOtjag10GNqh_cONqaTaxkpUfHeWVrLZmP^<}=Oq#AqiiPLe5gF{bln z5f;yjhEC~wadJ1Tjcdf<6Y_AkY8Yx6Pc=>pYd_-WYm=i+xDx(Q>fHHO3nr%bJcHf_ zdZjMSPT{gbPcTD=n6YBySlx(7pSG50-W;Qc!kl5Z44ZT-H*pwPt30ZYxUU|5lU_7d zN1Zt-nddI0bGM!7g4{}N=6sQC(vB+1RwpL|?W*6j0P67B7=l6HN% zT8Ae?U0tgv2P$Gc>vTikX;)hA8n7x9Ep5Ej6#ko7_(H`xCH?4$zcG@j} z=4X+;Ap6cK=rze>i*Z@HoA(BC-&(h_yH9rUFEXDIiq$br-)|^F&mQ|+`dwEX-}!Wn z=oh3m12lXBiBa##bgtD4mZ<%b<4914ixdmJv`g#T+}!Ic&%B11Wm%{L+O~2_4(eSl zeMVPm`1-Sju0#;m;@Ga^O~3b8{W#D<#qzE5>}|Q1rcPRsl&Ul{rB{!5((y>I>g+k{ zdHij*Mi;&G&5vf+8L}FgF2+2TRzEw+`QYV~^VETp#~&xZAl3VJI;KsCl<%x^JS{z$ z)U&dotv!jCX=V-`R{yrJ?VbAhjNnmKML}Yy>9^_W%$yu+{R>btzBWbWdKeRf^+R-gZTOy&m5V8Md?dF# zyc%Lxl69#xn2DUydC%v$2)7tX%Yq zGXb(r{aVUpFK-uK$=`iag9kU`s6~WLXz@sO-X@*}_uqGClmoZ;@G%lXw#?`;LiG>$; z;o^=@Ns|y9F!oA%uPk>M9IU8ynp*6(30Hi!e-LbQ6t9!$suAPe^s}en&Py1o&JPcv zIMRG@;mqS(a>rg63wq=o`P<)cE}{2TquX?^inYV~+S(=YBuVG7+ubc8nU(-f-v`U@ z!oRBh4B#nB)529T_o<~n42gE_&f!d1Iw}x~NT7WXnM8QfuC1@H!jnpZ2)yjPyioKJ z<6kH};q8lpHBF=P1%do3t|u%zDWLC`x7G~jt#p;FB&4< zl9g4(*Y_k5Hg`P86HW@q1Y5+jzD+8B0rv}4P~zGT4qR;%3@vv=4CJLJXgbG385@IWbOZ;FG97J9L|Ir~ z)9~^oVnyRWpJEPev?-+{Y=lQlI*_6Cy{9lMiy~0oA5BZRp$Bd-6Sq*EHc!7`%P1!D zSV37JU=?BPTwY$biL-N6ui~x$Cs1Av1&gW6W}AfwOrQkp3I5k-Rb1KUbN%`?T-0kw zPQA0F+G5%mCM1?-5*sJW32{ z1xiAQ6c@VIF*}Qdh%N(o1XAkh?JYqTH3=+xVf}X5FJ2@Q4LQ&w?n<)a4nu{~SR4BA zfiIAqXokh#H31(31iIP|Li|J_sk9_OtN|9dmShOe7J?gXqShOCnY63!n0x9?|FWS0 z?m8vdD)FJQ-TY$q5nWtR2#LdI+_}z*?5Aa>J6AO!^lXLQTu zD_6GIg;WBd6ZW^yuc(P7xnoC8d3pT56^kbcev)v~R|ae83s4RFao1+^O~8-CC%-@^ z^*g)>vk)<$8Piou`@icJ<>V-NnGjzh;W&B(!LMkh4q^4P?(W?iVsniCI{=8bp`nVc z?I9A>?m(JdA3tg;DFsKDEG{hU77-SPZ@JQVR!l0sZQS8w5G0(dE$rCiJi(dHGMMRv zk{*8LWPnOQJ$(F(!a};d_o~44gk$yJaKox4%wL?lsuzfRkGZn&-MYLv+V>WYYeFOb z(Xb=yc&WYU4q~?%|5#b^=-v*#8<(oNp@Ke(IRm5>jKPB3Ww3h7!zgacR%ydlwd zg6$7_pc0Y3lAiMq8LvF)9v;>pTB$2gi(?^yNec!UfGvfu`mg9sZz^iqRH}N4V1djt z%gYVUS6aXB?CktvrTG69B=J%lif$nWabY_{Oe51mpE52TBAftTo}e8W#_i;$u#k}X z3M&5;tlY^E3^B%PfMQ5=D?^t<5GDtDw^ZffG0k#40wMw0#g=0D0|?VMTG3G7<02g+ zBdxO&mrD6V)j@gh3!Ojvy|F9P}x4-d^tLm_O&>x*H9zdwUZ64bJs>bTK#BsvNvsB;^=dlF>V_k7aH^0 z6jbU|PIY7Vsj6{QC|vg#o2*%!<(b^-RR5HCz&JS-ch^XpnVC75ed@0RgQmd$ch1FnYaOy~N((e5)R z32p~izpABcWaNygDF?P)m*uhZ-w!bZx)Y`~OaauXg3}pKU0g_9S%X$-!k~}rOTt9} zA0XzYaFR{WM%9WSvr$Xb$!Z&3O-RPanDdk zx2zutG~b_AE_0YUwEHW-4+LK6<-Vbz??;u)_$2GfT)P?I``H_BwMEnHZaVy|1oV0S z{5YPV$X?YP$7OKX{DCLb>7mW>09A^{EFNd}qv`3l@v`}IQb7nA{42)qRapSp9bJ$2p zWZ1**7#ELfD5q^S{dl$jpWxCclW=-xg21kg%L;EU@&DHgu&#erE3Uy#*qr?A-S=0< zu@s3!Pa-A#B5$5hvT{ zx+!&VljiAav27adOt0C{M--|T{wPMyrTfPiXhq$rH068aAZk~_m2NNkPOh)|<_S8{ z)%q8K_nP{tw%@Hkl=SkR7=^5ce`QGiXR#tr<^%N)JK-%Hm2&=F6O+`OksAYIQ@6O0 zDk`w-&F;FS+wf|qZcD5G5aoeqXA_644`x-!E0*MuX11Hf3#Q0B{v?+iNHc7{UCVE9f<};agl;F@JVm z+F=_<7YH5aV zJF}7pB>Ec*q854A*9Ug8Gygdx3yj_DitgQKoCROs^@VeIb2+ z_tD^&oHu4a=qH{Hl9cST*%$7L0T2vvD%RV!ec0P3z8*iO&wI9@xK_cgGZ~;rp?o1A z{bA%{{=r?Dnl0J+u1~osX(;1^BhOBlQ3P}DQoKQ<_eGT}nYey55mY}e2>x%V=VA4s zY??EJy4!+Y$`)qaQeO}%T{R5jG>}u77`wHVr)aKi)4P%$hAK0(9}rX-BjYV&!P@U( ztXI-)s^`Wx z_n)0R{aZYR zK)#U#LH+;bdMIMz;+`@QlAx?mw*cx6YCp@(!EqVpGY|B#1`Gcq&GYS{sGAa~L9P48 zpo62ZNf2x@De%4|4SNLzkuZn+n*tEB1Knj2=tn$! z_=?zD&~iU9LJyq_J5Yk+!(JnG0FwW(){B_oJ{_i8;SQ7CcwAnGk=s^M5|)==yve;~ zt7yHlCNC3G5sLVaN({4wbkL`9$2G7pXb{BJp~s38Jn#(r2(r(L6g(N*6qhQVW)xW= zxJ{rMASIRi`C%D0uQJA1p{4 zGLe>o9!EGwIw7Niatn6>vlkrk9~ATg5;uKo8=GaeHOE2fpq@af3%aQW>xypGDsy}( zGPD8O6v7_jtzXEJ!C#?zp(0ZQpo)TMjbez&q|;Mt)?xQ!lNlqho9bu&83a4WeN zmZ9pA2OTV?x>x*eukypTj*gM2+koc@d4kKugWSh0`fF}(b$lEP+L(ZRoD{~_Cq#%& z`M+0Rgnvp?2KRFaHv$S@9;{;I&8TOPo;?TS5*2j_zIEcFw_Pk1Tg z{sTE+bi^SeIFOPh2JI8bh20)pNP`K@iwlQBurv-CTanJ{scqz&M7cV8V^_t{n@M&;n&1owKrKsw(e8mbf^o>j^ zmA`WeqYH3jNjD!X?2ugoJaR(2v=hcU^Su!-uG>zs_DzwG&Kmv)*LDXHO4-zIO>gI}v4`aa%>fZey zlxKe&Syv)g#r;%L9eflh^T~V@6--nh-A1zePzLEcdUhu`-RZF zA7fpW&V2!ff!`VR1B~}?Z-Ap;`S zDb$Q5aEId>htEWvwN=XsKZkpqYl*?ExaklVD5JgtL((cqm7#GPb8iAb<^mv*bQ!%d zc>Np$2WeS`2n3K0cvNCbPNoHbB1Vg1qR6-XXs*L;2eeU59=fkIYuBc032LsO++c-G*hV<=U^8P=s+)H!tjt;HBJc=7xUM!~>A{wq z$XfC25F&&X6d1?Sw#>@%+M`HG>YKc$Nyx0vAC=iHgvaWX1$JiDql7C9KGtr`R2r~D zg0-eQ!|l!T@81twuL!*$p3oRI#O3$=bb*H$4;LfLGVWx@lG{%%CRd`Q`9zg^z(`1_ z;($=u!^IeQ9J4(f;)N40j%=bD5Y7G=@G+(>UhTbi7uyD^@^5GIj^C0i!Y(ZNuoZo} z-*2W0MX{YSC>^_s;2L&Blq%z4pah$xTVqfmk9*e{YwP4YcTC^qmCK&SerQ{-BaJqD zr;|yN?`1;k01oAF2cy~%(85!Q`Ki(&LM1y|uh^)|<-0Wo-NVqyTyq=I_LX?{`h9=I+9 zL_L|j_eeU?=-r&6i-%y~bZK#aui+5m5Nm{uS+S>LiS-2+(z7bnTs{iHMkh5KT- zPQSZ$I$a(einy(}5W)D;EK9wn^e`=V{DQl#pdxBB* z&EVL91o4w@3l?7`8(A0_XEyWlsqq|US?PNs;6E!kkbW1-#(qJqxaW<>Xe&o&>K@~x z2cttn#FjrU=WT1zjh1w$`Zv}^fUqu(>D|Ab3FC?zrH2FX4%EP(|Q|(wGZ}#XFa6+bftQO5@upf8fB= z2Vc1uu4t&KsV%xU3#~OgA+tC?3!6Zu16^finP0w@uTL}q+{JAXD*DIarLJa#pVQ%zmP-ve1Oe8$d9T%JA~8EHS*)$x5f+zbEH_&?-JIFGISEDA9OqJO-C)hdVFt zp7Sk(F9xTQ`+AyGMf?K?=HGuph*cHz;xNunP#wy!t_OmGI0*w-37aR0z>{&C++|qb ztwT{weoIIZDKNw&hU!IZI5dW3mvkamlpYBo6L^^s=ZKpc!^1|3{_3<7ciNt zkLzaMv>1B!&S00@Yo zLXa%nX&c+;{YQoZbE{zttzHKEr0HuW^S*e0%2eru;8gh!V;}-VK-4TV%Ya{c@^KDVZ6@V@XE<-R^gPvh&f(2%3shE@T6g{9SkSW5*Y|2r#&p%+xrxnx(aOXQr zyk$?EIAJ{D&{G`V-)}ay{KT$JL{XWsHvyKsGVt7+A644lk3rfy#Kf3~|K3TE<0j5D^o5GV+FuZaM`^1ntfU?jt|p z=JnD%OqPrb{k}WP?bEx1;27{0r>cWDB54T39IxNnWl#u`4%!kL|; zmA{SHFMK(O1QzAn`?%W< z^4DoJ>K!J#3fU)WYHEmk1=9Mq1*l)>SFK8yD(ZFJ0)xfHKc5$eanfCwv@wYsS3GnG z0_-KrGI-n7RW5W_N=Acwn*R{eY4vT@+EalAr&iS4ag<~6&o-7lp+8qQkK8PYlZLLo9K z}Ogd9o{5Q|CC)5 zNOv)S`Y@ffp(;ZO{ftiLia{24w{c&p_~pLgm~4)YmK$>Vy1Ff|UsI54(Gro-2NFl{ zO~GY7bQ#k|M^+lA!;@)6vR^PQol^O`_w!Gf08ThQNw6=yirGMZNN-_X5?p7oWB2aW zz$M=1nrNIkb3e@h)3=YJCa#&cZHp=9jco|*ePQ}-yqy%A;BqN&aL}-@-~#LAgYBOr4I1yU40{T_B79L$FgAHvIdtAaG|Cl|jt>_t)+YpWMw zZZxAKpB?a-dW@1zHKJA7NhC%LJgzi%>`2pFhx3oYBj&qSXC_dqgaX6zU0Zi41nw61fgHv)SFbR*-^ zd+)`IsM#Pci(yzTowE=cK(}}Or{LG&!Su}q8SrHAY<&DEa0_6NG)@0Ra%ZX-&r{zi z%EyQiw6r~k^XeWW3^xK-Nw^a)uQHv5@If||y=8SCNbfT&c|y17F%)@RIrTMd&`v46 zckBbZ_?>2nlm=%l20?pQiO+=!9sy#OTLqaua;tsNJZH7X%Lx!8rqc+KABmXZwj|E%U_%FOJPH05B% zfJh82Aw@mL&a|d?OynKkg#j7$d|%74j4)JfH19U3b@Z-HzJ=cl52{=kV;;}kvZOry z8E2WK$$1Cs4rVR#Ka<~TW4(3bfG7L2WhQ1-$Vs2(&DY@D1kvE0OMZ|6Aq?mp&(B_Z6v$FlpZ$lfba z?+S1J#pe4xn~%1oC0h zDP)ErImYAT<3aV#Y+Ib(1}}uI6u+vcyNi0BZFTD*I0PmWzI-*!<C~-GkM-`bOM^g_x0ivM?CsScV)yHz4=K zfKAbBn|AkO9{fjKkNw;x-@3zz8PDS!5>{_^J*#Es7O!&itZ={3HND}7Mmh%z)0kUZ zCO2CT=nYfp>{e8=j5Siea%5TLC4uS_Ws2d=$vbs)gh#b=Szc|_9FDraPfu>JSm7I= zhhpn%J*EiR;1|zYKE_1~tsVc;ADwq)v-s)@v47Q9G<0d5g5{j&@77HI-mp?JIF-3; zZ52fv0SX&S?|!aDtAvww3TP~93y z@(RVxF2H^eG=B1O+n+DAd^`{*Zz(r!22uNyt&|+g!6TM^(=k#Ygpx26;8Kf3kjP7L1}a;EJxn|JSCV!)w9?hv3lbh*Bmyaa(TOj z%2s(u|Ib{rx91ab?=0f>eeZ;v0LM_R>+`xDap(lH)xY!dZA4C%lm4@Mi(}S&!c56} z<_&Rs-aIrC*=Z~K^A=k=Q(2#!Mby)`CKYmP3TyewZc-Pp-uJ@!oBc3r7cDnRkh!#D zB@YyZ#_IN{@dz}(mD7mTIC)aA&Up1Y4Timf=AWEz3Powg(qDqC11o(+$FgQEqJW8S6zEpUvpHX_75phdo4Sm~jcZVLH|xVH&HTQDgp{|l(4i4S26Ecv0mh~xtUrG>#SJK0u`JbM>iKR@Z)7ENIn(^!thO$ar}@nj zjjB%sM1rL*Ce}f{927c>f1r}GP4YjQAdXTj&`=P94Trb$ibM+mRf`LQ zFV7)$B5s4E1N+&ZbS?S%S{W6Cjr~^{76pu8sj#DAU-wTDMjf`2le{%bIVFG;OMiLF z2|?ykarYryMHqwkN?eZag=Fex>on>g$i6lpTP!z-$CT%&`u^)sH=UWBa=E}ms;Rg{ zwczkCNIz!Z=x9vikCvw9Q+WNr60gpJp&Ef2Nc$=ZU{J_L0tW{NRahG~Aa1Y3RAT7M zilgm1^RGZBcQk(2ds6FgvkEVMUR>A@&LiW*4s!9YR_wGBP51Ss#@?ck47;SHWd3W$ z{vjx3IH%CMbo!m>L*jHqToKYFcp7bP}#u@zsr$yoZZ1!8C^1D1mPA&GkH!uh!XXSAV6{rUb!g_67b&l}BRqCz*aG?QQMb>Fpj zO!WIhzjyzp1<(u`m07l|1ndvPl(-`cnpUlF#l3q>*}NcGd$>eZYmCg(sI z+H<7ll|<#-QP4H#~;)V5lxyzin(i72nL`=k&%cG z42nWwN0~c=8L(3&Bkc6_^pJpYz)$SeD>X6`=F!RB7{3~uXP+X?KYo>V8ldx4|qu4)quCdi!W!=dtWy)*KL6sGeNnL7Qzjqw#%JvI5 zB+gXwUZ43Cyx&>7Q^C#(gz$;32fUod6gYspeW#>^)#v?tV^o|bE$`kbYimb{iEbvO zCw2y4@3jR~tVIfyx|a9UOLZlUT~i(75E7DQc)p^WjJ3 zqAb41X(X4(YKhAyp(xOU@@+kc$?q3dsmTv5&Mej z0MvY+D;FygZn=Vmf-(1gs0(lH_cr!y!tse2;b0c~iLKs=e2W?`6UIOy*%2IXC*ZK? zGA1)AKKm5`bW5o4>FQiTmZ6px^=wXQD^#^xY5#~VwHl0~)1c}3Z~D3P(Zr%BrBP9C06N#~l|RAK%s5_nzq@q^HnWwT>V^2S%fm zEmM%6?>-!V8spQsgoVS2`3Amr;xF1Bx$Zd#8_l@!uGKfMwVoD z%ahmR8&dMb4FhW3s85z(hI_eM;eisy~Q+}%|qyoZEh z0g&Vg#x9iZ>1Uzz{QLI3vnj(iLFdvlOk*@R_8jAu0}8b6x*M!!i@wx=MU?dV{^{PJ z90qj5V}t@xQGTV)rlii0$Sto2XO`6z?A;IEo_PC^)r#labLsaa z8p*&qS82)CCdqmgW5gfHMvtSRbdAgx%4Z;c_kN)RfrvM8(B+}LAYq}77ydFsh%Wu` zninLaRWS=4EiUiP_d|j`Oa}O%#nBYTOmKF>uH}tBefl)1S>V81f+@+Jm@!d%2~<7N z9HXl;;?6_Z2$4Ysq(A}|SB%(6PSm}bBe(4TilO}FmO4QM3+zyDuvvYsXM1eJ&vNTj zMr!xo*EQL%mZ3j{!IKW!`sc6Swp*O#U(x$#qu(5D{jGe*LHfAYr+Hs$+)uH6aCHOj z>W9lJC#XG;&yvy~U6+o16&Ka(=dfLu=4^o)#ZG2VZ3)tr{5depvI6Ws3D{_iWzTA_ zN9KOe)3fy0pP7a|&Zsx?!F|IhODU8sy#5l(4kwg`OH?YXgpxdlS$SC5rp3+eF^IBc zBxwKx?|C5fN08X(AxfNtzsc?k5F+EXVsXq}C-@?!-Xa1ny?+5_hvJb!Nuu#&YL@tw zP)OshiOIG-N{jiJwK|^v<)_4-B9CCdL%66swf{zf}=}<=EeO z8(ri1oJW=7AEczbpjl=Wv3vf8MABvOIU8T5vCxs-5SXo_rNzNLQI$;HQ|6Xy&`Y2m z{89V$XImc_m7k^hSM*blinYLzkWjw!Nkn$bulSE zj3~mGI#0Hq*PRmfvJ~Ne6vaZXnMDI;n^if|!0i#G7_cD#UXtCyWsJFM9OVyb6fSSxyTbJ>N0zEPE57|` z+@r=Q8qN#|UPxAgBcC+fBI6^fYo+#DWxeBu>+a3IPFKiRO3%KVtg1wGVZY*BTy!lN z>7};ne$!*3Pngc+6Iqk`WO5<>&TGb=Rwh%ybGDY-^}~`c?M)sL|w6$Bj`F2ZM=&4EPh24pTwhNAHEd?(RNv>Qr)@ zcn$Ry5dKg(sGJrLTKaY0`_C|r8Lc|V9+WJ()U4GJP1glC6PF;Q^rs3>R-@kw7aS!T zlRmS<(UE?7c6P&&jik{=$R_TaqHhsr0!-)j57tP7@rmS)SSn*;mlt@RC&5eJ)m0pI zEh>=Gq$(wdPE|u3eSG2 zBumnRjqJV=QfCO|x%O1fi$J!bJx356Da{zq>uHcp+cq$;$qiAp2 z-Q+K9bKPHw-NPR$^-{hZuc?wi9N2Lr9N=E&6ASLG(lzL6#SwUFpyoQ6Ne-{Cd<+k) z_|={}1A@owW|EoHi6Z;02;?6}_Ag4JhXtvA5D_t9VikqJUVv~b$@nUg#gj?8V}rFM zg5lhRBOK&SAEo=|7}09;0g3YMCMDcgUsffcWRjAS7Z9jW`kg~1k=izP*Wdx2>Dz!U z-=}&T$ZVVpFML{7PHAv&ncK3*+}l79St2G=9vGM3B$H`t<-NbQC}9k-u=k(&`x`F> z1BxMvAlMR{izkpa6=C6ZKA;1LfV%FK`;T5Xl?#?A%WQdD<3(9odQ`B zceKRby^@9Gd19iU)0M=XWENM3c{;T8H{%WOKI+MQj%dcnG7JIH> z+b$DnCu9HdoviQ-o8AOs~asubnCG+UpykIrSkW2UfGZJX+wv4_t8=k{4U0)KqFa zxlbYq!pxwt^&UnWJuW@Gng5YAtIit*KoIn3WY8n-1?@qbms;ZO++KbBjuGfR;p}2An(IO?a$cCe2A$kc$DA9Nba$2htXlj_TJ{4 z+krM-yyLzrS5or_+faq?DCbUNUP*W3eS^i$`0u|t`+BwsFXM_^yYlmh$zYOm^Tj@C zj@gQlTVBn6Yxui~3p41*AlM6ICg~dZc|3jo+z-HtUaoQWn{LcVa(nN=LsExpVBCSG zAjp(Rs}Hn>S~${6CGq+z3C%<fV_*DTS3P`SB}a}Dw24D7N6~-Z)~4ffRztplUPpi6WS73*Z0>c# z40W*qyR#cO<2H|6R%&=0?#<&!`-p2D`zo26k$%6Y1}b8ty8qCIE#J-e{Gx5nYT9Qd z(-q5i1i_g9BsG zKi8H-soyRh9Ugu=9Iw?9W5~ndU;I5@ZKtjH7V(7D1)Ue#zq@80<9~G0E`gcexPI@V zi{D!Ll`Td+y}gdEu8LXh{ey!TVPA1JaEoAVd;H8w4*#_&-6|2={qeFgE*1Qf!`~=T zj;HEup>cbdPf*kOLiN^lcniG-u7>Y_Ca2zT;eU~Dk(Fh0T3i6XXBZ7UMNm+%xTNG` zf4{F{YRR}m#5Ye_D2OLjnWPr3UyImoxGle+piG(u9~XNtqpbyQQ8}fFziJLs(0`zA zbHq>@fdIb%4eslA?}Dn$!kG`#ad^t0MfFxIXk+aAq9*TPvi-&>{^;TIagbD;+d z$35EAtoCaY(}u1od9KY7gpz&;g%;=*qen@Ksa0lqhIj7ykDfTjAKmKZmd!;c(z8A1 zUd$rPjPhW6bxX@STG~Lptm`XiX$K}IuE9waDg|sjA?IPWOY_r86eNyNVN})CUB!?G zlwnXT6C0Q7iqC`AabiXe`gd<&76Y&lm_$;adg?>Pz_xE~LZhOt?nb3B_G+`d*OlJh z$XMVw2?1!n+voT8CG7Gp(Kg(Yqr58X4`qzsU)0Lc-Q9b8#9I*j8;&G^Ye&JH@<-Dr zs%N~}BI_vzsx7s+n9L2V3Eg@GatXW;x=S4Mn2RF>W7Uvt``KZ)uA06BX&-ruPwy^+ zfd{4oh=E9QRnt=(`YMoJ2ckfmlU>)pnWN~UykVfKsw(8hHU+(q&p^5peC-+)&|lm3 z-K_9u($m}Y`pGXNW8)<4O>AtS-Wl!f?Y~a-CbYI{<0y`vdG<^m*HAhh<-gYGfaiMu zwe-x)vEt1dTdpf6m*~rbHW>H;lJ|5(=aPZsbI$ z&N_J)>iEd*ht|9mIrhb-@={M;a`J(>ALv2l<>h^fXWi4&qxWrQW`^_;GBPs4(-6K+ z(fPPR=z;dbDnWJ*Nq(W~+QF9N967QxNi-aX1kl9@oRIG-v5ZwdawIh^%^!88nb>AN z0fA*?PzhVidT&GO_@{XH4xRo5Auzg9Ca{Z4%DuRpr z_?e&zzMuR`(^xJ#61yHAi6BAdzx?Ytf=AY4&-P*fy<1V}i!|-~ug6@BSQ>}Wi~%Qu zdu7k@<}C^?DiH|wM995H?&qnjNy0K`7rj5Lza>@iy4jn1T1M-P1<(cqbUMYzWF9Zt zE}-||L*L>b3G(k41N*U=pHlsVsKq(ZyER~~d=UGyI|5s_37gSCP5$Ba9fhs$-C+KT z0|7Qq9|eOR4A_@ViYtb&RAuUBVZEG!1>CCyi7>RII}W}KpJH6&L(;OS=;-rq@VDde z3=%xL9%8QIiJUS(qaf|?9`%3%4z&)E{6|Erub7`Xg2avVqoA>x_5;*<%z!m^c>{bP z!*!uiGJSc2gBTBx4Ge5Y$YaK$CTv?X0E^2l))u%tGL;C{r-b?)x$RA4(dXRUM$qSO zfeMWH%|Tw)m)(yJ9ho0J&inT5`vRm04Q|o-DDS{*OP>2cpxF<3x!aRH^zfmvoRQ&SEQIUEWB=P+4|w7v{^ z_JZ>c*&;z2$q_b)eg_4OTB20+7W?AM*q8)$8rZh@l8jMCA5`?fd!&9Oiur&sXEF&90F;EVE?2GJPeodrEQ`G%68b92*hq7cD^KFkh$j!3c( zvIz>xTMkGjF6kh;u3)QJY0CO|GxAh6~icG?oWFrhIZD=SM|98*S!VLQC5Np}wh{9w`+ zHw8xJevSh*)0nT9?{aCt^2_UNY*6q&#$;JV}7-q0qK*z5z`(G&dvtV@$82($~gJH<(FBixZj%S0}{6 zK)Ep6D8VM}%HRXAheG%^v<-Mbz=Lt#*3Rtv=f9952Twc+j7p03eFV$_;Ld1#S&s=k zcrzmU^l{Rk`t<454Gx8$_*%e~;C2^@Fb^ePbX-Gy{Z9Z+R4k%a46s6?`T)QxnD>6n45oe1qts8G-zH(t21rxiQ;v{SKtJ$>RTFV_A|fJ$xA^oJ0jmGk z+aVQsP%`@$=SAU%5j%5bIq!z$&6T1}4Gjue?Ok>}@IQc(NEEpwa!vxB9xpz}fl?HX z@w|2Zf5Uio7tJ{*C+!FtuikN_^Y_}vugQ&_gXtnS9n0RcOa%6TvaTOFGHo)NVD5X7 z-Ygjz8A=>x*)8wJ*uMJ8Y`v`YeaJG7KXDg^J_;#K;nlMH_s4wgU^j*n^=1K_F+r|rpJV@v<=q>Qpe~Hfa8aFtw+g^`VI)zOYELX*EkN0*S@8*L?w3Shky#LG{nQBYHC~+h)LnATXa6u*;3Y++N7&)UG};2=edD%A;46fN=7CF;uby% z=%31f9T}qWQl^-hiGD&qJSt>^un{40PBdB}eL%^8^{S<-yWHp6wN=>YMDYu;HCQ*? zWSDVanMOO;zkHdTnMn_q8jLUD<>NEOS*5xLWc~^)#y<(er73x{c-fG07;N$1V91fswV5y$9x9i?_t3byKSZ(sP zkzzqf@NsCU8bv=mM_0X`f1`pg5C0$B2|^TAfGJR4*oySRaZ=}>%CbzFkt8pMmKKvM z{!dv9Q~V!6gp41uT#Zo*KT&lT^GTQW)LQB_ImXiHd1zsqJTRHahGB zGi6!CisSF^^uohDiv0e?@6W45oa?qL$^(gor%Odfso>PKgcjV$v6yj=4A+zPXCH%R zoV1pr%P|BAJib2i1qrtvM_Tyyj!u2)g0ue32rdgtOCr)S%FEbGgzJa~#MX!kSm`kI z56duc1!tjgI1BEotdy+EIY-BXsV!s{sbx3ntI_tX*qPa4$ALJUo8k%AaSy(9p1uvI zNGftVV0Gc-BpOttVJ1th4J6@{^%6(rYhhvW1?SkZ#@_Ct_nrcHtnX~aQR+4$ZJ>Ed zWFR=P0#l$d=HUh0Guu032TO&Jf&9Tdcl2Pd64S7s z2k%Z2&nPLJLa&l!xAAN31zArdmtA+i(3K_Dc7 z-C=K2-Ta&kY9b8h8#X6M12}@RQC2Xry+pnpte%kyu_ESCM#je0VjMY=b#lLV8$7;| zkkBv?w!aB@`HBN%+9O0$C|EHOh4ALk=u;6sn5ZS5`O{G@AVDBwIegF?E`r#J(<41S zon-HghmzysSP)Bb-03{V;LuQrmcrrQrKPowsHUJV*&j7?_}V6|EDu;GdmHV^0}Vkkaug+1wQ zBgDWO&xuUb0j{81V`vbtc?AOt8FoW*OmYh1>d*wqOu9ti%Qe^C_ooI-zAv^DfY4)I zm_oP@T*`hAQ0SxGMSI|wzv8ABKhfXdTa*72FXNFP5rx%(uS!T)B(B+JiC9I@7Z9<} zldr8uMqQ*ZN3*LlHm!CQ#&4#i_~J;?>jsvy?c&#U6eK^U$P|~XNAT)f`y73dyX)VF zC`gkAncOP2zuODze0C_-Bp>bPq{jlCC|=1P>zkIX zk$H+|Pqg(UTO+%MlKW(a9+Wz{uzKbPehSVNpFV!9B5V?hAvD~wf+aiF1@OlgtsMkR z2ZGuNdoe~I1T0iMBiAL~pMo*k;K&G$##iDU{7b-ehClZ|f;tnM&pY+0svzs_0$q$LtzP$mYGlNK0o(LDe>f5kA@Dk3*K*6rO||LPzE+ za7v4El@s6RmG+`EdWM7qQkz{kr7=#%wfbJ$Sd_)`o0a!Ge@yi@i8Ad*)-nC{>mviS z(JP{%Un()@s0P5F)l!L}NQ$pD(f&Lid$Hm4XH1etpo-+t(5pw*a?aJYrnk4e{q(9w zHcbZ`UcZ<_5)}PnaDHI%SD!=Wf_UUkO!VGjkM^@X)I{8!)>=9`=0Cyt!mvgBLA$tDIkS9FQsdde{PPof>9x)X)UJJ3&IudDz|>e#~$%2c>9%?^plR;nb<^hYuf)l^I5z z?*Z|4^!{WV0xo4{*h(m(&^2l4!8evnIt#Mlp zq1jM`9axoR#4yad5ultB>PkVKk=D2i*o@f`SOOzv1)V>EA&|xn1RSjG4Va;Wj+^Lr zXsz$MrPII`vI)Tki1HVlVFKMv8czOeJHmkKTITc)y*e`f^3OS0YomDkE{%}d;cUJCD&~PMN%99OKl)Q4jSIoVr%xmb3oL- zXCI2X5=fJfa~#M@N(q%ht2x|ApaxwB)9W;qNOzFKNW~!9rNv2%4L8=2yA7euVQ-X0 z;Yk<~R5v&0>L#GlBqN^rbndRj?-8{x>~LZKQE9ykM-s4!D5xco3Xy3|SnhV?K$eL^ z2WkC7)xx^(+;-A70qhEct`+XP!D1XcrWU11v|V9gA-U%`>{@b7_Ty-%M*`ga^#WlG z&$Qhor{eMBEF@rqDE#!gaHITJHZl;ez1`?-#b!8y#_oBed!YnaB$m?}gf~oab3}1U z1dd`FwrZ&Lq1qxFJR%}RjqIQlB>kq(1K>eI#_keqI zjISlVv=uL6jRCw1k}Vz!0cP*l^|CCnr|Ms@UaOXeNRX@m%u+-Av$Tb%nGTZ<^$NZ& zLk*&?UenSt?Q8j3rY{Y6H?}83v}!dFu^fieTQU6^MTMxv%e4r>@D?j*t-;b_k#yn$ zqJz8$ZCFv_VHml0=nxGK>bnmg-arDw`+M&9@1kI0pNi#r*2aeL?tpr~e(t-CItT}^ z`Hx?gR#q6?eeWw1mOEStZ|Xfi2SOG_VIqu2DSHGV`o zOD1pH^7*e#{D_;Z+I(r%iRIcsS+AgS8|}!w{p9D7l`WH?kG9^`zK_D|-my&N5Vg$}Og#J)n{o_`ca3^^H-jg$UH@J|}y{xgoG=F-5`#>=?+4soNPX zyr6>-kr8wmQb@acynSpnI?$%}M4=c-QV7`cp98kkDYjn>lEZk@{5f>4SBFyB1} zWtDlUn2KgrJCY#ad;08(j(={h-gGVfd6v<6f84a4kz@INfxR06ndNob#u}dfP$ZJj zNT#W^Sa<36f#S*Qqrz1sW*mw1hl>qrU!Y}A+NLh@1l&}PIm3L6{S zKb59k4DX-aE7q{TYLw_BFd~j$^7K&M<8+XoWQn!GOfJw;kgMKy8FPG~XMFm zgtP)`?84NB2%2oYBf#oB%SpjrCeYtGYp^ZrH|}n9`rTUWR-kpHityG+7%@QPf&IPp??-eIwR*(@L=usE06Er*Q*gogi`c5Ds%pQjsffa{g&~crN!|@> z9Nh}#z|~t6@gFuFIbkj=^by zf8lhq0{j@kiyOZ;vmwbI_9;9N8IwUG%*-8`pE|PC3K`bT!}f`7-#H&ZPMC}jFp~m;0=fjz@0Zz zSYnafb^aCtu;r9IuoZk_zJUXNg+wqMLS&N|=Z-){1c>Mc^i?Vd|& z4!T7{*Gw|ngfUNE&vJ!d)zoye$r{tvG!?a*VppNd(mr_-ETe75-2AUnjI?q6#Tf)B z4rscu%1W+-B!s0mMEFCPA`n)7B3lp5%$Z+TB68}P1fR_Q?rW#3r?;MoDa~aJBzV!y z4PR_f5HW4qq^+k{vue+ir>G}*1qExY3JPzAd*_)Ozf3;p$0F+EeE#~lYBC~U0iGUm=`~7l9VF1I!r0eLW*G>ek-m^2-r_ZRYOrr(W=*fP) ztn7CKAmGHeAF#C#fR>&KI<*RXg%8y-&7s4k@Y4B;}awI&5Wix7Qq%XDsg2&~haY4-b;BL)M2ngHKSNYNxLi*h0Bv69Rrm`ep-2H0rbfT z{E{dT598)EAuM1p@gS<5`U}1Q+QC&I7ot7|izLh_1(;O_O%AF&qMwJ%8v|c~GvIJq z%f|K!VKbT|2&^4WP&9lYTi4XoOg1b+%)1dDKAj-fy~(q@LN}ktm!XrJgLr;VaagBq zj4tPuwf&n@=@}RvT?q(qbz|$_jNGI3<44Sg_o=M(Wk{Ev8uyiI75>lv zm;$!HIFO>AVU7$7`96%|ajKaC{eeH{6vHY)D-jePsDL7XPq#o$0?;}p#*lsnWB`|{ zX7C)*gx-F(oA_>Ax+J&l(oe8)f`}Frl-(7O+&9rr%?w@9=A0<iKmO%RJ!$uym5PN@KBOas}QW+)bvh1OL$h6fX-btQ)n1S_Kow$Ry-m9cB9n* zj*ql^_ksX{Af4`F+XMH1=qz4Y%{o-rgZX^Xp4m3c1ucoTv9W#810d&(TTALJQV_dA zOAU;V(;onjK+DLcIX(~55$FyGT#w|=9hrkc^x;E?U^AzRN|W?)60rlyCc<(Mq2SlA zgXn-s)&35IsDFICo|xhV2ls;}*QzHYVlg5WF(2UqIx&eySGo7@-3U;ZNUJ`6*gj#7 zg)&+qb-v#WRZGGg4Ybq9s>{AXy6+7guKTxkeGe#egf;E;TMmj{7iU1Z&xolRi+Zp6lRjLSfRWssNw z%Alpq#namZ=L2Nvh&xbY9XfF$zSk27JP1vM1q9Hvj0_!Z?Pm}WGlMolcKd>)-W4#% zi2veV0ZU1Iq#%m{Vh+K5ex}?l^GQmFWKiNL^ zSq1k1j186Mv19&?Rs{yl5MW_cb_@clr2+6x#2*SWI#{uha7Ov^{rfN=!aH9SW?=y2y7-a!w*b{KF87>n z*Eiv-yFqULhWn(@8tH2^nWh}$$7DLZH%jJ0KK-orujB3405FL=Z+UZeFR}%&iDk}o zg1Gmq@hm^OZ8zMt3AZvOW9<81S&Tl zl>1+N&;Ql@T}nj|LsE#-;@I2mrCrEJP@G_N(Q{Zb*eBWys3B?vWyMvUdWyRDrpnsn z5}rHIm;pUo)luR*jZauB8_{Tm1}&&jNEIkpe1Tdy;+)EEhZDAQU-lHry@+<%TfGC< zKGK5Rt@0C~tzO4}C_z$${SJV49OMts7bs%n9H>nsJAa1bhz%1;BO(-l+!F=hb<&cG zP6V8t-p;?bejFaY```f`(2uuvdAJViqq!XeqoeocA86k%hDm=sMj+szoUC~%*k~(m za;`TuYo`j%YGjGb$gB{3yJV$ZkfNi~28K4h!(CJ6}%Q1+K})QGtc0tRV4 z#Q}~}5(y*rhk(gj{dy4G1QZQivu(xA+R9P^@_4cnZ*#eOdd@&_y%Fz-LdXPadI=>r z$Bsi0*qsy~^$fI4(=Lfbo*(|9mDLU(4Ng3sS+GzfN&)5?YtLc^yF85Wjt!1-lGyjd z92ZpufD#NLPeaK>loxn%ilJ;O5ana=1+04sd;^jpD(@!pK4MO1WSDMduDg#k)+*b>p^|h`u1Q2|bLm6LAJd712-NnovV2;RpB}tyD!} zmr+f;W4Y(I9jFx&)jRlO8YGn{h#-n#>_>4qNTHC2n23gbCZ|dNJQoL!7$j>2Xx)Go z-}xvHo&FH#4L|~jZ>Tzunv{NsXan8=)^+;%n*Crpq9^+<{oakci&2zRfLH)HkZxa? zZ=wPcx-{?p9&SHSx5kT|A#e?D;lSt5%`pG)KvM>Eqt;@ZK@;N}U}qwP#^Ggfih-JM z24TB@V&aIat2o45q-ew82iovWraeGtT$4)VPBi@mRh>G8lpb9*$sH2_i=H7~;lyBr z-Uz>mySWo%6u|$`X6s#3Or?6b98Lh&JjG*`ga{Ki zmDtpg(jHt9)eTsp02C*25;ZOldUS{y00iU{lPH`rc3pO3&m3}N z4z0M^T!?jx`ga|mjP!}xy1KE5Ny910BoO!5T;PhHk^$*JLs4grzm_Dit0bphX?wPw zz?CakKw=sS9i;37cn?=53^-mrc>p`PgI>9qqmT%;1UbK1sEuGTONjae}86h(%a zWsz=a*jIH&a!uLs9n022_JcYBhr&l9PVr=sT7N{Txdo1J0CT>0FaGcb5bB5Xh%^UT zS`!H7+hpd1inT{tGvY^n4pszEbhUVqD*#5rZ{7?pDv}_~GjgevlpTmC=(BuvbMH0i zC2peZ#o`29_~)pj6|lQEZ(fk*P$0~pqpjPQVW7&@_Oqm}L53lWs`T395$G%%tvIEn zxA;{hGwgXp$P^r_mll3G;!qRMGi;JXp%n)wo#@YNMU3Ytl+`mThYlXATueggfpYz7 zaIk!~p2^$Pdqlq$lXaKp4s@x&6j5z;dVJjk-krqv8J@EK| zI0Rrr!bC@saOdD-9)z@;BoQu%YsfwmCHWOgtl6Xkt80YXpuVMXgmaAB1$K{Z&JUSF2iDMRm_R(x7V6P zi+h~KaE7DCci)fj-+1!vf#SDs9g2^=lEuxJ#@Anq(WzJ_EBr2#^02ikg zyKC1AYq7@yTBC1%Z~^jIs!4*fq7+j(AbIW8cz^zE#JSyafAD&FLk+RbN6UEh>t7t^ z@GPD!W7@sxNMK(tlBr8jdK_9)oJBZ+0fYcR_qD)c*5nmlr+?*u~57eO) zG`cx9%l>$HVQ$7gRCT3eVIk zXf34k0YHY?$S)8I!Hf(N`vd6Vh{zN|+gS9}Q3=_;6CxTw)IwywCDQm?vR;p+HBPK_ zj7O%^F9rL^07NyUkf?cyA2)3GLXC4zqxd5z`W{qkDR$&kMMWVu|3v}2_XOqz;Q&JO z#8PDj*nq5XoUmk&5Rtp)zV4*skcxx=*^ri;F+emnUk^ZCg}}VxfTyPv#BJ7vCrS1S zt^D@wA0j5lpb}%;S`Unip!`dHmZYNq#3*XL4VyQs+S%*u1@Oa4u5Ct-bT2tJC;?mN7oQZ%klHbVU z(-8d=y|v|o1bLva?zjvB-Lk)b4nkvM=mqn<)fB+6XLP4Nd|6z)3V}s^rIC>l8HQ9j zKeGx4W97o6!#tYCp*$u$4Z4L>-hBK19ddz`0u7awj?1xjUz|t5cnjhRR6_y4MmZHj z4&-($Lmg84H}*o*^195;VQBd-V(o`dA&O&^+Q>n{0Nz0?g|k0VwW%k`)ZsQ=4GSA7 z>@c2aYGaZ&-1#qrrZo;@a%yWcbh_5dyM#g+tO>5@;K73l`Dn<&B4Ckr-G!wESr`5T z4M-{A{E`2II@i2^3}r)d``NmeFSpCeZbf~GpF(c)5zz?!0E|A+1c(x8pP3nW6VmDl zKWl-DUGhQKh+eK;$DJb+xS9c!iWzKgti{%|vUc*>p)_5aVuK0>OrlerXJV-&a#^Hv3TB{FsJR^)MdRS&CQEd95ppvcJX za)xyBUOAweu3!y=6d}_2umhzfC568~kl!u#tiv|NuKjPT=lO+%UcY@Wv4>oL|F4e} z$P!w69r2cH`}sMauO@H)-<8%2{;$%`Hm2%2isKg(6cC|cydWH2oxrpU1k4srsM|&0 zD$>Hh5(^0!84qO$Nllo5LZrx}L%5EvkuDc&DA^#vi8lj5hS%o62q**YgkbWNUv*kcIh;au z^|P3kll;+eg%muhWcv`pN}y_()6F#ZHamSJJCF%a-`No75&V7;9g%J$Zk7_91($Lc z-geRj|BK+i-DszdQ9?hrQN&TVKi1FC!PL?z#1y%1vn?wKXf+_H#>UXa-_=-DE*P>K z0gbfIKsQa>oRnG5nTQ%T$lF9yj<#}ecsQe{i6K+q`;3dpv@Zp@gG#>1nlTHn#N|&2 z3)r-DsYhJWywc6v)+n?5%@>lcC5W3y=@)l%HPm2T`HKMozTjBlXT!r&8V3v=cQV1Q zVw!_0u|WA>%c~?>Q&QzSmwUMvijzvp0P={8p4f5zY4D?bHm%l%MukXI5rz03yyqz# zB|IJy=ZmjR0E&f~rgX=lyfZl1^7^I+%r%Td4<)M)81_cAtyrWP^$H_n4F&^kUi-54 z^qxgT^x_qy2xS5WJZpciTb08K`9PmilnkPeK}!Xlk{6XAaR-Wcqe^v>0BB|Ba<9I@ znea`J_Ow!eO8TsFqe$g;Bc;hz9a9w#oJehblQ_ZX&y9kzG$a zK|k0ihG@v^re3yI_MINGQa0`7#ORHng|W$@5@gbhNGF5>MuhzJFQ+o;o#zx)>bhfn zYK-_NDq(5ywrhCaVkXco4hNmDHr@KV%Sq%$sJAjEtpZ z=?N_pL`$C|MnQzIqHD^Q2h76j&5S@4O|%YVs&u&q^5rCw|7whRP^X8Y-JG4R{5>2< z53Qr|p&t{!k#Vg&>v$XsL`iAsq2BS4hYw-UKjTwa}HE$?x5dPW^{1gE6bz}J@51-1l_bQc(+ rCv9{ywim2?gffy{v}7lnBq5uGWRt!3=6;;l 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 HOnv?@=mYQ8 literal 0 HcmV?d00001 diff --git a/static/img/tools/netsim-7.png b/static/img/tools/netsim-7.png new file mode 100644 index 0000000000000000000000000000000000000000..8be0afaa3a700f0938b6eeaf6c93a61db57cf7b2 GIT binary patch literal 7950 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 ML`RzvE3btA0mkQlTmS$7 literal 0 HcmV?d00001 diff --git a/static/img/tools/netsim-9.png b/static/img/tools/netsim-9.png new file mode 100644 index 0000000000000000000000000000000000000000..ce06b2625a8b5d9227d61ec9b0287fa8ce13caf3 GIT binary patch literal 33693 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
  • 0!^8^h_9h zL9)k^d^zsaA@UAUSNdXjf~6Ia9bTLwbFM`wi*6AO85f9(Iiy-eN9T5ZhTPI7VW0sV zD_`O#c?F_6-_v1%40u2L_Vko;?pW7g?_{_K^cp{TN0;hIBolf!ic7u#e#A-NKfio2 z0iIgj4(ADr3;CRGT9QtKtN<1Yj*+7S?#T}?M-X==m!I;6;hO@`%U=_Dg;=gF>x*Fy zGDS2JYAPIJSp{C?N>h^-m?;|MvXF!qiV0L3LPf#)#foV+jvU_%5CVP<;%d-JQd&(R z#~hJ3D-bPkLI&wRtff$BWDcpT=#X`WaBa5&Q^(fO^#s0@V&In+RqBa{pv%jUl(z~)9?mYijSt!G~D zj0WI4CgRjhpulnsy2-D4fWR5x<>@GJ7?J59bZR&eL3E=KbvSzubOtsVVsbX;kV^RnX07eS3M#HKviT~;nOYsuo303z;{Y1J}D8m5Ghzj0{ zJYCR1Xxn3ocLUZ2{@b@@4Q3gXmFp4v&zzMDgI$a@V)r--;c8QopFCkE6DvG;Fc}A+ z+qI;*gHlcvASp2=p}L2hj?x1*=_|OLrZ|Wihp^S7q9@TfW(b0meRl+o=gmBEM`pd@ z3NdDuPH4m?GjsS1ZvTD6v8wyjXuqMM;ZtX<#{IyR{?CdM*vEQ#HHS!;P*2#( z=dhRnAF%GqYkp}QKpUTqC^wp@*MB#gktG9fJ5@qsFnL?0cQ3lS(qN`)WwjMBwxX8W zKTrF>0u~aCN*= 2.0.0| +|Netcode for GameObjects|1.1.0 or later|com.unity.netcode.gameobjects >= 1.1.0| + +### Get started + +To get started with the Network Simulator: + +1. Add the following packages: + 1. Tools 1.1.0 or later + 2. Network for GameObjects 1.1.0 or later + 3. Unity Transport 2.0.0 or later +2. Add the NetworkSimulator Component to any GameObject that persisted across scenes. + +#### Trigger a network disconnect + +You can trigger a network disconnect in the Unity Editor with the Network Simulator component by setting the **Connection** to **Disconnected**. See the [Disconnect scenario](#disconnect-scenario) example. + +![](../static/img/tools/netsim-1.png) + +#### Trigger a lag spike + +You can trigger a simulated lag spike in the Unity Editor with the Network Simulator component by setting the **Duration of the lag spike (ms)**, then selecting **Trigger**. + +![](../static/img/tools/netsim-7.png) + +:::tip +**Tip**: You can trigger lag spikes through code with the `NetworkSimulator.TriggerLagSpike` API (without needing to write a Network Scenario). See the [Lag spike scenario](#lag-spike-scenario) example to learn how. +::: + +#### Use a Network Simulator Preset + +The Network Simulator tool comes packaged with configuration presets that simulate common network conditions, such as a home broadband connection or a mobile 3G connection. To use one of the configuration presets: + +1. Select the **NetworkSimulator** component from the **Hierarchy** tab. +2. Set the **Connection Preset** field to the configuration you want to use. \ + +![](../static/img/tools/netsim-3.png) + +#### Create a Network Simulator Preset + +The Network Simulator tool allows you to create any number of custom network configuration presets. To create a custom network configuration preset: + +1. Right-click on the **Assets** folder in the **Project** tab. +2. Select **Create** > **Multiplayer** > **NetworkSimulatorPresetAsset**. +3. Select the NetworkSimulatorPreset from the **Assets** folder. +4. Edit the parameters in the **Inspector** tab. The parameters allow you to set the name, description, packet delay, packet jitter, and packet loss (as a percentage and interval). + +![](../static/img/tools/netsim-11.png) + +To use a custom Network Simulator Preset: + +1. In the **Inspector** tab, set the **Connection Preset** to **Custom**. +2. Set the **Custom Preset** field to the preset asset you created. + +Once you select the custom preset asset, you can edit it live from the Inspector tab by adjusting the parameters. + +#### Use a Network Scenario + +The Network Simulator tool supports NetworkScenarios. A NetworkScenario is a way to script how you want to affect the network conditions at runtime. They allow you to change parameters and presets cyclicly or at random. + +It comes packaged with a couple network scenarios presets: + +* [Connections Cycle](#connections-cycle) allows you to cycle through network configurations. +* [Random Connections Swap](#random-connections-swap) allows you to swap through network configurations at random. + +:::note +**Note**: You can also [create custom network scenarios](#create-a-network-simulator-preset). +::: + +To use a network scenario: + +1. Select the **NetworkSimulator** component from the **Hierarchy** tab. +2. Under Network Scenarios in the Inspector tab, set the **Scenario** field to the network scenario you want to use. \ + +![](../static/img/tools/netsim-12.png) + +:::tip +**Tip**: You can control whether the Network Scenario runs automatically by toggling the **Auto Run Scenario** checkbox. You can also set this option dynamically via code. + +![](../static/img/tools/netsim-2.png) +::: + +##### **Connections Cycle** + +The **Connections Cycle** Network Scenario allows you to cycle through different network conditions at specific intervals. By default, it includes one cycle that’s set to None. To configure the Connection Cycle: + +1. From the Inspector tab, expand the **Network Scenarios** > **Configurations** section. + +![](../static/img/tools/netsim-15.png) + +2. Set the first **Connection Preset** to a built-in preset or a custom preset. \ + +![](../static/img/tools/netsim-13.png) + +3. Set the **Change Interval Milliseconds** field to the time to wait before switching to the next preset. \ + +![](../static/img/tools/netsim-8.png) + +4. Select the **plus (+)** symbol to add another cycle. \ + +![](../static/img/tools/netsim-14.png) + +5. Configure the next cycle as you see fit. \ + +![](../static/img/tools/netsim-4.png) + +The Connections Cycle scenario cycles through the configurations list at the **Change Interval** until you use the **Pause** button to pause the connection cycling. + +##### **Random Connections Swap** + +The **Random Connections Swap** Network Scenario allows you to specify a set of network configuration presets to swap through at random. By default, it includes one cycle that’s set to None. To configure the Random Connection Swap: + +1. From the Inspector tab, expand the **Network Scenarios** > **Configurations** section. \ + +![](../static/img/tools/netsim-6.png) + +2. Set the **Class Preset** to a built-in preset or a custom preset. \ + +![](../static/img/tools/netsim-10.png) + +3. Select the **plus (+)** symbol to add another configuration. \ + +![](../static/img/tools/netsim-5.png) + +4. Configure the configuration as you see fit. \ + +![](../static/img/tools/netsim-9.png) + \ + +The Random Connections Swap scenario selects one of configurations from the list at random at the **Change Interval** until you use the **Pause** button to pause the connection cycling. + +### Network types + +A network type is the general state of a user’s network connection. This section contains the descriptions of the available Network Simulator preset configurations. These configuration presets fall into five categories: + +* [Home broadband connections](#home-broadband-connections) +* [Poor quality mobile connections](#poor-quality-mobile-connections) +* [Medium quality mobile connections](#medium-quality-mobile-connections) +* [Decent quality mobile connections](#decent-quality-mobile-connections) +* [Good quality mobile connections](#good-quality-mobile-connections) + +#### Home broadband connections + +A typical home broadband connection preset represents common connections from desktops, console platforms, and some mobile devices. + +The [Home Broadband](#home-broadband) Network Simulator presets simulates a good-quality mobile connection + +#### Poor-quality mobile connections + +A poor-quality mobile connection preset represents an extremely poor connection, entirely unsuitable for synchronous multiplayer gaming due to exceptionally [high ping](#latency). However, it might work for some turn-based games. + +The following Network Simulator presets simulate a poor-quality mobile connection: + +* [Mobile 2G](#mobile-2g) +* [Mobile 2.5G](#mobile-25g) +* [Mobile 2.75G](#mobile-275g) +* [Mobile 3G](#mobile-3g) + +#### Medium-quality mobile connections + +A medium-quality mobile connection preset represents the minimum supported mobile connection for synchronous gameplay. Expect [high pings](#latency), [jitter](#jitter), stuttering, and [packet loss](#packet-loss). + +The [Mobile 3.5G](#mobile-35g) Network Simulator presets simulates a medium-quality mobile connection. + +#### Decent-quality mobile connections + +A decent-quality mobile connection preset represents a suitable network for synchronous multiplayer. However, the [ping](#latency) and overall connection quality and stability might result in poor player experience due to [packet drops](#packet-loss). Players might drop all packets in bursts of one to 60 seconds, so you must ensure you handle reconnections. + +The following Network Simulator presets simulate a poor quality mobile connection: + +* [Mobile 3.75G](#mobile-375g) +* [Mobile 4G](#mobile-4g) +* [Mobile 4.5G](#mobile-45g) + +#### Good quality mobile connections + +A good quality mobile connection preset represents a mobile connection comparable to or better than a typical [home broadband connection](#home-broadband). + +The [Mobile 5G](#mobile-5g) Network Simulator preset simulates a good-quality mobile connection + +### Network configuration presets + +A network configuration preset is a bundle of Network Simulator parameters that simulate a common network connection type. This section covers the available Network Simulator configuration presets. + +#### Home Broadband + +The Home Broadband network simulation preset simulates a typical home broadband connection. + +|**Name**|Home Broadband [WIFI, Cable, Console, PC]| +|:----|:----| +|**Description**|Simulates a typical home broadband connection.| +|**Packet delay (ms)**|32| +|**Packet jitter (ms)**|12| +|**Packet loss interval**|0| +|**Packet loss percent**|2| + +#### Mobile 2G + +The Mobile 2G network simulation preset simulates a typical 2G mobile connection. + +|**Name**|Mobile 2G [CDMA & GSM, '00]| +|:----|:----| +|**Description**|Simulates a poor-quality mobile connection.| +|**Packet delay (ms)**|400| +|**Packet jitter (ms)**|200| +|**Packet loss interval**|0| +|**Packet loss percent**|3| + +#### Mobile 2.5G + +The Mobile 2.5G network simulation preset simulates a typical 2.5G (GPRS) mobile connection. + +|**Name**|Mobile 2.5G [GPRS, G, '00]| +|:----|:----| +|**Description**|Simulates a poor-quality mobile connection.| +|**Packet delay (ms)**|200| +|**Packet jitter (ms)**|100| +|**Packet loss interval**|0| +|**Packet loss percent**|3| + +#### Mobile 2.75G + +The Mobile 2.75G network simulation preset simulates a typical 2.75G (EDGE) mobile connection. + +|**Name**|Mobile 3.75G [HDSDPA+, H+, '11]| +|:----|:----| +|**Description**|Simulates a decent-quality mobile connection.| +|**Packet delay (ms)**|75| +|**Packet jitter (ms)**|50| +|**Packet loss interval**|0| +|**Packet loss percent**|3| + +#### Mobile 3G + +The Mobile 3G network simulation preset simulates a typical 3G mobile connection. + +|**Name**|Mobile 3.75G [HDSDPA+, H+, '11]| +|:----|:----| +|**Description**|Simulates a decent-quality mobile connection.| +|**Packet delay (ms)**|75| +|**Packet jitter (ms)**|50| +|**Packet loss interval**|0| +|**Packet loss percent**|3| + +#### Mobile 3.5G + +The Mobile 3.5G network simulation preset simulates a typical 3.5G (HSDPA/H) mobile connection. + +|**Name**|Mobile 3.75G [HDSDPA+, H+, '11]| +|:----|:----| +|**Description**|Simulates a decent-quality mobile connection.| +|**Packet delay (ms)**|75| +|**Packet jitter (ms)**|50| +|**Packet loss interval**|0| +|**Packet loss percent**|3| + +#### Mobile 3.75G + +The Mobile 3.75G network simulation preset simulates a typical 3.75G (HSPA+/H+) mobile connection. + +|**Name**|Mobile 3.75G [HDSDPA+, H+, '11]| +|:----|:----| +|**Description**|Simulates a decent-quality mobile connection.| +|**Packet delay (ms)**|75| +|**Packet jitter (ms)**|50| +|**Packet loss interval**|0| +|**Packet loss percent**|3| + +#### Mobile 4G + +The Mobile 4G network simulation preset simulates a typical 4G (LTE) mobile connection. + +|**Name**|Mobile 4G [4G, LTE, '13]| +|:----|:----| +|**Description**|Simulates a decent-quality mobile connection.| +|**Packet delay (ms)**|50| +|**Packet jitter (ms)**|25| +|**Packet loss interval**|0| +|**Packet loss percent**|2| + +#### Mobile 4.5G + +The Mobile 4.5G network simulation preset simulates a typical 4.5G (LTE+) mobile connection. + +|**Name**|Mobile 4.5G [4G+, LTE-A, '16]| +|:----|:----| +|**Description**|Simulates a decent-quality mobile connection.| +|**Packet delay (ms)**|50| +|**Packet jitter (ms)**|25| +|**Packet loss interval**|0| +|**Packet loss percent**|2| + +#### Mobile 5G + +The Mobile 5G network simulation preset simulates a typical 5G mobile connection. + +|**Name**|Mobile 5G ['20]| +|:----|:----| +|**Description**|Simulates a good-quality mobile connection.| +|**Packet delay (ms)**|1| +|**Packet jitter (ms)**|10| +|**Packet loss interval**|0| +|**Packet loss percent**|2| + +### Network events + +The following sections cover common network connection events and problems you can simulate with the Network Simulator. + +* [Disconnects](#disconnects) +* [Lag spikes](#lag-spikes) +* [Latency](#latency) +* [Packet loss](#packet-loss) +* [Jitter](#jitter) +* [Instability](#instability) + +#### Disconnects + +A network disconnect is a disruption or termination of the connection between the sender and the receiver. + +You can trigger a network disconnect in the Unity Editor with the Network Simulator component by setting the **Connection** to **Disconnected**. See the [Disconnect scenario](#disconnect-scenario) example. + +![](../static/img/tools/netsim-1.png) + +#### Lag spikes + +A lag spike refers to a temporary increase in network latency. Some of the most common causes of lag spikes include overburdened CPUs, temporary network disconnects, and unreliable connections with high [jitter](#jitter). + +You can trigger a simulated lag spike in the Unity Editor with the Network Simulator component by setting the **Duration of the lag spike (ms)**, then selecting **Trigger**. See the [Lag spike scenario](#lag-spike-scenario) example. + +![](../static/img/tools/netsim-7.png) + +#### Latency + +Network latency measures the time it takes a packet to travel across a network in milliseconds (ms). Players experience high latency (sometimes called “lag”) when the time delay between the server (or host) sending the information and the client receiving the information creates communication bottlenecks or an undesirable playing experience. + +You can trigger control the simulated network latency in the Unity Editor with the Network Simulator component by setting the **Packet Delay (ms)** parameter. + +:::note +**Note**: A common method of measuring the latency of a network connection is through ping messages. Pings are small network packets that you can use to measure the time it takes a packet to reach its destination in milliseconds. High ping often equates to high latency. +::: + +#### Packet loss + +Packet loss occurs when packets fail to reach their destination when transmitted across a network. It’s typically measured as a percentage of packets lost or the frequency of packets dropped. + +You can trigger control the simulated packet loss in the Unity Editor with the Network Simulator component by setting the **Packet Loss Interval** and the **Packet Loss (%)** parameters. + +#### Jitter + +Jitter is the variation in packet delays ([latency](#latency)) measured in milliseconds (ms). High-quality network connections typically have reliable and consistent latency. However, poorer-quality network connections experience high variations in latency, which can create an inconsistent or poor experience for players. These high variations in latency can cause issues such as flickering displays, stuttering, further packet delays, and additional CPU usage. + +You can trigger control the simulated network jitter in the Unity Editor with the Network Simulator component by setting the **Packet Jitter (ms)** parameter. + +#### Instability + +An unstable network connection might consist of intermittent network issues, such as network [disconnects](#disconnects), [packet loss](#packet-loss), [jitter](#jitter), and [latency](#latency). + +See the [Unstable connection scenario](#unstable-connection-scenario) example. + +### Network scenarios + +Network scenarios are built-in (or custom) presets for network types that simulate a specific scenario, such as intermittent lag spikes. They allow you simulate a variable combination of issues and automatically switching configuration presets. + +You can use the Network Simulator SDK to create custom network scenarios that automatically trigger network events (such as a lag spike) at specific frequencies and intervals. + +The code samples in this section showcase how you can build custom network simulator scenarios. + +#### Lag spike scenario + +The following code snippet demonstrates using `NetworkScenarioTask` to create a custom network scenario that simulates a connection with [lag spikes](#lag-spikes). See [`LagSpikeScenarioWithAsyncTask.cs`](https://github.com/Unity-Technologies/com.unity.multiplayer.tools/blob/develop/Samples~/NetworkSimulator/LagSpikeScenarioWithAsyncTask.cs#L27). + +#### Disconnect scenario + +The following code snippet uses `NetworkScenarioBehaviour` to create a custom network scenario that simulates a connection with frequent player [disconnects](#disconnects). See [`DisconnectScenarioWithMonoBehaviour.cs`](https://github.com/Unity-Technologies/com.unity.multiplayer.tools/blob/develop/Samples~/NetworkSimulator/DisconnectScenarioWithMonoBehaviour.cs). + +#### Unstable connection scenario + +The following code snippet demonstrates using `NetworkScenarioTask` to create a custom network scenario that simulates an [unstable connection](#instability). See [`UnstableConnection.cs`](https://github.com/Unity-Technologies/com.unity.multiplayer.tools/blob/develop/Samples~/NetworkSimulator/UnstableConnection.cs). + +#### Affect connection parameters using Animation Curves scenario + +The following code snippet uses `NetworkScenarioBehaviour` to create a custom network scenario that simulates multiple connection problems. It dynamically changes multiple connection parameters using Animation Curves. See [`ConnectionParametersWithCurves.cs`](https://github.com/Unity-Technologies/com.unity.multiplayer.tools/blob/develop/Samples~/NetworkSimulator/ConnectionParametersWithCurves.cs). + +The sample scenario showcases a dynamic scenario using an animation curve loop with variable [packet delays](#latency), [packet jittering](#jitter), and [packet loss](#packet-loss). From c90674e92d901c331b23e57ec36d2dac26aa1da0 Mon Sep 17 00:00:00 2001 From: Larah Armstrong <29762984+armstrongl@users.noreply.github.com> Date: Tue, 15 Nov 2022 17:15:51 -0600 Subject: [PATCH 2/7] Add to sidebar --- sidebarsTools.js | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/sidebarsTools.js b/sidebarsTools.js index e99f486df..384d35593 100644 --- a/sidebarsTools.js +++ b/sidebarsTools.js @@ -12,6 +12,10 @@ module.exports = { "type": "doc", "id": "RNSM" }, + { + "type": "doc", + "id": "tools-network-simulator" + } ], "api": [ From ebabebf5ca4609b6a6e4829a2a09eb6c1fb1fd59 Mon Sep 17 00:00:00 2001 From: Larah Armstrong <29762984+armstrongl@users.noreply.github.com> Date: Tue, 15 Nov 2022 17:32:46 -0600 Subject: [PATCH 3/7] Fix hard line breaks --- tools/network-simulator.md | 24 ++++++++++++------------ 1 file changed, 12 insertions(+), 12 deletions(-) diff --git a/tools/network-simulator.md b/tools/network-simulator.md index dfc14eb58..209c71766 100644 --- a/tools/network-simulator.md +++ b/tools/network-simulator.md @@ -62,13 +62,13 @@ You can trigger a simulated lag spike in the Unity Editor with the Network Simul The Network Simulator tool comes packaged with configuration presets that simulate common network conditions, such as a home broadband connection or a mobile 3G connection. To use one of the configuration presets: 1. Select the **NetworkSimulator** component from the **Hierarchy** tab. -2. Set the **Connection Preset** field to the configuration you want to use. \ +2. Set the **Connection Preset** field to the configuration you want to use. ![](../static/img/tools/netsim-3.png) #### Create a Network Simulator Preset -The Network Simulator tool allows you to create any number of custom network configuration presets. To create a custom network configuration preset: +The Network Simulator tool allows you to create any number of custom network configuration presets. To create a custom network configuration preset: 1. Right-click on the **Assets** folder in the **Project** tab. 2. Select **Create** > **Multiplayer** > **NetworkSimulatorPresetAsset**. @@ -100,7 +100,7 @@ It comes packaged with a couple network scenarios presets: To use a network scenario: 1. Select the **NetworkSimulator** component from the **Hierarchy** tab. -2. Under Network Scenarios in the Inspector tab, set the **Scenario** field to the network scenario you want to use. \ +2. Under Network Scenarios in the Inspector tab, set the **Scenario** field to the network scenario you want to use. ![](../static/img/tools/netsim-12.png) @@ -118,19 +118,19 @@ The **Connections Cycle** Network Scenario allows you to cycle through different ![](../static/img/tools/netsim-15.png) -2. Set the first **Connection Preset** to a built-in preset or a custom preset. \ +1. Set the first **Connection Preset** to a built-in preset or a custom preset. ![](../static/img/tools/netsim-13.png) -3. Set the **Change Interval Milliseconds** field to the time to wait before switching to the next preset. \ +1. Set the **Change Interval Milliseconds** field to the time to wait before switching to the next preset. ![](../static/img/tools/netsim-8.png) -4. Select the **plus (+)** symbol to add another cycle. \ +1. Select the **plus (+)** symbol to add another cycle. ![](../static/img/tools/netsim-14.png) -5. Configure the next cycle as you see fit. \ +1. Configure the next cycle as you see fit. ![](../static/img/tools/netsim-4.png) @@ -140,19 +140,19 @@ The Connections Cycle scenario cycles through the configurations list at the **C The **Random Connections Swap** Network Scenario allows you to specify a set of network configuration presets to swap through at random. By default, it includes one cycle that’s set to None. To configure the Random Connection Swap: -1. From the Inspector tab, expand the **Network Scenarios** > **Configurations** section. \ +1. From the Inspector tab, expand the **Network Scenarios** > **Configurations** section. ![](../static/img/tools/netsim-6.png) -2. Set the **Class Preset** to a built-in preset or a custom preset. \ +1. Set the **Class Preset** to a built-in preset or a custom preset. ![](../static/img/tools/netsim-10.png) -3. Select the **plus (+)** symbol to add another configuration. \ +1. Select the **plus (+)** symbol to add another configuration. ![](../static/img/tools/netsim-5.png) -4. Configure the configuration as you see fit. \ +1. Configure the configuration as you see fit. ![](../static/img/tools/netsim-9.png) \ @@ -179,7 +179,7 @@ The [Home Broadband](#home-broadband) Network Simulator presets simulates a good A poor-quality mobile connection preset represents an extremely poor connection, entirely unsuitable for synchronous multiplayer gaming due to exceptionally [high ping](#latency). However, it might work for some turn-based games. -The following Network Simulator presets simulate a poor-quality mobile connection: +The following Network Simulator presets simulate a poor-quality mobile connection: * [Mobile 2G](#mobile-2g) * [Mobile 2.5G](#mobile-25g) From 4b897937ec0008321fa3645b6475022db8e09a3e Mon Sep 17 00:00:00 2001 From: Larah Armstrong <29762984+armstrongl@users.noreply.github.com> Date: Tue, 15 Nov 2022 17:39:37 -0600 Subject: [PATCH 4/7] Implement suggested changes --- tools/network-simulator.md | 9 +++------ 1 file changed, 3 insertions(+), 6 deletions(-) diff --git a/tools/network-simulator.md b/tools/network-simulator.md index 209c71766..8004ae318 100644 --- a/tools/network-simulator.md +++ b/tools/network-simulator.md @@ -54,7 +54,7 @@ You can trigger a simulated lag spike in the Unity Editor with the Network Simul ![](../static/img/tools/netsim-7.png) :::tip -**Tip**: You can trigger lag spikes through code with the `NetworkSimulator.TriggerLagSpike` API (without needing to write a Network Scenario). See the [Lag spike scenario](#lag-spike-scenario) example to learn how. +**Tip**: You can trigger lag spikes through code with the `NetworkSimulator.TriggerLagSpike` API or you can write a Network Scenario that triggers it. See the [Lag spike scenario](#lag-spike-scenario) example to learn how. ::: #### Use a Network Simulator Preset @@ -86,12 +86,9 @@ Once you select the custom preset asset, you can edit it live from the Inspector #### Use a Network Scenario -The Network Simulator tool supports NetworkScenarios. A NetworkScenario is a way to script how you want to affect the network conditions at runtime. They allow you to change parameters and presets cyclicly or at random. +The Network Simulator tool supports NetworkScenarios. A NetworkScenario is a way to script how you want to affect the network conditions at runtime. They allow you to change parameters and presets dynamically. -It comes packaged with a couple network scenarios presets: - -* [Connections Cycle](#connections-cycle) allows you to cycle through network configurations. -* [Random Connections Swap](#random-connections-swap) allows you to swap through network configurations at random. +It comes packaged with a couple network scenarios presets, such as the [Connections Cycle](#connections-cycle) and [Random Connections Swap](#random-connections-swap).. :::note **Note**: You can also [create custom network scenarios](#create-a-network-simulator-preset). From f04ef4724e93b7f2bc0e2cf8f868755be7c3d6f9 Mon Sep 17 00:00:00 2001 From: Larah Armstrong <29762984+armstrongl@users.noreply.github.com> Date: Tue, 15 Nov 2022 17:39:37 -0600 Subject: [PATCH 5/7] Implement suggested changes --- tools/network-simulator.md | 9 +++------ 1 file changed, 3 insertions(+), 6 deletions(-) diff --git a/tools/network-simulator.md b/tools/network-simulator.md index 209c71766..b62ed461f 100644 --- a/tools/network-simulator.md +++ b/tools/network-simulator.md @@ -54,7 +54,7 @@ You can trigger a simulated lag spike in the Unity Editor with the Network Simul ![](../static/img/tools/netsim-7.png) :::tip -**Tip**: You can trigger lag spikes through code with the `NetworkSimulator.TriggerLagSpike` API (without needing to write a Network Scenario). See the [Lag spike scenario](#lag-spike-scenario) example to learn how. +**Tip**: You can trigger lag spikes through code with the `NetworkSimulator.TriggerLagSpike` API or you can write a Network Scenario that triggers it. See the [Lag spike scenario](#lag-spike-scenario) example to learn how. ::: #### Use a Network Simulator Preset @@ -86,12 +86,9 @@ Once you select the custom preset asset, you can edit it live from the Inspector #### Use a Network Scenario -The Network Simulator tool supports NetworkScenarios. A NetworkScenario is a way to script how you want to affect the network conditions at runtime. They allow you to change parameters and presets cyclicly or at random. +The Network Simulator tool supports NetworkScenarios. A NetworkScenario is a way to script how you want to affect the network conditions at runtime. They allow you to change parameters and presets dynamically. -It comes packaged with a couple network scenarios presets: - -* [Connections Cycle](#connections-cycle) allows you to cycle through network configurations. -* [Random Connections Swap](#random-connections-swap) allows you to swap through network configurations at random. +It comes packaged with a couple network scenarios presets, such as the [Connections Cycle](#connections-cycle) and [Random Connections Swap](#random-connections-swap). :::note **Note**: You can also [create custom network scenarios](#create-a-network-simulator-preset). From 0d833208b7c7e60239fc0126f550daf0d359e0c3 Mon Sep 17 00:00:00 2001 From: Larah Armstrong <29762984+armstrongl@users.noreply.github.com> Date: Tue, 15 Nov 2022 18:03:16 -0600 Subject: [PATCH 6/7] Add versioning for Tools and switch the latest to 1.1.0 --- docusaurus.config.js | 6 +- ...ols.Editor.NetStatsMonitorBuildSettings.md | 189 +++++++ .../api/Unity.Multiplayer.Tools.Editor.md | 13 + ...er.Tools.MetricTypes.DirectedMetricType.md | 165 ++++++ .../Unity.Multiplayer.Tools.MetricTypes.md | 13 + ...ity.Multiplayer.Tools.NetStats.MetricId.md | 180 +++++++ ...y.Multiplayer.Tools.NetStats.MetricKind.md | 60 +++ ....Tools.NetStats.MetricMetadataAttribute.md | 505 ++++++++++++++++++ ....Tools.NetStats.MetricTypeEnumAttribute.md | 181 +++++++ .../Unity.Multiplayer.Tools.NetStats.Units.md | 70 +++ .../api/Unity.Multiplayer.Tools.NetStats.md | 76 +++ ...Tools.NetStatsMonitor.AggregationMethod.md | 57 ++ ...ls.NetStatsMonitor.CounterConfiguration.md | 339 ++++++++++++ ...tatsMonitor.DisplayElementConfiguration.md | 251 +++++++++ ...ools.NetStatsMonitor.DisplayElementType.md | 61 +++ ...sMonitor.ExponentialMovingAverageParams.md | 133 +++++ ...ools.NetStatsMonitor.GraphConfiguration.md | 227 ++++++++ ...er.Tools.NetStatsMonitor.GraphXAxisType.md | 56 ++ ....NetStatsMonitor.LineGraphConfiguration.md | 140 +++++ ...atsMonitor.NetStatsMonitorConfiguration.md | 108 ++++ ...s.NetStatsMonitor.PositionConfiguration.md | 192 +++++++ ....NetStatsMonitor.RuntimeNetStatsMonitor.md | 171 ++++++ ...tStatsMonitor.SimpleMovingAverageParams.md | 65 +++ ...r.Tools.NetStatsMonitor.SmoothingMethod.md | 33 ++ ...Unity.Multiplayer.Tools.NetStatsMonitor.md | 70 +++ .../version-1.0.0/api/introduction.md | 14 + .../version-1.0.0/install-tools.md | 13 + .../version-1.0.0/profiler.md | 129 +++++ .../version-1.0.0/runtime-stats-monitor.md | 246 +++++++++ .../version-1.0.0-sidebars.json | 146 +++++ tools_versions.json | 1 + 31 files changed, 3909 insertions(+), 1 deletion(-) create mode 100644 tools_versioned_docs/version-1.0.0/api/Unity.Multiplayer.Tools.Editor.NetStatsMonitorBuildSettings.md create mode 100644 tools_versioned_docs/version-1.0.0/api/Unity.Multiplayer.Tools.Editor.md create mode 100644 tools_versioned_docs/version-1.0.0/api/Unity.Multiplayer.Tools.MetricTypes.DirectedMetricType.md create mode 100644 tools_versioned_docs/version-1.0.0/api/Unity.Multiplayer.Tools.MetricTypes.md create mode 100644 tools_versioned_docs/version-1.0.0/api/Unity.Multiplayer.Tools.NetStats.MetricId.md create mode 100644 tools_versioned_docs/version-1.0.0/api/Unity.Multiplayer.Tools.NetStats.MetricKind.md create mode 100644 tools_versioned_docs/version-1.0.0/api/Unity.Multiplayer.Tools.NetStats.MetricMetadataAttribute.md create mode 100644 tools_versioned_docs/version-1.0.0/api/Unity.Multiplayer.Tools.NetStats.MetricTypeEnumAttribute.md create mode 100644 tools_versioned_docs/version-1.0.0/api/Unity.Multiplayer.Tools.NetStats.Units.md create mode 100644 tools_versioned_docs/version-1.0.0/api/Unity.Multiplayer.Tools.NetStats.md create mode 100644 tools_versioned_docs/version-1.0.0/api/Unity.Multiplayer.Tools.NetStatsMonitor.AggregationMethod.md create mode 100644 tools_versioned_docs/version-1.0.0/api/Unity.Multiplayer.Tools.NetStatsMonitor.CounterConfiguration.md create mode 100644 tools_versioned_docs/version-1.0.0/api/Unity.Multiplayer.Tools.NetStatsMonitor.DisplayElementConfiguration.md create mode 100644 tools_versioned_docs/version-1.0.0/api/Unity.Multiplayer.Tools.NetStatsMonitor.DisplayElementType.md create mode 100644 tools_versioned_docs/version-1.0.0/api/Unity.Multiplayer.Tools.NetStatsMonitor.ExponentialMovingAverageParams.md create mode 100644 tools_versioned_docs/version-1.0.0/api/Unity.Multiplayer.Tools.NetStatsMonitor.GraphConfiguration.md create mode 100644 tools_versioned_docs/version-1.0.0/api/Unity.Multiplayer.Tools.NetStatsMonitor.GraphXAxisType.md create mode 100644 tools_versioned_docs/version-1.0.0/api/Unity.Multiplayer.Tools.NetStatsMonitor.LineGraphConfiguration.md create mode 100644 tools_versioned_docs/version-1.0.0/api/Unity.Multiplayer.Tools.NetStatsMonitor.NetStatsMonitorConfiguration.md create mode 100644 tools_versioned_docs/version-1.0.0/api/Unity.Multiplayer.Tools.NetStatsMonitor.PositionConfiguration.md create mode 100644 tools_versioned_docs/version-1.0.0/api/Unity.Multiplayer.Tools.NetStatsMonitor.RuntimeNetStatsMonitor.md create mode 100644 tools_versioned_docs/version-1.0.0/api/Unity.Multiplayer.Tools.NetStatsMonitor.SimpleMovingAverageParams.md create mode 100644 tools_versioned_docs/version-1.0.0/api/Unity.Multiplayer.Tools.NetStatsMonitor.SmoothingMethod.md create mode 100644 tools_versioned_docs/version-1.0.0/api/Unity.Multiplayer.Tools.NetStatsMonitor.md create mode 100644 tools_versioned_docs/version-1.0.0/api/introduction.md create mode 100644 tools_versioned_docs/version-1.0.0/install-tools.md create mode 100644 tools_versioned_docs/version-1.0.0/profiler.md create mode 100644 tools_versioned_docs/version-1.0.0/runtime-stats-monitor.md create mode 100644 tools_versioned_sidebars/version-1.0.0-sidebars.json diff --git a/docusaurus.config.js b/docusaurus.config.js index d111489a6..6f37781d7 100644 --- a/docusaurus.config.js +++ b/docusaurus.config.js @@ -569,9 +569,13 @@ module.exports = { lastVersion: 'current', versions: { current: { - label: '1.0.0', + label: '1.1.0', path: 'current', }, + '1.0.0': { + label: '1.0.0', + path: '1.0.0' + } }, editCurrentVersion: true, routeBasePath: 'tools', diff --git a/tools_versioned_docs/version-1.0.0/api/Unity.Multiplayer.Tools.Editor.NetStatsMonitorBuildSettings.md b/tools_versioned_docs/version-1.0.0/api/Unity.Multiplayer.Tools.Editor.NetStatsMonitorBuildSettings.md new file mode 100644 index 000000000..9e00f6d31 --- /dev/null +++ b/tools_versioned_docs/version-1.0.0/api/Unity.Multiplayer.Tools.Editor.NetStatsMonitorBuildSettings.md @@ -0,0 +1,189 @@ +--- +id: Unity.Multiplayer.Tools.Editor.NetStatsMonitorBuildSettings +title: Unity.Multiplayer.Tools.Editor.NetStatsMonitorBuildSettings +--- + +# Class NetStatsMonitorBuildSettings + + + +Methods to control whether the Runtime Net Stats Monitor is included in +the build. When making automated builds of your project, you can use +this to dynamically control whether the monitor is included in release +or development builds. + + + + + + + + + +##### Inheritance + + + +System.Object + + + + + +NetStatsMonitorBuildSettings + + + + + + + +##### Inherited Members + + + +System.Object.Equals(System.Object) + + + + + +System.Object.Equals(System.Object, System.Object) + + + + + +System.Object.GetHashCode() + + + + + +System.Object.GetType() + + + + + +System.Object.MemberwiseClone() + + + + + +System.Object.ReferenceEquals(System.Object, System.Object) + + + + + +System.Object.ToString() + + + + + +###### **Namespace**: Unity.Multiplayer.Tools.Editor + +###### **Assembly**: Tools.dll + +##### Syntax + + + +``` lang-csharp +public static class NetStatsMonitorBuildSettings +``` + + + +### Methods + +#### DisableInDevelopForAllBuildTargets() + + + +Disables the RNSM in development builds for all build targets + + + + + + + +##### Declaration + + + +``` lang-csharp +public static void DisableInDevelopForAllBuildTargets() +``` + + + +#### DisableInReleaseForAllBuildTargets() + + + +Disables the RNSM in release builds for all build targets + + + + + + + +##### Declaration + + + +``` lang-csharp +public static void DisableInReleaseForAllBuildTargets() +``` + + + +#### EnableInDevelopForAllBuildTargets() + + + +Enables the RNSM in development builds for all build targets + + + + + + + +##### Declaration + + + +``` lang-csharp +public static void EnableInDevelopForAllBuildTargets() +``` + + + +#### EnableInReleaseForAllBuildTargets() + + + +Enables the RNSM in release builds for all build targets + + + + + + + +##### Declaration + + + +``` lang-csharp +public static void EnableInReleaseForAllBuildTargets() +``` + + diff --git a/tools_versioned_docs/version-1.0.0/api/Unity.Multiplayer.Tools.Editor.md b/tools_versioned_docs/version-1.0.0/api/Unity.Multiplayer.Tools.Editor.md new file mode 100644 index 000000000..5e4e87718 --- /dev/null +++ b/tools_versioned_docs/version-1.0.0/api/Unity.Multiplayer.Tools.Editor.md @@ -0,0 +1,13 @@ +--- +id: Unity.Multiplayer.Tools.Editor +title: Unity.Multiplayer.Tools.Editor +--- + +### Classes + +#### NetStatsMonitorBuildSettings + +Methods to control whether the Runtime Net Stats Monitor is included in +the build. When making automated builds of your project, you can use +this to dynamically control whether the monitor is included in release +or development builds. \ No newline at end of file diff --git a/tools_versioned_docs/version-1.0.0/api/Unity.Multiplayer.Tools.MetricTypes.DirectedMetricType.md b/tools_versioned_docs/version-1.0.0/api/Unity.Multiplayer.Tools.MetricTypes.DirectedMetricType.md new file mode 100644 index 000000000..1ad929276 --- /dev/null +++ b/tools_versioned_docs/version-1.0.0/api/Unity.Multiplayer.Tools.MetricTypes.DirectedMetricType.md @@ -0,0 +1,165 @@ +--- +id: Unity.Multiplayer.Tools.MetricTypes.DirectedMetricType +title: Unity.Multiplayer.Tools.MetricTypes.DirectedMetricType +--- + + + + + +# Enum DirectedMetricType + + + +The built in set of metrics that can be displayed in the multiplayer +tools, such as the Network Profiler and the Runtime Net Stats Monitor. + + + + + + + +###### **Namespace**: Unity.Multiplayer.Tools.MetricTypes + +###### **Assembly**: Tools.dll + +##### Syntax + + + +``` lang-csharp +public enum DirectedMetricType +``` + + + +### Fields + +Name + + + + + + + + + +Description + +Connections + +Number of active network connections. A client will always show one +active connection (client to server). + +NamedMessageReceived + +Number of custom named message received. + +NamedMessageSent + +Number of custom named message sent. + +NetworkMessageReceived + +Number of network message received. + +NetworkMessageSent + +Number of network message sent. + +NetworkObjects + +Number of active Network Objects. + +NetworkVariableDeltaReceived + +Number of network variable delta message received. + +NetworkVariableDeltaSent + +Number of network variable delta message sent. + +ObjectDestroyedReceived + +Number of network object destroyed message received. + +ObjectDestroyedSent + +Number of network object destroyed message sent. + +ObjectSpawnedReceived + +Number of network object spawned message received. + +ObjectSpawnedSent + +Number of network object spawned message sent. + +OwnershipChangeReceived + +Number of ownership change message received. + +OwnershipChangeSent + +Number of ownership change message sent. + +PacketLoss + +Percentage of packet loss over the lifetime of the connection. This is +only valid for clients. This value will always be zero on a server. + +PacketsReceived + +Number of packets received. + +PacketsSent + +Number of packets sent. + +RpcReceived + +Number of RPC received. + +RpcSent + +Number of RPC sent. + +RttToServer + +The RTT from a client to a server. This include the processing time at +the transport level but does not contain the processing time spent +inside the Netcode for GameObjects. + +SceneEventReceived + +Number of scene event message received. + +SceneEventSent + +Number of scene event message sent. + +ServerLogReceived + +Number of server log message received. + +ServerLogSent + +Number of server log message sent. + +TotalBytesReceived + +Number of total bytes received. + +TotalBytesSent + +Number of total bytes sent. + +UnnamedMessageReceived + +Number of custom unnamed message received. + +UnnamedMessageSent + +Number of custom unnamed message sent. \ No newline at end of file diff --git a/tools_versioned_docs/version-1.0.0/api/Unity.Multiplayer.Tools.MetricTypes.md b/tools_versioned_docs/version-1.0.0/api/Unity.Multiplayer.Tools.MetricTypes.md new file mode 100644 index 000000000..4fade2d17 --- /dev/null +++ b/tools_versioned_docs/version-1.0.0/api/Unity.Multiplayer.Tools.MetricTypes.md @@ -0,0 +1,13 @@ +--- +id: Unity.Multiplayer.Tools.MetricTypes +title: Unity.Multiplayer.Tools.MetricTypes +--- +### Enums + +#### DirectedMetricType + + + +The built in set of metrics that can be displayed in the multiplayer +tools, such as the Network Profiler and the Runtime Net Stats Monitor. + diff --git a/tools_versioned_docs/version-1.0.0/api/Unity.Multiplayer.Tools.NetStats.MetricId.md b/tools_versioned_docs/version-1.0.0/api/Unity.Multiplayer.Tools.NetStats.MetricId.md new file mode 100644 index 000000000..f910772ea --- /dev/null +++ b/tools_versioned_docs/version-1.0.0/api/Unity.Multiplayer.Tools.NetStats.MetricId.md @@ -0,0 +1,180 @@ +--- +id: Unity.Multiplayer.Tools.NetStats.MetricId +title: Unity.Multiplayer.Tools.NetStats.MetricId +--- + +# Struct MetricId + +Wrapper around an enum with the MetricTypeEnumAttribute. The struct +provide a way to create metric that can be used with multiplayer tools. + +##### Implements + +System.IEquatable\ + +##### Inherited Members + +System.Object.Equals(System.Object, System.Object) + +System.Object.GetType() + +System.Object.ReferenceEquals(System.Object, System.Object) + +###### **Namespace**: Unity.Multiplayer.Tools.NetStats + +###### **Assembly**: Tools.dll + +##### Syntax + +``` lang-csharp +[Serializable] +public struct MetricId : IEquatable +``` + +### Methods + +#### Create\(T) + +Static function to create a MetricId. + +##### Declaration + +``` lang-csharp +public static MetricId Create(T value) + where T : struct, IConvertible +``` + +##### Parameters + +| Type | Name | Description | +|------|-------|----------------------------| +| T | value | Enum value for the metric. | + +##### Returns + +| Type | Description | +|----------|-------------| +| MetricId | | + +##### Type Parameters + +| Name | Description | +|------|------------------------------------------| +| T | An enum with the MetricTypeEnumAttribute | + +#### Equals(Object) + +Determines whether the specified object is equal to the current object. + +##### Declaration + +``` lang-csharp +public override bool Equals(object obj) +``` + +##### Parameters + +| Type | Name | Description | +|---------------|------|-------------------------------------------------| +| System.Object | obj | The object to compare with the current object.. | + +##### Returns + +| Type | Description | +|----------------|--------------------------------------------------------------------------------| +| System.Boolean | true if the specified object is equal to the current object; otherwise, false. | + +##### Overrides + +System.ValueType.Equals(System.Object) + +#### Equals(MetricId) + +Determines whether the specified MetricId is equal to the current +MetricId. + +##### Declaration + +``` lang-csharp +public bool Equals(MetricId other) +``` + +##### Parameters + +| Type | Name | Description | +|----------|-------|----------------------------------------------------| +| MetricId | other | The MetricId to compare with the current MetricId. | + +##### Returns + +| Type | Description | +|----------------|------------------------------------------------------------------------------------| +| System.Boolean | true if the specified MetricId is equal to the current MetricId; otherwise, false. | + +#### GetHashCode() + +Serves as the default hash function. + +##### Declaration + +``` lang-csharp +public override int GetHashCode() +``` + +##### Returns + +| Type | Description | +|--------------|---------------------------------------| +| System.Int32 | A hash code for the current MetricId. | + +##### Overrides + +System.ValueType.GetHashCode() + +#### ToString() + +Returns a string that represents the current MetricId. + +##### Declaration + +``` lang-csharp +public override string ToString() +``` + +##### Returns + +| Type | Description | +|---------------|------------------------------------------------| +| System.String | A string that represents the current MetricId. | + +##### Overrides + +System.ValueType.ToString() + +### Operators + +#### Implicit(MetricId to String) + +Implicit operator to convert to string. + +##### Declaration + +``` lang-csharp +public static implicit operator string (MetricId metricId) +``` + +##### Parameters + +| Type | Name | Description | +|----------|----------|------------------------------------| +| MetricId | metricId | The MetricId to convert to string. | + +##### Returns + +| Type | Description | +|---------------|---------------------------| +| System.String | The name of the MetricId. | + +### Implements + +System.IEquatable\ \ No newline at end of file diff --git a/tools_versioned_docs/version-1.0.0/api/Unity.Multiplayer.Tools.NetStats.MetricKind.md b/tools_versioned_docs/version-1.0.0/api/Unity.Multiplayer.Tools.NetStats.MetricKind.md new file mode 100644 index 000000000..49a421dd7 --- /dev/null +++ b/tools_versioned_docs/version-1.0.0/api/Unity.Multiplayer.Tools.NetStats.MetricKind.md @@ -0,0 +1,60 @@ +--- +id: Unity.Multiplayer.Tools.NetStats.MetricKind +title: Unity.Multiplayer.Tools.NetStats.MetricKind +--- + + + + + +# Enum MetricKind + + + +Represent the kind a metric can be. + + + + + + + +###### **Namespace**: Unity.Multiplayer.Tools.NetStats + +###### **Assembly**: Tools.dll + +##### Syntax + + + +``` lang-csharp +public enum MetricKind +``` + + + +### Fields + +Name + + + + + + + + + +Description + +Counter + +Represent a counter metric. A counter is a cumulative metric whose value +can only be increased or reset to zero. For a metric that could be +decreased, a Gauge should be used. + +Gauge + +Represent a gauge metric. A gauge is a metric that represents a single +numerical value that can go up or down. For a metric that can only go +up, a Counter should be used. \ No newline at end of file diff --git a/tools_versioned_docs/version-1.0.0/api/Unity.Multiplayer.Tools.NetStats.MetricMetadataAttribute.md b/tools_versioned_docs/version-1.0.0/api/Unity.Multiplayer.Tools.NetStats.MetricMetadataAttribute.md new file mode 100644 index 000000000..6fc1e006a --- /dev/null +++ b/tools_versioned_docs/version-1.0.0/api/Unity.Multiplayer.Tools.NetStats.MetricMetadataAttribute.md @@ -0,0 +1,505 @@ +--- +id: Unity.Multiplayer.Tools.NetStats.MetricMetadataAttribute +title: Unity.Multiplayer.Tools.NetStats.MetricMetadataAttribute +--- + + + + + +# Class MetricMetadataAttribute + + + +Attribute to provide more information about a metric, such as a custom +name and units. + + + + + + + + + +##### Inheritance + + + +System.Object + + + + + +System.Attribute + + + + + +MetricMetadataAttribute + + + + + + + +##### Implements + + + +System.Runtime.InteropServices.\_Attribute + + + + + + + +##### Inherited Members + + + +System.Attribute.Equals(System.Object) + + + + + +System.Attribute.GetCustomAttribute(System.Reflection.Assembly, +System.Type) + + + + + +System.Attribute.GetCustomAttribute(System.Reflection.Assembly, +System.Type, System.Boolean) + + + + + +System.Attribute.GetCustomAttribute(System.Reflection.MemberInfo, +System.Type) + + + + + +System.Attribute.GetCustomAttribute(System.Reflection.MemberInfo, +System.Type, System.Boolean) + + + + + +System.Attribute.GetCustomAttribute(System.Reflection.Module, +System.Type) + + + + + +System.Attribute.GetCustomAttribute(System.Reflection.Module, +System.Type, System.Boolean) + + + + + +System.Attribute.GetCustomAttribute(System.Reflection.ParameterInfo, +System.Type) + + + + + +System.Attribute.GetCustomAttribute(System.Reflection.ParameterInfo, +System.Type, System.Boolean) + + + + + +System.Attribute.GetCustomAttributes(System.Reflection.Assembly) + + + + + +System.Attribute.GetCustomAttributes(System.Reflection.Assembly, +System.Boolean) + + + + + +System.Attribute.GetCustomAttributes(System.Reflection.Assembly, +System.Type) + + + + + +System.Attribute.GetCustomAttributes(System.Reflection.Assembly, +System.Type, System.Boolean) + + + + + +System.Attribute.GetCustomAttributes(System.Reflection.MemberInfo) + + + + + +System.Attribute.GetCustomAttributes(System.Reflection.MemberInfo, +System.Boolean) + + + + + +System.Attribute.GetCustomAttributes(System.Reflection.MemberInfo, +System.Type) + + + + + +System.Attribute.GetCustomAttributes(System.Reflection.MemberInfo, +System.Type, System.Boolean) + + + + + +System.Attribute.GetCustomAttributes(System.Reflection.Module) + + + + + +System.Attribute.GetCustomAttributes(System.Reflection.Module, +System.Boolean) + + + + + +System.Attribute.GetCustomAttributes(System.Reflection.Module, +System.Type) + + + + + +System.Attribute.GetCustomAttributes(System.Reflection.Module, +System.Type, System.Boolean) + + + + + +System.Attribute.GetCustomAttributes(System.Reflection.ParameterInfo) + + + + + +System.Attribute.GetCustomAttributes(System.Reflection.ParameterInfo, +System.Boolean) + + + + + +System.Attribute.GetCustomAttributes(System.Reflection.ParameterInfo, +System.Type) + + + + + +System.Attribute.GetCustomAttributes(System.Reflection.ParameterInfo, +System.Type, System.Boolean) + + + + + +System.Attribute.GetHashCode() + + + + + +System.Attribute.IsDefaultAttribute() + + + + + +System.Attribute.IsDefined(System.Reflection.Assembly, System.Type) + + + + + +System.Attribute.IsDefined(System.Reflection.Assembly, System.Type, +System.Boolean) + + + + + +System.Attribute.IsDefined(System.Reflection.MemberInfo, System.Type) + + + + + +System.Attribute.IsDefined(System.Reflection.MemberInfo, System.Type, +System.Boolean) + + + + + +System.Attribute.IsDefined(System.Reflection.Module, System.Type) + + + + + +System.Attribute.IsDefined(System.Reflection.Module, System.Type, +System.Boolean) + + + + + +System.Attribute.IsDefined(System.Reflection.ParameterInfo, System.Type) + + + + + +System.Attribute.IsDefined(System.Reflection.ParameterInfo, System.Type, +System.Boolean) + + + + + +System.Attribute.Match(System.Object) + + + + + +System.Attribute.System.Runtime.InteropServices.\_Attribute.GetIDsOfNames(System.Guid, +System.IntPtr, System.UInt32, System.UInt32, System.IntPtr) + + + + + +System.Attribute.System.Runtime.InteropServices.\_Attribute.GetTypeInfo(System.UInt32, +System.UInt32, System.IntPtr) + + + + + +System.Attribute.System.Runtime.InteropServices.\_Attribute.GetTypeInfoCount(System.UInt32) + + + + + +System.Attribute.System.Runtime.InteropServices.\_Attribute.Invoke(System.UInt32, +System.Guid, System.UInt32, System.Int16, System.IntPtr, System.IntPtr, +System.IntPtr, System.IntPtr) + + + + + +System.Attribute.TypeId + + + + + +System.Object.Equals(System.Object, System.Object) + + + + + +System.Object.GetType() + + + + + +System.Object.MemberwiseClone() + + + + + +System.Object.ReferenceEquals(System.Object, System.Object) + + + + + +System.Object.ToString() + + + + + +###### **Namespace**: Unity.Multiplayer.Tools.NetStats + +###### **Assembly**: Tools.dll + +##### Syntax + + + +``` lang-csharp +[AttributeUsage(AttributeTargets.Field)] +public class MetricMetadataAttribute : Attribute, _Attribute +``` + + + +### Properties + +#### DisplayAsPercentage + + + +Toggle for the metric to be shown as a percentage. This should only be +used for unitless metrics. + + + + + + + +##### Declaration + + + +``` lang-csharp +public bool DisplayAsPercentage { get; set; } +``` + + + +##### Property Value + +| Type | Description | +|----------------|-------------| +| System.Boolean | | + +#### DisplayName + + + +The custom display name to show for a metric. + + + + + + + +##### Declaration + + + +``` lang-csharp +public string DisplayName { get; set; } +``` + + + +##### Property Value + +| Type | Description | +|---------------|-------------| +| System.String | | + +#### MetricKind + + + +The kind of metric. By default, the metric is a counter. + + + + + + + +##### Declaration + + + +``` lang-csharp +public MetricKind MetricKind { get; set; } +``` + + + +##### Property Value + +| Type | Description | +|------------|-------------| +| MetricKind | | + +#### Units + + + +The units for the metric. By default, there are no units. + + + + + + + +##### Declaration + + + +``` lang-csharp +public Units Units { get; set; } +``` + + + +##### Property Value + +| Type | Description | +|-------|-------------| +| Units | | + +### Implements + + + +System.Runtime.InteropServices.\_Attribute + + diff --git a/tools_versioned_docs/version-1.0.0/api/Unity.Multiplayer.Tools.NetStats.MetricTypeEnumAttribute.md b/tools_versioned_docs/version-1.0.0/api/Unity.Multiplayer.Tools.NetStats.MetricTypeEnumAttribute.md new file mode 100644 index 000000000..34cf5ede3 --- /dev/null +++ b/tools_versioned_docs/version-1.0.0/api/Unity.Multiplayer.Tools.NetStats.MetricTypeEnumAttribute.md @@ -0,0 +1,181 @@ +--- +id: Unity.Multiplayer.Tools.NetStats.MetricTypeEnumAttribute +title: Unity.Multiplayer.Tools.NetStats.MetricTypeEnumAttribute +--- + +## Class MetricTypeEnumAttribute + +Use this attribute to declare an enum that represents custom metrics for +use with the Multiplayer Tools package. In particular, this attribute +can be used to declare custom metrics that can be displayed in the . + +### Inheritance + +System.Object + +System.Attribute + +MetricTypeEnumAttribute + +### Implements + +System.Runtime.InteropServices.\_Attribute + + + +## **Namespace**: Unity.Multiplayer.Tools.NetStats + +### **Assembly**: Tools.dll + +### Syntax + +``` lang-csharp +[AttributeUsage(AttributeTargets.Enum)] +public class MetricTypeEnumAttribute : Attribute, _Attribute +``` + +### Properties + +#### DisplayName + +The custom display name to use for the metric enum. This can be set to +something different than the name of the enum to provide a nicer display +name in UIs like the inspector. + +#### Declaration + +``` lang-csharp +public string DisplayName { get; set; } +``` + +#### Property Value + +| Type | Description | +|---------------|-------------| +| System.String | | + +### Implements + +System.Runtime.InteropServices.\_Attribute \ No newline at end of file diff --git a/tools_versioned_docs/version-1.0.0/api/Unity.Multiplayer.Tools.NetStats.Units.md b/tools_versioned_docs/version-1.0.0/api/Unity.Multiplayer.Tools.NetStats.Units.md new file mode 100644 index 000000000..359901017 --- /dev/null +++ b/tools_versioned_docs/version-1.0.0/api/Unity.Multiplayer.Tools.NetStats.Units.md @@ -0,0 +1,70 @@ +--- +id: Unity.Multiplayer.Tools.NetStats.Units +title: Unity.Multiplayer.Tools.NetStats.Units +--- + + + + + +# Enum Units + + + +This enum can be used to indicate the units that a metric is reported +in, so that they can be displayed in the Runtime Network Stats Monitor +with the appropriate units. + + + + + + + +###### **Namespace**: Unity.Multiplayer.Tools.NetStats + +###### **Assembly**: Tools.dll + +##### Syntax + + + +``` lang-csharp +public enum Units +``` + + + +### Fields + +Name + + + + + + + + + +Description + +Bytes + +Represent bytes. + +BytesPerSecond + +Represent bytes per second. + +Hertz + +Represent a hertz (1/second). + +None + +A dimensionless metric without units (e.g. connection count) + +Seconds + +Represent a second. \ No newline at end of file diff --git a/tools_versioned_docs/version-1.0.0/api/Unity.Multiplayer.Tools.NetStats.md b/tools_versioned_docs/version-1.0.0/api/Unity.Multiplayer.Tools.NetStats.md new file mode 100644 index 000000000..c3dc69c29 --- /dev/null +++ b/tools_versioned_docs/version-1.0.0/api/Unity.Multiplayer.Tools.NetStats.md @@ -0,0 +1,76 @@ +--- +id: Unity.Multiplayer.Tools.NetStats +title: Unity.Multiplayer.Tools.NetStats +--- + + +### Classes + +#### AssemblyRequiresTypeRegistrationAttribute + + + +For internal use. This attribute is automatically added to assemblies +that use types from the multiplayer tools package that require code +generation to work correctly + + + +#### MetricIdTypeLibrary + + + +For internal use. Static class to register MetricId and make them +available to all tools. + + + +#### MetricMetadataAttribute + + + +Attribute to provide more information about a metric, such as a custom +name and units. + + + +#### MetricTypeEnumAttribute + + + +Use this attribute to declare an enum that represents custom metrics for +use with the Multiplayer Tools package. In particular, this attribute +can be used to declare custom metrics that can be displayed in the . + + + +### Structs + +#### MetricId + + + +Wrapper around an enum with the MetricTypeEnumAttribute. The struct +provide a way to create metric that can be used with multiplayer tools. + + + +### Enums + +#### MetricKind + + + +Represent the kind a metric can be. + + + +#### Units + + + +This enum can be used to indicate the units that a metric is reported +in, so that they can be displayed in the Runtime Network Stats Monitor +with the appropriate units. + + diff --git a/tools_versioned_docs/version-1.0.0/api/Unity.Multiplayer.Tools.NetStatsMonitor.AggregationMethod.md b/tools_versioned_docs/version-1.0.0/api/Unity.Multiplayer.Tools.NetStatsMonitor.AggregationMethod.md new file mode 100644 index 000000000..eba7acb18 --- /dev/null +++ b/tools_versioned_docs/version-1.0.0/api/Unity.Multiplayer.Tools.NetStatsMonitor.AggregationMethod.md @@ -0,0 +1,57 @@ +--- +id: Unity.Multiplayer.Tools.NetStatsMonitor.AggregationMethod +title: Unity.Multiplayer.Tools.NetStatsMonitor.AggregationMethod +--- + + + + + +# Enum AggregationMethod + + + +Enum to select the different aggregation method offered by +CounterConfiguration. + + + + + + + +###### **Namespace**: Unity.Multiplayer.Tools.NetStatsMonitor + +###### **Assembly**: Tools.dll + +##### Syntax + + + +``` lang-csharp +public enum AggregationMethod +``` + + + +### Fields + +Name + + + + + + + + + +Description + +Average + +Aggregation using the average of multiple stats. + +Sum + +Aggregation using the sum of multiple stats. diff --git a/tools_versioned_docs/version-1.0.0/api/Unity.Multiplayer.Tools.NetStatsMonitor.CounterConfiguration.md b/tools_versioned_docs/version-1.0.0/api/Unity.Multiplayer.Tools.NetStatsMonitor.CounterConfiguration.md new file mode 100644 index 000000000..5505657f9 --- /dev/null +++ b/tools_versioned_docs/version-1.0.0/api/Unity.Multiplayer.Tools.NetStatsMonitor.CounterConfiguration.md @@ -0,0 +1,339 @@ +--- +id: Unity.Multiplayer.Tools.NetStatsMonitor.CounterConfiguration +title: Unity.Multiplayer.Tools.NetStatsMonitor.CounterConfiguration +--- + + + + + +# Class CounterConfiguration + + + +Counter configuration used by DisplayElementConfiguration. This +configuration contain all information about a counter. + + + + + + + + + +##### Inheritance + + + +System.Object + + + + + +CounterConfiguration + + + + + + + +##### Inherited Members + + + +System.Object.Equals(System.Object) + + + + + +System.Object.Equals(System.Object, System.Object) + + + + + +System.Object.GetHashCode() + + + + + +System.Object.GetType() + + + + + +System.Object.MemberwiseClone() + + + + + +System.Object.ReferenceEquals(System.Object, System.Object) + + + + + +System.Object.ToString() + + + + + +###### **Namespace**: Unity.Multiplayer.Tools.NetStatsMonitor + +###### **Assembly**: Tools.dll + +##### Syntax + + + +``` lang-csharp +[Serializable] +public sealed class CounterConfiguration +``` + + + +### Properties + +#### AggregationMethod + + + +The desired aggregation method for the stats used in the counter. + + + + + + + +##### Declaration + + + +``` lang-csharp +public AggregationMethod AggregationMethod { get; set; } +``` + + + +##### Property Value + +| Type | Description | +|-------------------|-------------| +| AggregationMethod | | + +#### ExponentialMovingAverageParams + + + +Parameters used if SmoothingMethod is set to ExponentialMovingAverage. + + + + + + + +##### Declaration + + + +``` lang-csharp +public ExponentialMovingAverageParams ExponentialMovingAverageParams { get; set; } +``` + + + +##### Property Value + +| Type | Description | +|--------------------------------|-------------| +| ExponentialMovingAverageParams | | + +#### HighlightLowerBound + + + +Values below this threshold will be highlighted by the default styling, +and can be highlighted by custom styling using the following USS +classes: + +- rnsm-counter-out-of-bounds +- rnsm-counter-below-threshold + + + + + + + +##### Declaration + + + +``` lang-csharp +public float HighlightLowerBound { get; set; } +``` + + + +##### Property Value + +| Type | Description | +|---------------|-------------| +| System.Single | | + +#### HighlightUpperBound + + + +Values above this threshold will be highlighted by the default styling, +and can be highlighted by custom styling using the following USS +classes: + +- rnsm-counter-out-of-bounds +- rnsm-counter-above-threshold + + + + + + + +##### Declaration + + + +``` lang-csharp +public float HighlightUpperBound { get; set; } +``` + + + +##### Property Value + +| Type | Description | +|---------------|-------------| +| System.Single | | + +#### SampleCount + + + +The current configured sample count. Note that if the SmoothingMethod is +set to ExponentialMovingAverage, the sample count will be zero. + + + + + + + +##### Declaration + + + +``` lang-csharp +public int SampleCount { get; } +``` + + + +##### Property Value + +| Type | Description | +|--------------|-------------| +| System.Int32 | | + +#### SignificantDigits + + + +The number of significant digits to display for this counter. + + + + + + + +##### Declaration + + + +``` lang-csharp +public int SignificantDigits { get; set; } +``` + + + +##### Property Value + +| Type | Description | +|--------------|-------------| +| System.Int32 | | + +#### SimpleMovingAverageParams + + + +Parameters used if SmoothingMethod is set to SimpleMovingAverage. + + + + + + + +##### Declaration + + + +``` lang-csharp +public SimpleMovingAverageParams SimpleMovingAverageParams { get; set; } +``` + + + +##### Property Value + +| Type | Description | +|---------------------------|-------------| +| SimpleMovingAverageParams | | + +#### SmoothingMethod + + + +The desired smoothing method over time for the counter. + + + + + + + +##### Declaration + + + +``` lang-csharp +public SmoothingMethod SmoothingMethod { get; set; } +``` + + + +##### Property Value + +| Type | Description | +|-----------------|-------------| +| SmoothingMethod | | diff --git a/tools_versioned_docs/version-1.0.0/api/Unity.Multiplayer.Tools.NetStatsMonitor.DisplayElementConfiguration.md b/tools_versioned_docs/version-1.0.0/api/Unity.Multiplayer.Tools.NetStatsMonitor.DisplayElementConfiguration.md new file mode 100644 index 000000000..8c3f819e2 --- /dev/null +++ b/tools_versioned_docs/version-1.0.0/api/Unity.Multiplayer.Tools.NetStatsMonitor.DisplayElementConfiguration.md @@ -0,0 +1,251 @@ +--- +id: Unity.Multiplayer.Tools.NetStatsMonitor.DisplayElementConfiguration +title: Unity.Multiplayer.Tools.NetStatsMonitor.DisplayElementConfiguration +--- + + + + + +# Class DisplayElementConfiguration + + + +Configuration class used by NetStatsMonitorConfiguration to be displayed +at runtime by RuntimeNetStatsMonitor. + + + + + + + + + +##### Inheritance + + + +System.Object + + + + + +DisplayElementConfiguration + + + + + +###### **Namespace**: Unity.Multiplayer.Tools.NetStatsMonitor + +###### **Assembly**: Tools.dll + +##### Syntax + + + +``` lang-csharp +[Serializable] +public sealed class DisplayElementConfiguration : ISerializationCallbackReceiver +``` + + + +### Properties + +#### CounterConfiguration + + + +Counter configuration if Type is set to Counter. + + + + + + + +##### Declaration + + + +``` lang-csharp +public CounterConfiguration CounterConfiguration { get; set; } +``` + + + +##### Property Value + +| Type | Description | +|----------------------|-------------| +| CounterConfiguration | | + +#### GraphConfiguration + + + +Graph configuration if Type is set to LineGraph or StackedAreaGraph. + + + + + + + +##### Declaration + + + +``` lang-csharp +public GraphConfiguration GraphConfiguration { get; set; } +``` + + + +##### Property Value + +| Type | Description | +|--------------------|-------------| +| GraphConfiguration | | + +#### Label + + + +The label of the display element. + + + + + + + +##### Declaration + + + +``` lang-csharp +public string Label { get; set; } +``` + + + +##### Property Value + +| Type | Description | +|---------------|-------------| +| System.String | | + +#### Stats + + + +The list of stats represented by MetricId to display. + + + + + + + +##### Declaration + + + +``` lang-csharp +public List Stats { get; set; } +``` + + + +##### Property Value + +| Type | Description | +|---------------------------------------------|-------------| +| System.Collections.Generic.List\ | | + +#### Type + + + +The DisplayElementType of the display element. The label to display for +this visual element. For graphs this field is optional, as the variables +displayed in the graph are shown in the legend. Consider leaving this +field blank for graphs if you would like to make them more compact. + + + + + + + +##### Declaration + + + +``` lang-csharp +public DisplayElementType Type { get; set; } +``` + + + +##### Property Value + +| Type | Description | +|--------------------|-------------| +| DisplayElementType | | + +### Methods + +#### OnAfterDeserialize() + + + +For internal use. Implementation for ISerializationCallbackReceiver. +Called after Unity deserialize the object. This allow to keep the +configuration details when reloading assemblies or making change in the +code. + + + + + + + +##### Declaration + + + +``` lang-csharp +public void OnAfterDeserialize() +``` + + + +#### OnBeforeSerialize() + + + +For internal use. Implementation for ISerializationCallbackReceiver. +Called before Unity serialize the object. This allow to keep the +configuration details when reloading assemblies or making change in the +code. + + + + + + + +##### Declaration + + + +``` lang-csharp +public void OnBeforeSerialize() +``` + + diff --git a/tools_versioned_docs/version-1.0.0/api/Unity.Multiplayer.Tools.NetStatsMonitor.DisplayElementType.md b/tools_versioned_docs/version-1.0.0/api/Unity.Multiplayer.Tools.NetStatsMonitor.DisplayElementType.md new file mode 100644 index 000000000..a30ae1021 --- /dev/null +++ b/tools_versioned_docs/version-1.0.0/api/Unity.Multiplayer.Tools.NetStatsMonitor.DisplayElementType.md @@ -0,0 +1,61 @@ +--- +id: Unity.Multiplayer.Tools.NetStatsMonitor.DisplayElementType +title: Unity.Multiplayer.Tools.NetStatsMonitor.DisplayElementType +--- + + + + + +# Enum DisplayElementType + + + +Enum representing the different type of elements the +RuntimeNetStatsMonitor can render. + + + + + + + +###### **Namespace**: Unity.Multiplayer.Tools.NetStatsMonitor + +###### **Assembly**: Tools.dll + +##### Syntax + + + +``` lang-csharp +public enum DisplayElementType +``` + + + +### Fields + +Name + + + + + + + + + +Description + +Counter + +Counter type for DisplayElementConfiguration + +LineGraph + +Line graph type for DisplayElementConfiguration + +StackedAreaGraph + +Stacked area graph type for DisplayElementConfiguration \ No newline at end of file diff --git a/tools_versioned_docs/version-1.0.0/api/Unity.Multiplayer.Tools.NetStatsMonitor.ExponentialMovingAverageParams.md b/tools_versioned_docs/version-1.0.0/api/Unity.Multiplayer.Tools.NetStatsMonitor.ExponentialMovingAverageParams.md new file mode 100644 index 000000000..e4731df6e --- /dev/null +++ b/tools_versioned_docs/version-1.0.0/api/Unity.Multiplayer.Tools.NetStatsMonitor.ExponentialMovingAverageParams.md @@ -0,0 +1,133 @@ +--- +id: Unity.Multiplayer.Tools.NetStatsMonitor.ExponentialMovingAverageParams +title: Unity.Multiplayer.Tools.NetStatsMonitor.ExponentialMovingAverageParams +--- + + + + + +# Class ExponentialMovingAverageParams + + + +Parameters for the exponential moving average smoothing method in +CounterConfiguration. + + + + + + + + + +##### Inheritance + + + +System.Object + + + + + +ExponentialMovingAverageParams + + + + + + + +##### Inherited Members + + + +System.Object.Equals(System.Object) + + + + + +System.Object.Equals(System.Object, System.Object) + + + + + +System.Object.GetHashCode() + + + + + +System.Object.GetType() + + + + + +System.Object.MemberwiseClone() + + + + + +System.Object.ReferenceEquals(System.Object, System.Object) + + + + + +System.Object.ToString() + + + + + +###### **Namespace**: Unity.Multiplayer.Tools.NetStatsMonitor + +###### **Assembly**: Tools.dll + +##### Syntax + + + +``` lang-csharp +[Serializable] +public sealed class ExponentialMovingAverageParams +``` + + + +### Properties + +#### HalfLife + + + +The half-life (in seconds) by which samples should decay. By default, +this is set to one second. + + + + + + + +##### Declaration + + + +``` lang-csharp +public double HalfLife { get; set; } +``` + + + +##### Property Value + +| Type | Description | +|---------------|-------------| +| System.Double | | diff --git a/tools_versioned_docs/version-1.0.0/api/Unity.Multiplayer.Tools.NetStatsMonitor.GraphConfiguration.md b/tools_versioned_docs/version-1.0.0/api/Unity.Multiplayer.Tools.NetStatsMonitor.GraphConfiguration.md new file mode 100644 index 000000000..6d787ac09 --- /dev/null +++ b/tools_versioned_docs/version-1.0.0/api/Unity.Multiplayer.Tools.NetStatsMonitor.GraphConfiguration.md @@ -0,0 +1,227 @@ +--- +id: Unity.Multiplayer.Tools.NetStatsMonitor.GraphConfiguration +title: Unity.Multiplayer.Tools.NetStatsMonitor.GraphConfiguration +--- + + + + + +# Class GraphConfiguration + + + +Graph configuration used by DisplayElementConfiguration. This +configuration contain all information about a Graph. + + + + + + + + + +##### Inheritance + + + +System.Object + + + + + +GraphConfiguration + + + + + + + +##### Inherited Members + + + +System.Object.Equals(System.Object) + + + + + +System.Object.Equals(System.Object, System.Object) + + + + + +System.Object.GetHashCode() + + + + + +System.Object.GetType() + + + + + +System.Object.MemberwiseClone() + + + + + +System.Object.ReferenceEquals(System.Object, System.Object) + + + + + +System.Object.ToString() + + + + + +###### **Namespace**: Unity.Multiplayer.Tools.NetStatsMonitor + +###### **Assembly**: Tools.dll + +##### Syntax + + + +``` lang-csharp +[Serializable] +public sealed class GraphConfiguration +``` + + + +### Properties + +#### LineGraphConfiguration + + + +Line-graph specific options. + + + + + + + +##### Declaration + + + +``` lang-csharp +public LineGraphConfiguration LineGraphConfiguration { get; set; } +``` + + + +##### Property Value + +| Type | Description | +|------------------------|-------------| +| LineGraphConfiguration | | + +#### SampleCount + + + +The number of samples that are maintained for the purpose of graphing. + + + + + + + +##### Declaration + + + +``` lang-csharp +public int SampleCount { get; set; } +``` + + + +##### Property Value + +| Type | Description | +|--------------|-------------| +| System.Int32 | | + +##### Remarks + + + +The value is clamped to the range \[8, 4096\]. + + + +#### VariableColors + + + +List of colors to override the default colors of the graph. + + + + + + + +##### Declaration + + + +``` lang-csharp +public List VariableColors { get; set; } +``` + + + +##### Property Value + +| Type | Description | +|------------------------------------------|-------------| +| System.Collections.Generic.List\ | | + +#### XAxisType + + + +The units used for displaying the bounds of the graph's x-axis. By +default the graph bounds are displayed in units of sample count. If set +to time, the the x-axis graph bounds will display the time over which +these samples were collected. + + + + + + + +##### Declaration + + + +``` lang-csharp +public GraphXAxisType XAxisType { get; set; } +``` + + + +##### Property Value + +| Type | Description | +|----------------|-------------| +| GraphXAxisType | | diff --git a/tools_versioned_docs/version-1.0.0/api/Unity.Multiplayer.Tools.NetStatsMonitor.GraphXAxisType.md b/tools_versioned_docs/version-1.0.0/api/Unity.Multiplayer.Tools.NetStatsMonitor.GraphXAxisType.md new file mode 100644 index 000000000..8a62df43c --- /dev/null +++ b/tools_versioned_docs/version-1.0.0/api/Unity.Multiplayer.Tools.NetStatsMonitor.GraphXAxisType.md @@ -0,0 +1,56 @@ +--- +id: Unity.Multiplayer.Tools.NetStatsMonitor.GraphXAxisType +title: Unity.Multiplayer.Tools.NetStatsMonitor.GraphXAxisType +--- + + + + + +# Enum GraphXAxisType + + + +Enum used to select the units used to display the graph x-axis labels. + + + + + + + +###### **Namespace**: Unity.Multiplayer.Tools.NetStatsMonitor + +###### **Assembly**: Tools.dll + +##### Syntax + + + +``` lang-csharp +public enum GraphXAxisType +``` + + + +### Fields + +Name + + + + + + + + + +Description + +Samples + +Graph x-axis labels will display the duration of the graph in samples. + +Time + +Graph x-axis labels will display the duration of the graph in seconds. \ No newline at end of file diff --git a/tools_versioned_docs/version-1.0.0/api/Unity.Multiplayer.Tools.NetStatsMonitor.LineGraphConfiguration.md b/tools_versioned_docs/version-1.0.0/api/Unity.Multiplayer.Tools.NetStatsMonitor.LineGraphConfiguration.md new file mode 100644 index 000000000..aeab5d95e --- /dev/null +++ b/tools_versioned_docs/version-1.0.0/api/Unity.Multiplayer.Tools.NetStatsMonitor.LineGraphConfiguration.md @@ -0,0 +1,140 @@ +--- +id: Unity.Multiplayer.Tools.NetStatsMonitor.LineGraphConfiguration +title: Unity.Multiplayer.Tools.NetStatsMonitor.LineGraphConfiguration +--- + + + + + +# Class LineGraphConfiguration + + + +Configuration for Line Graph specific options. + + + + + + + + + +##### Inheritance + + + +System.Object + + + + + +LineGraphConfiguration + + + + + + + +##### Inherited Members + + + +System.Object.Equals(System.Object) + + + + + +System.Object.Equals(System.Object, System.Object) + + + + + +System.Object.GetHashCode() + + + + + +System.Object.GetType() + + + + + +System.Object.MemberwiseClone() + + + + + +System.Object.ReferenceEquals(System.Object, System.Object) + + + + + +System.Object.ToString() + + + + + +###### **Namespace**: Unity.Multiplayer.Tools.NetStatsMonitor + +###### **Assembly**: Tools.dll + +##### Syntax + + + +``` lang-csharp +[Serializable] +public sealed class LineGraphConfiguration +``` + + + +### Properties + +#### LineThickness + + + +The line thickness for a line graph. By default this is set to one. + + + + + + + +##### Declaration + + + +``` lang-csharp +public float LineThickness { get; set; } +``` + + + +##### Property Value + +| Type | Description | +|---------------|-------------| +| System.Single | | + +##### Remarks + + + +The accepted range for the line thickness is between 1 and 10. If the +value goes beyond those value, it will be clamped. + + diff --git a/tools_versioned_docs/version-1.0.0/api/Unity.Multiplayer.Tools.NetStatsMonitor.NetStatsMonitorConfiguration.md b/tools_versioned_docs/version-1.0.0/api/Unity.Multiplayer.Tools.NetStatsMonitor.NetStatsMonitorConfiguration.md new file mode 100644 index 000000000..3e7911e9f --- /dev/null +++ b/tools_versioned_docs/version-1.0.0/api/Unity.Multiplayer.Tools.NetStatsMonitor.NetStatsMonitorConfiguration.md @@ -0,0 +1,108 @@ +--- +id: Unity.Multiplayer.Tools.NetStatsMonitor.NetStatsMonitorConfiguration +title: Unity.Multiplayer.Tools.NetStatsMonitor.NetStatsMonitorConfiguration +--- + + + + + +# Class NetStatsMonitorConfiguration + + + +The NetStatsMonitorConfiguration includes all fields required to +configure the contents of the RuntimeNetStatsMonitor + + + + + + + + + +##### Inheritance + + + +System.Object + + + + + +NetStatsMonitorConfiguration + + + + + +###### **Namespace**: Unity.Multiplayer.Tools.NetStatsMonitor + +###### **Assembly**: Tools.dll + +##### Syntax + + + +``` lang-csharp +public class NetStatsMonitorConfiguration : ScriptableObject +``` + + + +### Properties + +#### DisplayElements + + + +List of elements to be rendered by the RuntimeNetStatsMonitor. + + + + + + + +##### Declaration + + + +``` lang-csharp +public List DisplayElements { get; set; } +``` + + + +##### Property Value + +| Type | Description | +|----------------------------------------------------------------|-------------| +| System.Collections.Generic.List\ | | + +### Methods + +#### OnConfigurationModified() + + + +Force a configuration reload. This needs to be called if the +configuration has been modified at runtime by a script. + + + + + + + +##### Declaration + + + +``` lang-csharp +public void OnConfigurationModified() +``` + + diff --git a/tools_versioned_docs/version-1.0.0/api/Unity.Multiplayer.Tools.NetStatsMonitor.PositionConfiguration.md b/tools_versioned_docs/version-1.0.0/api/Unity.Multiplayer.Tools.NetStatsMonitor.PositionConfiguration.md new file mode 100644 index 000000000..cc146fa1e --- /dev/null +++ b/tools_versioned_docs/version-1.0.0/api/Unity.Multiplayer.Tools.NetStatsMonitor.PositionConfiguration.md @@ -0,0 +1,192 @@ +--- +id: Unity.Multiplayer.Tools.NetStatsMonitor.PositionConfiguration +title: Unity.Multiplayer.Tools.NetStatsMonitor.PositionConfiguration +--- + + + + + +# Class PositionConfiguration + + + +Configuration for the position of the RuntimeNetStatsMonitor on screen + + + + + + + + + +##### Inheritance + + + +System.Object + + + + + +PositionConfiguration + + + + + + + +##### Inherited Members + + + +System.Object.Equals(System.Object) + + + + + +System.Object.Equals(System.Object, System.Object) + + + + + +System.Object.GetHashCode() + + + + + +System.Object.GetType() + + + + + +System.Object.MemberwiseClone() + + + + + +System.Object.ReferenceEquals(System.Object, System.Object) + + + + + +System.Object.ToString() + + + + + +###### **Namespace**: Unity.Multiplayer.Tools.NetStatsMonitor + +###### **Assembly**: Tools.dll + +##### Syntax + + + +``` lang-csharp +[Serializable] +public class PositionConfiguration +``` + + + +### Properties + +#### OverridePosition + + + +If enabled, the position here will override the position set by the USS +styling. Disable this options if you would like to use the position from +the USS styling instead. + + + + + + + +##### Declaration + + + +``` lang-csharp +public bool OverridePosition { get; set; } +``` + + + +##### Property Value + +| Type | Description | +|----------------|-------------| +| System.Boolean | | + +#### PositionLeftToRight + + + +The position of the Net Stats Monitor from left to right in the range +from 0 to 1. 0 is flush left, 0.5 is centered, and 1 is flush right. + + + + + + + +##### Declaration + + + +``` lang-csharp +public float PositionLeftToRight { get; set; } +``` + + + +##### Property Value + +| Type | Description | +|---------------|-------------| +| System.Single | | + +#### PositionTopToBottom + + + +The position of the Net Stats Monitor from top to bottom in the range +from 0 to 1. 0 is flush to the top, 0.5 is centered, and 1 is flush to +the bottom. + + + + + + + +##### Declaration + + + +``` lang-csharp +public float PositionTopToBottom { get; set; } +``` + + + +##### Property Value + +| Type | Description | +|---------------|-------------| +| System.Single | | diff --git a/tools_versioned_docs/version-1.0.0/api/Unity.Multiplayer.Tools.NetStatsMonitor.RuntimeNetStatsMonitor.md b/tools_versioned_docs/version-1.0.0/api/Unity.Multiplayer.Tools.NetStatsMonitor.RuntimeNetStatsMonitor.md new file mode 100644 index 000000000..d25d0448c --- /dev/null +++ b/tools_versioned_docs/version-1.0.0/api/Unity.Multiplayer.Tools.NetStatsMonitor.RuntimeNetStatsMonitor.md @@ -0,0 +1,171 @@ +--- +id: Unity.Multiplayer.Tools.NetStatsMonitor.RuntimeNetStatsMonitor +title: Unity.Multiplayer.Tools.NetStatsMonitor.RuntimeNetStatsMonitor +--- + +# Class RuntimeNetStatsMonitor + +The Runtime Net Stats Monitor component. Add this component to a game +object in a scene to display network statistics on screen. + +##### Inheritance + +System.Object + +RuntimeNetStatsMonitor + +###### **Namespace**: Unity.Multiplayer.Tools.NetStatsMonitor + +###### **Assembly**: Tools.dll + +##### Syntax + +``` lang-csharp +public class RuntimeNetStatsMonitor : MonoBehaviour +``` + +### Properties + +#### Configuration + +The configuration asset used to configure the information displayed in +this Runtime Net Stats Monitor. The NetStatsMonitorConfiguration can +created from the Create menu, or from C# using +ScriptableObject.CreateInstance. + +##### Declaration + +``` lang-csharp +public NetStatsMonitorConfiguration Configuration { get; set; } +``` + +##### Property Value + +| Type | Description | +|------------------------------|-------------| +| NetStatsMonitorConfiguration | | + +#### CustomStyleSheet + +Custom stylesheet to override the default style of the Runtime Net Stats +Monitor. + + +##### Declaration + + +``` lang-csharp +public StyleSheet CustomStyleSheet { get; set; } +``` + +##### Property Value + +| Type | Description | +|------------|-------------| +| StyleSheet | | + +#### MaxRefreshRate + +The maximum rate at which the Runtime Net Stats Monitor's on-screen +display is updated (per second). The on-screen display will never be +updated faster than the overall refresh rate. The default refresh rate +is 30fps. + +##### Declaration + +``` lang-csharp +public double MaxRefreshRate { get; set; } +``` + +##### Property Value + +| Type | Description | +|---------------|-------------| +| System.Double | | + +#### PanelSettingsOverride + +Optional panel settings that can be used to override the default. These +panel settings can be used to control a number of things, including how +the on-screen display of the Runtime Net Stats Monitor scales on +different devices and displays. + +##### Declaration + +``` lang-csharp +public PanelSettings PanelSettingsOverride { get; set; } +``` + +##### Property Value + +| Type | Description | +|---------------|-------------| +| PanelSettings | | + +#### Position + +Position configuration that allows custom positioning on screen The +default position is the top left corner of the screen + +##### Declaration + +``` lang-csharp +public PositionConfiguration Position { get; set; } +``` + +##### Property Value + +| Type | Description | +|-----------------------|-------------| +| PositionConfiguration | | + +#### Visible + +Visibility toggle to hide or show the on-screen display. + +##### Declaration + +``` lang-csharp +public bool Visible { get; set; } +``` + +##### Property Value + +| Type | Description | +|----------------|-------------| +| System.Boolean | | + +### Methods + +#### AddCustomValue(MetricId, Single) + +Add a custom value for this metricId, which can be displayed in the +RuntimeNetStatsMonitor using a counter or graph configured to display +this metric. + +##### Declaration + +``` lang-csharp +public void AddCustomValue(MetricId metricId, float value) +``` + +##### Parameters + +| Type | Name | Description | +|---------------|----------|---------------------------------------------| +| MetricId | metricId | The custom MetricId to provide a value for. | +| System.Single | value | The value of the metric. | + +#### ApplyConfiguration() + +Apply the CustomStyleSheet, Position, and Configuration to the monitor. +This function must be called when these fields have been modified from +C# in order to apply the changes. This function does not need to be +called when these fields are modified in the inspector, as changes made +in the inspector are detected and applied automatically + +##### Declaration + +``` lang-csharp +public void ApplyConfiguration() +``` \ No newline at end of file diff --git a/tools_versioned_docs/version-1.0.0/api/Unity.Multiplayer.Tools.NetStatsMonitor.SimpleMovingAverageParams.md b/tools_versioned_docs/version-1.0.0/api/Unity.Multiplayer.Tools.NetStatsMonitor.SimpleMovingAverageParams.md new file mode 100644 index 000000000..79c75dd5b --- /dev/null +++ b/tools_versioned_docs/version-1.0.0/api/Unity.Multiplayer.Tools.NetStatsMonitor.SimpleMovingAverageParams.md @@ -0,0 +1,65 @@ +--- +id: Unity.Multiplayer.Tools.NetStatsMonitor.SimpleMovingAverageParams +title: Unity.Multiplayer.Tools.NetStatsMonitor.SimpleMovingAverageParams +--- + +# Class SimpleMovingAverageParams + +Parameters for the simple moving average smoothing method in +CounterConfiguration. + +##### Inheritance + +System.Object + +SimpleMovingAverageParams + +##### Inherited Members + +System.Object.Equals(System.Object) + +System.Object.Equals(System.Object, System.Object) + +System.Object.GetHashCode() + +System.Object.GetType() + +System.Object.MemberwiseClone() + +System.Object.ReferenceEquals(System.Object, System.Object) + +System.Object.ToString() + + +###### **Namespace**: Unity.Multiplayer.Tools.NetStatsMonitor + +###### **Assembly**: Tools.dll + +##### Syntax + +``` lang-csharp +[Serializable] +public sealed class SimpleMovingAverageParams +``` + +### Properties + +#### SampleCount + +The number of samples that are maintained for the purpose of smoothing. + +##### Declaration + +``` lang-csharp +public int SampleCount { get; set; } +``` + +##### Property Value + +| Type | Description | +|--------------|-------------| +| System.Int32 | | + +##### Remarks + +The value is clamped to the range \[8, 4096\]. \ No newline at end of file diff --git a/tools_versioned_docs/version-1.0.0/api/Unity.Multiplayer.Tools.NetStatsMonitor.SmoothingMethod.md b/tools_versioned_docs/version-1.0.0/api/Unity.Multiplayer.Tools.NetStatsMonitor.SmoothingMethod.md new file mode 100644 index 000000000..153129ac0 --- /dev/null +++ b/tools_versioned_docs/version-1.0.0/api/Unity.Multiplayer.Tools.NetStatsMonitor.SmoothingMethod.md @@ -0,0 +1,33 @@ +--- +id: Unity.Multiplayer.Tools.NetStatsMonitor.SmoothingMethod +title: Unity.Multiplayer.Tools.NetStatsMonitor.SmoothingMethod +--- + +# Enum SmoothingMethod + +Enum to select the different smoothing method offered by +CounterConfiguration. + +###### **Namespace**: Unity.Multiplayer.Tools.NetStatsMonitor + +###### **Assembly**: Tools.dll + +##### Syntax + +``` lang-csharp +public enum SmoothingMethod +``` + +### Fields + +Name + +Description + +ExponentialMovingAverage + +Smoothing method using an exponential moving average. + +SimpleMovingAverage + +Smoothing method using a simple moving average. \ No newline at end of file diff --git a/tools_versioned_docs/version-1.0.0/api/Unity.Multiplayer.Tools.NetStatsMonitor.md b/tools_versioned_docs/version-1.0.0/api/Unity.Multiplayer.Tools.NetStatsMonitor.md new file mode 100644 index 000000000..9c039eb4f --- /dev/null +++ b/tools_versioned_docs/version-1.0.0/api/Unity.Multiplayer.Tools.NetStatsMonitor.md @@ -0,0 +1,70 @@ +--- +id: Unity.Multiplayer.Tools.NetStatsMonitor +title: Unity.Multiplayer.Tools.NetStatsMonitor +--- + +### Classes + +#### CounterConfiguration + +Counter configuration used by DisplayElementConfiguration. This +configuration contain all information about a counter. + +#### DisplayElementConfiguration + +Configuration class used by NetStatsMonitorConfiguration to be displayed +at runtime by RuntimeNetStatsMonitor. + +#### ExponentialMovingAverageParams + +Parameters for the exponential moving average smoothing method in +CounterConfiguration. + +#### GraphConfiguration + +Graph configuration used by DisplayElementConfiguration. This +configuration contain all information about a Graph. + +#### LineGraphConfiguration + +Configuration for Line Graph specific options. + +#### NetStatsMonitorConfiguration + +The NetStatsMonitorConfiguration includes all fields required to +configure the contents of the RuntimeNetStatsMonitor + +#### PositionConfiguration + +Configuration for the position of the RuntimeNetStatsMonitor on screen + +#### RuntimeNetStatsMonitor + +The Runtime Net Stats Monitor component. Add this component to a game +object in a scene to display network statistics on screen. + +#### SimpleMovingAverageParams + +Parameters for the simple moving average smoothing method in +CounterConfiguration. + +### Enums + +#### AggregationMethod + +Enum to select the different aggregation method offered by +CounterConfiguration. + +#### DisplayElementType + +Enum representing the different type of elements the +RuntimeNetStatsMonitor can render. + +#### GraphXAxisType + +Enum used to select the units used to display the graph x-axis labels. + +#### SmoothingMethod + +Enum to select the different smoothing method offered by +CounterConfiguration. \ No newline at end of file diff --git a/tools_versioned_docs/version-1.0.0/api/introduction.md b/tools_versioned_docs/version-1.0.0/api/introduction.md new file mode 100644 index 000000000..811743038 --- /dev/null +++ b/tools_versioned_docs/version-1.0.0/api/introduction.md @@ -0,0 +1,14 @@ +--- +id: introduction +title: API Overview +--- + +The Unity Multiplayer Tools API reference provides information for availble classes, methods, delegates, and more for the `com.unity.multiplayer.tools` package. + +:::unity Content Licenses +All Unity Netcode code is covered by Unity Companion License. See [Licenses](/reference/license) for more information. +::: + +:::note +All content is generated from source code using tools including [DocFX](https://dotnet.github.io/docfx/) and custom filters with [Pandoc](https://pandoc.org/) to convert to Markdown. DocFX generates documentation using these comments. +::: diff --git a/tools_versioned_docs/version-1.0.0/install-tools.md b/tools_versioned_docs/version-1.0.0/install-tools.md new file mode 100644 index 000000000..f61d5c4c1 --- /dev/null +++ b/tools_versioned_docs/version-1.0.0/install-tools.md @@ -0,0 +1,13 @@ +--- +id: install-tools +title: Install the Multiplayer Tools Package +sidebar_label: Install Multiplayer Tools +--- + +To use Multiplayer Tools, such as the [profiler](profiler.md) or [runtime stats monitor](runtime-stats-monitor.md), you need to install the tools package by name. + +1. Open your Unity Hub and select the Project your are presently working on. +2. In the editor's menu bar, navigate to **Window** > **Package Manager**. +3. Click the plus sign ![plus sign](../../static/img/add.png) in the Package Manager status bar and select **Add package by name...**. +4. Enter `com.unity.multiplayer.tools` in the pop-up window and select **Add**. +5. After downloading, **Multiplayer Tools** appears under **Unity Technologies** in your **Package Manager** window. \ No newline at end of file diff --git a/tools_versioned_docs/version-1.0.0/profiler.md b/tools_versioned_docs/version-1.0.0/profiler.md new file mode 100644 index 000000000..0ed775208 --- /dev/null +++ b/tools_versioned_docs/version-1.0.0/profiler.md @@ -0,0 +1,129 @@ +--- +id: profiler +title: Network Profiler +sidebar_label: Network Profiler +--- +:::caution +This guide uses Unity 2021.3 LTS. + +On 2021.1 and below, the profiler outputs only simple statistics. +::: + +Profiling is the process of measuring the performance of your game while it is running. It allows you to check your optimization points and control that your enhancements make a real difference. + +In multiplayer game programming, you have three primary resources you need to keep under control: +- Bandwidth consumption +- CPU +- Latency + +These three resources are the three vertices of a triangle with a constant area. For example, reducing your bandwidth consumption will probably increase your CPU cost and latency by using compression algorithms or heavier serialization strategies. + +For this article, we will only focus on bandwidth profiling. You can find the official profiler documentation for CPU [here](https://docs.unity3d.com/Manual/ProfilerCPU.html). + +Regarding latency, it is a whole topic in itself, but remember that we are talking about the time taken for sending a packet here, not the network latency. Thus, a simple StopWatch on your serialization and compression algorithms should be sufficient to measure the CPU latency you are introducing here. + +## Prerequisites + +Starting from Unity 2021.1, the Unity Profiler can be extended with features to support profiling the network traffic of multiplayer games built using Netcode for Game Objects (Netcode). These features are available as part of the Network Profiler included in the Multiplayer Tools package. The Network Profiler enables you to profile the networking activity of your game in the same profiler that you use to profile CPU, GPU, and memory. + +To enable profiling support for Netcode, [install the Multiplayer Tools package](install-tools.md). + +You should now see two additional modules in your profiler (**Window** > **Analysis** > **Profiler**): +* Messages - Network messages sent to the transport +* Objects - Activity related to, and grouped by, network objects + +:::note +If you have the profiler window open when you install the tools package in 2020.3 or 2021.1, you may need to close and reopen the profiler window for the modules to appear. + +The network profiler samples its data by frame rate. Therefore, you may find the graphs a little spiky. +::: + +:::caution +Netcode for GameObjects does not update the legacy profiler modules **Network Messages** and **Network Operations**. +::: + +## Messages Module + +The following table includes the Messages the Netcode Profiler counts: + +| Message | Description | +| -- | -- | +| Total Bytes Sent | Total number of bytes sent during this frame | +| Total Bytes Received | Total number of bytes received during this frame | +| Named Message Bytes Sent | Total number of named message bytes sent to any connection in this frame | +| Named Message Bytes Received | Total number of named message bytes received in this frame | +| Unnamed Message Bytes Sent | Total number of unnamed message bytes sent to any connection in this frame | +| Unnamed Message Bytes Received | Total number of unnamed message bytes received in this frame | +| Scene Event Bytes Sent | Total number of scene event bytes sent during this frame | +| Scene Event Bytes Received | Total number of scene event bytes received during this frame | + +:::note +Messages sent to the local client (for example, a server in host mode sending RPCs to itself) appears greyed-out in the profiler to indicate that they may not actually be sent over the network. +::: + +## Objects Module + +The following table includes the Objects the Netcode Profiler counts: + +| Object | Description | +| -- | -- | +| Rpc Bytes Sent | Total number of remote procedure calls (RPCs) sent in this frame | +| Rpc Bytes Received | Total number of remote procedure calls (RPCs) received in this frame | +| Network Variable Delta Sent | Total number of network variables sent as a first-time update for an object | +| Network Variable Delta Received | Total number of network variables sent as a delta | +| Object Spawned Sent | Total number of spawned objects sent in this frame | +| Object Spawned Received | Total number of spawned objects received in this frame | +| Object Destroyed Sent | Total number of destroyed objects sent in this frame | +| Object Destroyed Received | Total number of destroyed objects received in this frame | +| Ownership Change Sent | Total number of ownership changes sent | +| Ownership Change Received | Total number of ownership changes received | + +## Known Issues for Versions Below 2021.2 + +* The profiler modules can be removed from the profiler by either using the **Restore Defaults** functionality or manually removing them. You can re-add them by re-opening the editor or recompiling a script. + +* If you remove the tools package, the profiler modules remain in the profiler but are not functional. You can remove them by using the **Restore Defaults** functionality or manually removing them. + +## Best Practices + +The profiler tool is capable of providing a lot of information and can be intimidating to determine the best strategy for optimization. Use the following best practices to make your optimization process easier. + +### Module elements and filtering results + +You can use the following filter rules to narrow your search results: + +| Rule | Description | +| -- | -- | +| t: | Filters by type | +| dir:in | Filters anything with bytes received | +| dir:out | Filters anything with bytes sent | +| b>N | Filters all events with bytes greater than N (N being an integer) | +| b **Netcode**, or when searching for it by name after pressing **Component** > **Add..**. + +:::note +You must have an object selected for these options to be available. +::: + +## Adding the Runtime Network Stats Monitor to a Scene + +To add the RNSM to your scene, you must add it as a component to an object: + +1. Select an object in your scene. +2. Add the RNSM commponent by either: + 1. Selecting **Add Component** in the **Inspector** tab, you can start typing `RuntimeNetStatsMonitor` in the search field to select the **RuntimeNetStatsMonitor** component. + + OR + + 2. Selecting **Add Component** in the **Inspector** tab, navigate to **Netcode** and select **RuntimeNetStatsMonitor**. + + OR + + 3. From the top menu bar, go to **Component** > **Netcode** > **RuntimeNetStatsMonitor**. + +:::bestpractice Best Practice +You can add the Runtime Network Stats Monitor component to any object in your scene and will work. However, you may want to consider creating an empty object specifically for the RNSM. +::: + +## Configuring + +You can configure the RNSM to your liking with its [Display Elements](#display-elements), [Panel Settings](#panel-settings), and [Styling](#styling-the-runtime-network-stats-monitor). Each of these settings can be found from the **Inspector** tab of the RNSM component. The RNSM package comes with default settings for each option that can be used "as is" or as guidance for creating your own. + +:::note +The default setting for the Display Elements, Panel Settings, and Styling are greyed out and not adjustable by default. To make modifications or build your own, you will need to create your own configuration presets. Instructions for each customization are below. +::: + +### Display Elements + +Each Display Element displays one or more stats that can be added, removed, or modified under the element's **Stats** field. + +#### To use the default Display Elements: + +1. It may already be the default in the **Configuration** field of the **Inspector** tab of the RNSM component. + +OR + +1. Open the RNSM component in the **Inspector** tab. +2. Click the circle to the right of the **Configuration** field. +3. Click the eye icon in the popup menu. +4. Search for `default` and select the **DefaultNetStatsMonitorConfiguration**. + +OR + +1. From the **Project** tab, go to **Packages** > **Multiplayer Tools** > **NetStatsMonitor** > **Assets** > **Configurations**. The default configuration for the RNSM is in this folder. +2. Select the `GameObject` with the RNSM component so that it appears in the **Inspector** tab. +3. Drag the default configuration asset from the **Project** tab to the **Configuration** field under the **RuntimeNetStatsMonitor** component of your `GameObject`. + +#### To configure your own Display Elements presets: + +1. Select the **Assets** folder under the **Project** tab. +2. Right-click in the **Assets** folder, then navigate to **Create** > **Multiplayer** and click on **NetStatsMonitorConfiguration**. +3. The configuration script appears under the **Assets** folder and also opens in the **Inspector** tab. +4. From the **Inspector** tab, you can use the + or - symbols to add each Display Element you want to include in this preset. Each field is configurable from here. +5. Once configured, you can add your Display Elements configuration preset to your RNSM `GameObject` by selecting the the RNSM `GameObject` to appear in the **Inspector** tab. +6. Your **Assets** folder should still be visible in the **Project** tab, so select your newly created configuration preset to drag and drop over the **Configuration** field under the **RuntimeNetStatsMonitor** component in the **Inspector** tab. +7. **Save** your scene. + +:::tip +We recommend using the default configuration as a guide to create your own for the RNSM. It can be found from the **Project** tab, go to **Packages** > **Multiplayer Tools** > **NetStatsMonitor** > **Assets** > **Configurations**. +::: + +### Panel Settings + +While working in the Unity Editor with the Runtime Network Stats Monitor, you may find your screen real estate to be difficult to work with. To help remedy these situations, you can use the default panel settings or create your own to set up your workspace exactly as you want it. + +#### To use the default Panel Settings: + +1. From the **Project** tab, go to **Packages** > **Multiplayer Tools** > **NetStatsMonitor** > **Implementation** > **UI** > **Resources**. The default panel settings configuration for the RNSM is in this folder: `UnityMpToolsRnsmDefaultPanelSettings.asset`. +2. Select the `GameObject` with the RNSM component so that it appears in the **Inspector** tab. +3. Drag the default panel setting asset from the **Project** tab to the **Panel Settings Override** field under the **RuntimeNetStatsMonitor** component of your `GameObject`. + +:::note +You can use the default Panel Settings for your RNSM or use it as a starting point for custom settings. Leaving the **Panel Settings Override** field blank enables the default settings. +::: + +#### To configure your own Panel Settings presets: + +1. Select the **Assets** folder under the **Project** tab. +2. Right-click in the **Assets** folder, then navigate to **Create** > **UI Toolkit** and click on **Panel Settings Asset**. +3. The configuration script appears under the **Assets** folder and also opens in the **Inspector** tab. +4. From the **Inspector** tab, you can adjust each of the fields to fit your screen needs. +5. Once configured, you can add your Panel Settings preset to your RNSM `GameObject` by selecting the the RNSM `GameObject` to appear in the **Inspector** tab. +6. Your **Assets** folder should still be visible in the **Project** tab, so select your newly created Panel Settings to drag and drop over the **Panel Settings Override** field under the **RuntimeNetStatsMonitor** component in the **Inspector** tab. +7. **Save** your scene. + +### Styling the Runtime Network Stats Monitor + +You can customize the styling of the RNSM by dragging and dropping a Unity Style Sheet (USS) onto the **Custom Style Sheet** field of the RNSM component from the **Inspector** tab. + +For more information about Unity Style Sheets (USS), see the Unity Documentation on [Styling the UI with USS](https://docs.unity3d.com/2021.2/Documentation/Manual/UIE-USS.html). + +:::note +You can use the default USS file for the RNSM to style your RNSM or use it as a starting point for custom styling. Leaving the **Custom Style Sheet** field blank enables the default style sheet. +::: + +#### To create a new style sheet for the RNSM: + +1. Select the **Assets** folder under the **Project** tab. +2. Right-click in the **Assets** folder, then navigate to **Create** > **UI Toolkit** and click on **Style Sheet**. +3. The new USS file appears under the **Assets** folder and also opens in the **Inspector** tab. +4. From the **Inspector** tab, you can use the + or - symbols to adjust each style element you want to include in this preset. Each field is configurable from here. You may find it easier to create or modify this file as a text file rather than with the **Inspector** ([Unity Style Sheets](https://docs.unity3d.com/2021.2/Documentation/Manual/UIE-USS.html) function similarly to Cascading Style Sheets). +5. Once configured, you can add your USS configuration preset to your RNSM `GameObject` by selecting the the RNSM `GameObject` to appear in the **Inspector** tab. +6. Your **Assets** folder should still be visible in the **Project** tab, so select your newly created style sheet to drag and drop over the **Custom Style Sheet** field under the **RuntimeNetStatsMonitor** component in the **Inspector** tab. +7. **Save** your scene. + +:::tip +We recommend using the default style sheet as a guide to create your own style sheet for the RNSM. It can be found from the **Project** tab under **Packages** > **Multiplayer Tools** > **NetStatsMonitor** > **Implementation** > **UI** > **Resources** > **UnityMpToolsRnsmDefaultStyleSheet.uss**. +::: + +#### USS Classes + +A full list of USS class names that you can use to style the RNSM can be found from the **Project** tab under **Packages** > **Multiplayer Tools** > **NetStatsMonitor** > **Configuration** > **UssClassNames.cs**. + +## Using Custom Data in the Runtime Network Stats Monitor + +To add custom data to the RNSM: + +1. Create your custom data as a `.cs` file (see example below) either in an editor of your choice to import into the **Assets** folder of the **Projects** tab. Or right-click in your **Assets** folder of the **Projects** tab, select **Create** > **C# Script**. The new `.cs` file opens in the **Inspector** tab that you can use the **Open** button to edit and save. +2. Once your custom data `.cs` file is ready, you can drag the file from your **Assets** folder to an object in your scene as a new component. + +:::best practice +Be sure your file name and class name match for your `.cs` file or it will not work. +::: + +Below is an example of custom data you can use with the RNSM. You can use this example as a guide to create your own custom data to explore with RNSM. Be sure to name this file as `CustomStats` to match the class name. + +```csharp +using Unity.Multiplayer.Tools.NetStats; +using Unity.Multiplayer.Tools.NetStatsMonitor; +using UnityEngine; + +// User-defined metrics can be defined using the MetricTypeEnum attribute +[MetricTypeEnum(DisplayName = "CustomMetric")] +enum CustomMetric +{ + // Metadata for each user-defined metric can be defined using the MetricMetadata Attribute + + [MetricMetadata(Units = Units.Hertz, MetricKind = MetricKind.Gauge)] + Framerate, + + [MetricMetadata(Units = Units.None, MetricKind = MetricKind.Gauge)] + TriangleCount, + + [MetricMetadata(Units = Units.None, MetricKind = MetricKind.Gauge, DisplayAsPercentage = true)] + CpuUsage, +} + +public class CustomStats : MonoBehaviour +{ + RuntimeNetStatsMonitor m_NetStatsMonitor; + + void Start() + { + m_NetStatsMonitor = FindObjectOfType(); + } + + void Update() + { + // Once you have access to an instance of the RuntimeNetStatsMonitor + // you can provide custom data to it using AddCustomValue, + // using an enum with the MetricTypeEnum attribute. + + m_NetStatsMonitor.AddCustomValue( + MetricId.Create(CustomMetric.Framerate), + Random.Range(40, 60f)); + + m_NetStatsMonitor.AddCustomValue( + MetricId.Create(CustomMetric.TriangleCount), + Random.Range(10000, 100000)); + + m_NetStatsMonitor.AddCustomValue( + MetricId.Create(CustomMetric.CpuUsage), + Random.Range(0.05f, 0.4f)); + } +} +``` + +## Including/Excluding the Runtime Network Stats Monitor in Builds + +To allow you to save space and other resources from builds, such as on mobile, the RNSM implementation can be included/excluded from a build independently from its interface (the RNSM component). + +:::note +By default, after adding the **Multiplayer Tools** package, the Runtime Network Stats Monitor is included in the editor, included in development builds, and is not included in release builds. +::: + +### Excluding the RNSM from Development Builds + +By default, the RNSM implementation is included in development builds. The RNSM can be excluded from development builds either by: + +1. Navigating to the Unity Editor top bar menu > **Edit** > **Project Settings...** > **Multiplayer Tools** > **Net Stats Monitor**, then uncheck **Include in Develop Builds**. + +OR + +1. Navigating to the Unity Editor top bar menu > **Edit** > **Project Settings...** > **Player**. +2. Select the **Other Settings** dropdown. +3. Scroll to **Script Compilation** > **Scripting Define Symbols**. +4. Add `UNITY_MP_TOOLS_NET_STATS_MONITOR_DISABLED_IN_DEVELOP` in the empty field. If the field isn't empty, you can select the plus symbol. +5. Click **Apply** for the script to compile. + +### Including the RNSM in Release Builds + +By default, the RNSM implementation is not included in release builds. The RNSM can be included in release builds either by: + +1. Navigating to the Unity Editor top bar menu > **Edit** > **Project Settings...** > **Multiplayer Tools** > **Net Stats Monitor**, then check **Include in Release Builds**. + +OR + +1. Navigating to the Unity Editor top bar menu > **Edit** > **Project Settings...** > **Player**. +2. Select the **Other Settings** dropdown. +3. Scroll to **Script Compilation** > **Scripting Define Symbols**. +4. Add `UNITY_MP_TOOLS_NET_STATS_MONITOR_ENABLED_IN_RELEASE` in the empty field. If the field isn't empty, you can select the plus symbol. +5. Click **Apply** for the script to compile. + +### Including the RNSM in All Builds + +You can forcibly enable the RNSM in all builds by: + +1. Navigating to the Unity Editor top bar menu > **Edit** > **Project Settings...** > **Player**. +2. Select the **Other Settings** dropdown. +3. Scroll to **Script Compilation** > **Scripting Define Symbols**. +4. Add `UNITY_MP_TOOLS_NET_STATS_MONITOR_IMPLEMENTATION_ENABLED` in the empty field. If the field isn't empty, you can select the plus symbol. +5. Click **Apply** for the script to compile. + +:::important +This option takes precedence over the other options to exclude the RNSM from development builds. +::: \ No newline at end of file diff --git a/tools_versioned_sidebars/version-1.0.0-sidebars.json b/tools_versioned_sidebars/version-1.0.0-sidebars.json new file mode 100644 index 000000000..b6c644ef9 --- /dev/null +++ b/tools_versioned_sidebars/version-1.0.0-sidebars.json @@ -0,0 +1,146 @@ +{ + "version-1.0.0/tools": [ + { + "type": "doc", + "id": "version-1.0.0/install-tools" + }, + { + "type": "doc", + "id": "version-1.0.0/profiler" + }, + { + "type": "doc", + "id": "version-1.0.0/RNSM" + } + ], + "version-1.0.0/api": [ + { + "type": "doc", + "id": "version-1.0.0/api/introduction" + }, + { + "collapsed": true, + "type": "category", + "label": "Editor", + "items": [ + { + "type": "doc", + "id": "version-1.0.0/api/Unity.Multiplayer.Tools.Editor" + }, + { + "type": "doc", + "id": "version-1.0.0/api/Unity.Multiplayer.Tools.Editor.NetStatsMonitorBuildSettings" + } + ] + }, + { + "collapsed": true, + "type": "category", + "label": "Metric Types", + "items": [ + { + "type": "doc", + "id": "version-1.0.0/api/Unity.Multiplayer.Tools.MetricTypes" + }, + { + "type": "doc", + "id": "version-1.0.0/api/Unity.Multiplayer.Tools.MetricTypes.DirectedMetricType" + } + ] + }, + { + "collapsed": true, + "type": "category", + "label": "Net Stats", + "items": [ + { + "type": "doc", + "id": "version-1.0.0/api/Unity.Multiplayer.Tools.NetStats" + }, + { + "type": "doc", + "id": "version-1.0.0/api/Unity.Multiplayer.Tools.NetStats.MetricId" + }, + { + "type": "doc", + "id": "version-1.0.0/api/Unity.Multiplayer.Tools.NetStats.MetricKind" + }, + { + "type": "doc", + "id": "version-1.0.0/api/Unity.Multiplayer.Tools.NetStats.MetricMetadataAttribute" + }, + { + "type": "doc", + "id": "version-1.0.0/api/Unity.Multiplayer.Tools.NetStats.MetricTypeEnumAttribute" + }, + { + "type": "doc", + "id": "version-1.0.0/api/Unity.Multiplayer.Tools.NetStats.Units" + } + ] + }, + { + "collapsed": true, + "type": "category", + "label": "Net Stats Monitor", + "items": [ + { + "type": "doc", + "id": "version-1.0.0/api/Unity.Multiplayer.Tools.NetStatsMonitor" + }, + { + "type": "doc", + "id": "version-1.0.0/api/Unity.Multiplayer.Tools.NetStatsMonitor.AggregationMethod" + }, + { + "type": "doc", + "id": "version-1.0.0/api/Unity.Multiplayer.Tools.NetStatsMonitor.CounterConfiguration" + }, + { + "type": "doc", + "id": "version-1.0.0/api/Unity.Multiplayer.Tools.NetStatsMonitor.DisplayElementConfiguration" + }, + { + "type": "doc", + "id": "version-1.0.0/api/Unity.Multiplayer.Tools.NetStatsMonitor.DisplayElementType" + }, + { + "type": "doc", + "id": "version-1.0.0/api/Unity.Multiplayer.Tools.NetStatsMonitor.ExponentialMovingAverageParams" + }, + { + "type": "doc", + "id": "version-1.0.0/api/Unity.Multiplayer.Tools.NetStatsMonitor.GraphConfiguration" + }, + { + "type": "doc", + "id": "version-1.0.0/api/Unity.Multiplayer.Tools.NetStatsMonitor.GraphXAxisType" + }, + { + "type": "doc", + "id": "version-1.0.0/api/Unity.Multiplayer.Tools.NetStatsMonitor.LineGraphConfiguration" + }, + { + "type": "doc", + "id": "version-1.0.0/api/Unity.Multiplayer.Tools.NetStatsMonitor.NetStatsMonitorConfiguration" + }, + { + "type": "doc", + "id": "version-1.0.0/api/Unity.Multiplayer.Tools.NetStatsMonitor.PositionConfiguration" + }, + { + "type": "doc", + "id": "version-1.0.0/api/Unity.Multiplayer.Tools.NetStatsMonitor.RuntimeNetStatsMonitor" + }, + { + "type": "doc", + "id": "version-1.0.0/api/Unity.Multiplayer.Tools.NetStatsMonitor.SimpleMovingAverageParams" + }, + { + "type": "doc", + "id": "version-1.0.0/api/Unity.Multiplayer.Tools.NetStatsMonitor.SmoothingMethod" + } + ] + } + ] +} diff --git a/tools_versions.json b/tools_versions.json index dde32982b..6d8eb78d1 100644 --- a/tools_versions.json +++ b/tools_versions.json @@ -1,3 +1,4 @@ [ + "1.0.0", "current" ] From 877cb4467b8169c4ad1639cacd36e4314ca5b876 Mon Sep 17 00:00:00 2001 From: Larah Armstrong <29762984+armstrongl@users.noreply.github.com> Date: Tue, 22 Nov 2022 13:54:46 -0600 Subject: [PATCH 7/7] Add Tools 1.1.0 SDK documentation --- sidebarsTools.js | 95 ++++ ...tp2.Ngo1WithUtp2AdapterInitializerTests.md | 112 +++++ ...layer.Tools.Adapters.Tests.Ngo1WithUtp2.md | 26 + ...mon.Tests.ExponentialMovingAverageTests.md | 229 +++++++++ .../Unity.Multiplayer.Tools.Common.Tests.md | 26 + ...ols.Editor.NetStatsMonitorBuildSettings.md | 152 +++--- tools/api/Unity.Multiplayer.Tools.Editor.md | 30 +- ...er.Tools.MetricTypes.DirectedMetricType.md | 189 ++------ ...MetricTypes.Tests.MetricTypeStringTests.md | 244 ++++++++++ ...ity.Multiplayer.Tools.MetricTypes.Tests.md | 26 + .../Unity.Multiplayer.Tools.MetricTypes.md | 26 +- ...semblyRequiresTypeRegistrationAttribute.md | 355 ++++++++++++++ ...ity.Multiplayer.Tools.NetStats.MetricId.md | 171 +++++-- ...ayer.Tools.NetStats.MetricIdTypeLibrary.md | 127 +++++ ...y.Multiplayer.Tools.NetStats.MetricKind.md | 57 +-- ....Tools.NetStats.MetricMetadataAttribute.md | 446 ++++++++---------- ....Tools.NetStats.MetricTypeEnumAttribute.md | 384 +++++++++++---- ...Tools.NetStats.Tests.MetricFactoryTests.md | 193 ++++++++ ...NetStats.Tests.MetricIdTypeLibraryTests.md | 176 +++++++ .../Unity.Multiplayer.Tools.NetStats.Tests.md | 32 ++ .../Unity.Multiplayer.Tools.NetStats.Units.md | 68 +-- tools/api/Unity.Multiplayer.Tools.NetStats.md | 65 ++- ...Tools.NetStatsMonitor.AggregationMethod.md | 53 +-- ...ls.NetStatsMonitor.CounterConfiguration.md | 244 ++++------ ...tatsMonitor.DisplayElementConfiguration.md | 170 +++---- ...ools.NetStatsMonitor.DisplayElementType.md | 58 +-- ...sMonitor.ExponentialMovingAverageParams.md | 113 ++--- ...ools.NetStatsMonitor.GraphConfiguration.md | 193 ++++---- ...er.Tools.NetStatsMonitor.GraphXAxisType.md | 53 +-- ....NetStatsMonitor.LineGraphConfiguration.md | 116 ++--- ...atsMonitor.NetStatsMonitorConfiguration.md | 82 ++-- ...s.NetStatsMonitor.PositionConfiguration.md | 146 +++--- ....NetStatsMonitor.RuntimeNetStatsMonitor.md | 148 ++++-- ...player.Tools.NetStatsMonitor.SampleRate.md | 42 ++ ...tStatsMonitor.SimpleMovingAverageParams.md | 137 +++++- ...r.Tools.NetStatsMonitor.SmoothingMethod.md | 35 +- ...Unity.Multiplayer.Tools.NetStatsMonitor.md | 112 ++++- ....Editor.UI.PropertyDrawers.MinMaxDrawer.md | 66 +++ ...workSimulator.Editor.UI.PropertyDrawers.md | 26 + ...cenarios.ConnectionsCycle.Configuration.md | 130 +++++ ...ntime.BuiltInScenarios.ConnectionsCycle.md | 199 ++++++++ ...me.BuiltInScenarios.PresetConfiguration.md | 128 +++++ ...ios.RandomConnectionsSwap.Configuration.md | 103 ++++ ....BuiltInScenarios.RandomConnectionsSwap.md | 226 +++++++++ ...tworkSimulator.Runtime.BuiltInScenarios.md | 63 +++ ...workSimulator.Runtime.INetworkEventsApi.md | 218 +++++++++ ...mulator.Runtime.INetworkSimulatorPreset.md | 176 +++++++ ...kSimulator.Runtime.MinMaxRangeAttribute.md | 134 ++++++ ...etworkSimulator.Runtime.NetworkScenario.md | 224 +++++++++ ...ulator.Runtime.NetworkScenarioBehaviour.md | 155 ++++++ ...rkSimulator.Runtime.NetworkScenarioTask.md | 214 +++++++++ ...tworkSimulator.Runtime.NetworkSimulator.md | 214 +++++++++ ...imulator.Runtime.NetworkSimulatorPreset.md | 416 ++++++++++++++++ ...tor.Runtime.NetworkSimulatorPresetAsset.md | 247 ++++++++++ ...mulator.Runtime.NetworkSimulatorPresets.md | 381 +++++++++++++++ ...tiplayer.Tools.NetworkSimulator.Runtime.md | 108 +++++ ...yer.Tools.Tests.Editor.BuildSymbolTests.md | 106 +++++ .../Unity.Multiplayer.Tools.Tests.Editor.md | 26 + 58 files changed, 6932 insertions(+), 1559 deletions(-) create mode 100644 tools/api/Unity.Multiplayer.Tools.Adapters.Tests.Ngo1WithUtp2.Ngo1WithUtp2AdapterInitializerTests.md create mode 100644 tools/api/Unity.Multiplayer.Tools.Adapters.Tests.Ngo1WithUtp2.md create mode 100644 tools/api/Unity.Multiplayer.Tools.Common.Tests.ExponentialMovingAverageTests.md create mode 100644 tools/api/Unity.Multiplayer.Tools.Common.Tests.md create mode 100644 tools/api/Unity.Multiplayer.Tools.MetricTypes.Tests.MetricTypeStringTests.md create mode 100644 tools/api/Unity.Multiplayer.Tools.MetricTypes.Tests.md create mode 100644 tools/api/Unity.Multiplayer.Tools.NetStats.AssemblyRequiresTypeRegistrationAttribute.md create mode 100644 tools/api/Unity.Multiplayer.Tools.NetStats.MetricIdTypeLibrary.md create mode 100644 tools/api/Unity.Multiplayer.Tools.NetStats.Tests.MetricFactoryTests.md create mode 100644 tools/api/Unity.Multiplayer.Tools.NetStats.Tests.MetricIdTypeLibraryTests.md create mode 100644 tools/api/Unity.Multiplayer.Tools.NetStats.Tests.md create mode 100644 tools/api/Unity.Multiplayer.Tools.NetStatsMonitor.SampleRate.md create mode 100644 tools/api/Unity.Multiplayer.Tools.NetworkSimulator.Editor.UI.PropertyDrawers.MinMaxDrawer.md create mode 100644 tools/api/Unity.Multiplayer.Tools.NetworkSimulator.Editor.UI.PropertyDrawers.md create mode 100644 tools/api/Unity.Multiplayer.Tools.NetworkSimulator.Runtime.BuiltInScenarios.ConnectionsCycle.Configuration.md create mode 100644 tools/api/Unity.Multiplayer.Tools.NetworkSimulator.Runtime.BuiltInScenarios.ConnectionsCycle.md create mode 100644 tools/api/Unity.Multiplayer.Tools.NetworkSimulator.Runtime.BuiltInScenarios.PresetConfiguration.md create mode 100644 tools/api/Unity.Multiplayer.Tools.NetworkSimulator.Runtime.BuiltInScenarios.RandomConnectionsSwap.Configuration.md create mode 100644 tools/api/Unity.Multiplayer.Tools.NetworkSimulator.Runtime.BuiltInScenarios.RandomConnectionsSwap.md create mode 100644 tools/api/Unity.Multiplayer.Tools.NetworkSimulator.Runtime.BuiltInScenarios.md create mode 100644 tools/api/Unity.Multiplayer.Tools.NetworkSimulator.Runtime.INetworkEventsApi.md create mode 100644 tools/api/Unity.Multiplayer.Tools.NetworkSimulator.Runtime.INetworkSimulatorPreset.md create mode 100644 tools/api/Unity.Multiplayer.Tools.NetworkSimulator.Runtime.MinMaxRangeAttribute.md create mode 100644 tools/api/Unity.Multiplayer.Tools.NetworkSimulator.Runtime.NetworkScenario.md create mode 100644 tools/api/Unity.Multiplayer.Tools.NetworkSimulator.Runtime.NetworkScenarioBehaviour.md create mode 100644 tools/api/Unity.Multiplayer.Tools.NetworkSimulator.Runtime.NetworkScenarioTask.md create mode 100644 tools/api/Unity.Multiplayer.Tools.NetworkSimulator.Runtime.NetworkSimulator.md create mode 100644 tools/api/Unity.Multiplayer.Tools.NetworkSimulator.Runtime.NetworkSimulatorPreset.md create mode 100644 tools/api/Unity.Multiplayer.Tools.NetworkSimulator.Runtime.NetworkSimulatorPresetAsset.md create mode 100644 tools/api/Unity.Multiplayer.Tools.NetworkSimulator.Runtime.NetworkSimulatorPresets.md create mode 100644 tools/api/Unity.Multiplayer.Tools.NetworkSimulator.Runtime.md create mode 100644 tools/api/Unity.Multiplayer.Tools.Tests.Editor.BuildSymbolTests.md create mode 100644 tools/api/Unity.Multiplayer.Tools.Tests.Editor.md diff --git a/sidebarsTools.js b/sidebarsTools.js index 384d35593..fb884a347 100644 --- a/sidebarsTools.js +++ b/sidebarsTools.js @@ -82,6 +82,14 @@ module.exports = { "type": "doc", "id": "api/Unity.Multiplayer.Tools.NetStats.Units", }, + { + "type": "doc", + "id": "api/Unity.Multiplayer.Tools.NetStats.MetricIdTypeLibrary", + }, + { + "type": "doc", + "id": "api/Unity.Multiplayer.Tools.NetStats.AssemblyRequiresTypeRegistrationAttribute", + }, ], }, { @@ -145,6 +153,93 @@ module.exports = { "type": "doc", "id": "api/Unity.Multiplayer.Tools.NetStatsMonitor.SmoothingMethod", }, + { + "type": "doc", + "id": "api/Unity.Multiplayer.Tools.NetStatsMonitor.SampleRate", + }, + ], + }, + { + "collapsed": true, + "type": "category", + "label": "Network Simulator", + "items": [ + { + "type": "doc", + "id": "api/Unity.Multiplayer.Tools.NetworkSimulator.Runtime", + }, + { + "type": "doc", + "id": "api/Unity.Multiplayer.Tools.NetworkSimulator.Runtime.BuiltInScenarios", + }, + { + "type": "doc", + "id": "api/Unity.Multiplayer.Tools.NetworkSimulator.Runtime.BuiltInScenarios.ConnectionsCycle", + }, + { + "type": "doc", + "id": "api/Unity.Multiplayer.Tools.NetworkSimulator.Runtime.BuiltInScenarios.ConnectionsCycle.Configuration", + }, + { + "type": "doc", + "id": "api/Unity.Multiplayer.Tools.NetworkSimulator.Runtime.BuiltInScenarios.PresetConfiguration", + }, + { + "type": "doc", + "id": "api/Unity.Multiplayer.Tools.NetworkSimulator.Runtime.BuiltInScenarios.RandomConnectionsSwap", + }, + { + "type": "doc", + "id": "api/Unity.Multiplayer.Tools.NetworkSimulator.Runtime.BuiltInScenarios.RandomConnectionsSwap.Configuration", + }, + { + "type": "doc", + "id": "api/Unity.Multiplayer.Tools.NetworkSimulator.Runtime.INetworkEventsApi", + }, + { + "type": "doc", + "id": "api/Unity.Multiplayer.Tools.NetworkSimulator.Runtime.INetworkSimulatorPreset", + }, + { + "type": "doc", + "id": "api/Unity.Multiplayer.Tools.NetworkSimulator.Runtime.MinMaxRangeAttribute", + }, + { + "type": "doc", + "id": "api/Unity.Multiplayer.Tools.NetworkSimulator.Runtime.NetworkScenario", + }, + { + "type": "doc", + "id": "api/Unity.Multiplayer.Tools.NetworkSimulator.Runtime.NetworkScenarioBehaviour", + }, + { + "type": "doc", + "id": "api/Unity.Multiplayer.Tools.NetworkSimulator.Runtime.NetworkScenarioTask", + }, + { + "type": "doc", + "id": "api/Unity.Multiplayer.Tools.NetworkSimulator.Runtime.NetworkSimulator", + }, + { + "type": "doc", + "id": "api/Unity.Multiplayer.Tools.NetworkSimulator.Runtime.NetworkSimulatorPreset", + }, + { + "type": "doc", + "id": "api/Unity.Multiplayer.Tools.NetworkSimulator.Runtime.NetworkSimulatorPresetAsset", + }, + { + "type": "doc", + "id": "api/Unity.Multiplayer.Tools.NetworkSimulator.Runtime.NetworkSimulatorPresets", + }, + { + "type": "doc", + "id": "api/Unity.Multiplayer.Tools.NetworkSimulator.Editor.UI.PropertyDrawers", + }, + { + "type": "doc", + "id": "api/Unity.Multiplayer.Tools.NetworkSimulator.Editor.UI.PropertyDrawers.MinMaxDrawer", + }, ], }, ], diff --git a/tools/api/Unity.Multiplayer.Tools.Adapters.Tests.Ngo1WithUtp2.Ngo1WithUtp2AdapterInitializerTests.md b/tools/api/Unity.Multiplayer.Tools.Adapters.Tests.Ngo1WithUtp2.Ngo1WithUtp2AdapterInitializerTests.md new file mode 100644 index 000000000..9a7e0a5d0 --- /dev/null +++ b/tools/api/Unity.Multiplayer.Tools.Adapters.Tests.Ngo1WithUtp2.Ngo1WithUtp2AdapterInitializerTests.md @@ -0,0 +1,112 @@ +--- +id: Unity.Multiplayer.Tools.Adapters.Tests.Ngo1WithUtp2.Ngo1WithUtp2AdapterInitializerTests +title: Unity.Multiplayer.Tools.Adapters.Tests.Ngo1WithUtp2.Ngo1WithUtp2AdapterInitializerTests +--- + +
    + +
    + +
    + +
    + +
    + +##### Inheritance + +
    + +System.Dynamic.ExpandoObject + +
    + +
    + +System.Dynamic.ExpandoObject + +
    + +
    + +
    + +##### Inherited Members + +
    + +Object.ToString() + +
    + +
    + +Object.Equals(Object) + +
    + +
    + +Object.Equals(Object, Object) + +
    + +
    + +Object.ReferenceEquals(Object, Object) + +
    + +
    + +Object.GetHashCode() + +
    + +
    + +Object.GetType() + +
    + +
    + +Object.MemberwiseClone() + +
    + +
    + +##### **Namespace**: System.Dynamic.ExpandoObject + +##### **Assembly**: Tools.dll + +##### Syntax + +``` lang-csharp +public class Ngo1WithUtp2AdapterInitializerTests +``` + +## Methods + +### Ngo1WithUtp2AdapterInitializer_WhenNgo1AndUtp2AreInitialized_RegistersAdapter() + +
    + +
    + +
    + +
    + +#### Declaration + +``` lang-csharp +public IEnumerator Ngo1WithUtp2AdapterInitializer_WhenNgo1AndUtp2AreInitialized_RegistersAdapter() +``` + +#### Returns + +| Type | Description | +|--------------------------------|-------------| +| System.Collections.IEnumerator | | diff --git a/tools/api/Unity.Multiplayer.Tools.Adapters.Tests.Ngo1WithUtp2.md b/tools/api/Unity.Multiplayer.Tools.Adapters.Tests.Ngo1WithUtp2.md new file mode 100644 index 000000000..f22e4cff3 --- /dev/null +++ b/tools/api/Unity.Multiplayer.Tools.Adapters.Tests.Ngo1WithUtp2.md @@ -0,0 +1,26 @@ +--- +id: Unity.Multiplayer.Tools.Adapters.Tests.Ngo1WithUtp2 +title: Unity.Multiplayer.Tools.Adapters.Tests.Ngo1WithUtp2 +--- + +## Namespace Unity.Multiplayer.Tools.Adapters.Tests.Ngo1WithUtp2 + +
    + +
    + +
    + +
    + +
    + +
    + +## Classes + +### Unity.Multiplayer.Tools.Adapters.Tests.Ngo1WithUtp2.Ngo1WithUtp2AdapterInitializerTests + +
    + +
    diff --git a/tools/api/Unity.Multiplayer.Tools.Common.Tests.ExponentialMovingAverageTests.md b/tools/api/Unity.Multiplayer.Tools.Common.Tests.ExponentialMovingAverageTests.md new file mode 100644 index 000000000..fd2a83241 --- /dev/null +++ b/tools/api/Unity.Multiplayer.Tools.Common.Tests.ExponentialMovingAverageTests.md @@ -0,0 +1,229 @@ +--- +id: Unity.Multiplayer.Tools.Common.Tests.ExponentialMovingAverageTests +title: Unity.Multiplayer.Tools.Common.Tests.ExponentialMovingAverageTests +--- + +
    + +
    + +
    + +
    + +
    + +##### Inheritance + +
    + +System.Dynamic.ExpandoObject + +
    + +
    + +System.Dynamic.ExpandoObject + +
    + +
    + +
    + +##### Inherited Members + +
    + +Object.ToString() + +
    + +
    + +Object.Equals(Object) + +
    + +
    + +Object.Equals(Object, Object) + +
    + +
    + +Object.ReferenceEquals(Object, Object) + +
    + +
    + +Object.GetHashCode() + +
    + +
    + +Object.GetType() + +
    + +
    + +Object.MemberwiseClone() + +
    + +
    + +##### **Namespace**: System.Dynamic.ExpandoObject + +##### **Assembly**: Tools.dll + +##### Syntax + +``` lang-csharp +[Obsolete("This test class has been marked obsolete because it was not intended to be a public API", false)] +public class ExponentialMovingAverageTests +``` + +## Methods + +### ApproximatingSimpleMovingAverageIsCorrect(Int32) + +
    + +
    + +
    + +
    + +#### Declaration + +``` lang-csharp +[Obsolete("This test method has been marked obsolete because it was not intended to be part of the public API", false)] +public void ApproximatingSimpleMovingAverageIsCorrect(int sampleCount) +``` + +#### Parameters + +| Type | Name | Description | +|--------------|-------------|-------------| +| System.Int32 | sampleCount | | + +### InitializedCorrectlyWithOneArgument(Single) + +
    + +
    + +
    + +
    + +#### Declaration + +``` lang-csharp +[Obsolete("This test method has been marked obsolete because it was not intended to be part of the public API", false)] +public void InitializedCorrectlyWithOneArgument(float parameter = 0F) +``` + +#### Parameters + +| Type | Name | Description | +|---------------|-----------|-------------| +| System.Single | parameter | | + +### InitializedCorrectlyWithTwoArguments(Single, Single) + +
    + +
    + +
    + +
    + +#### Declaration + +``` lang-csharp +[Obsolete("This test method has been marked obsolete because it was not intended to be part of the public API", false)] +public void InitializedCorrectlyWithTwoArguments(float parameter = 0F, float initialValue = 0F) +``` + +#### Parameters + +| Type | Name | Description | +|---------------|--------------|-------------| +| System.Single | parameter | | +| System.Single | initialValue | | + +### ValueDecaysFromInitialValueWithZeroInput() + +
    + +
    + +
    + +
    + +#### Declaration + +``` lang-csharp +[Obsolete("This test method has been marked obsolete because it was not intended to be part of the public API", false)] +public void ValueDecaysFromInitialValueWithZeroInput() +``` + +### ValueIsComputedCorrectlyInResponseToVaryingInput() + +
    + +
    + +
    + +
    + +#### Declaration + +``` lang-csharp +[Obsolete("This test method has been marked obsolete because it was not intended to be part of the public API", false)] +public void ValueIsComputedCorrectlyInResponseToVaryingInput() +``` + +### ValueRemainsConstantWithConstantInput() + +
    + +
    + +
    + +
    + +#### Declaration + +``` lang-csharp +[Obsolete("This test method has been marked obsolete because it was not intended to be part of the public API", false)] +public void ValueRemainsConstantWithConstantInput() +``` + +### ValueRisesToMeetConstantInputWhenStartingFromZero() + +
    + +
    + +
    + +
    + +#### Declaration + +``` lang-csharp +[Obsolete("This test method has been marked obsolete because it was not intended to be part of the public API", false)] +public void ValueRisesToMeetConstantInputWhenStartingFromZero() +``` diff --git a/tools/api/Unity.Multiplayer.Tools.Common.Tests.md b/tools/api/Unity.Multiplayer.Tools.Common.Tests.md new file mode 100644 index 000000000..464e413e2 --- /dev/null +++ b/tools/api/Unity.Multiplayer.Tools.Common.Tests.md @@ -0,0 +1,26 @@ +--- +id: Unity.Multiplayer.Tools.Common.Tests +title: Unity.Multiplayer.Tools.Common.Tests +--- + +## Namespace Unity.Multiplayer.Tools.Common.Tests + +
    + +
    + +
    + +
    + +
    + +
    + +## Classes + +### Unity.Multiplayer.Tools.Common.Tests.ExponentialMovingAverageTests + +
    + +
    diff --git a/tools/api/Unity.Multiplayer.Tools.Editor.NetStatsMonitorBuildSettings.md b/tools/api/Unity.Multiplayer.Tools.Editor.NetStatsMonitorBuildSettings.md index 9e00f6d31..8789c37f7 100644 --- a/tools/api/Unity.Multiplayer.Tools.Editor.NetStatsMonitorBuildSettings.md +++ b/tools/api/Unity.Multiplayer.Tools.Editor.NetStatsMonitorBuildSettings.md @@ -1,189 +1,167 @@ +--- +id: Unity.Multiplayer.Tools.Editor.NetStatsMonitorBuildSettings +title: Unity.Multiplayer.Tools.Editor.NetStatsMonitorBuildSettings --- -id: Unity.Multiplayer.Tools.Editor.NetStatsMonitorBuildSettings -title: Unity.Multiplayer.Tools.Editor.NetStatsMonitorBuildSettings ---- - -# Class NetStatsMonitorBuildSettings - +
    Methods to control whether the Runtime Net Stats Monitor is included in the build. When making automated builds of your project, you can use this to dynamically control whether the monitor is included in release or development builds. +
    +
    +
    - - - - +
    ##### Inheritance +
    +System.Dynamic.ExpandoObject -System.Object - - - - - -NetStatsMonitorBuildSettings - +
    +
    +System.Dynamic.ExpandoObject +
    +
    +
    ##### Inherited Members +
    +Object.ToString() -System.Object.Equals(System.Object) - - - +
    +
    -System.Object.Equals(System.Object, System.Object) +Object.Equals(Object) +
    +
    +Object.Equals(Object, Object) +
    -System.Object.GetHashCode() +
    +Object.ReferenceEquals(Object, Object) +
    +
    +Object.GetHashCode() -System.Object.GetType() +
    +
    +Object.GetType() +
    +
    -System.Object.MemberwiseClone() +Object.MemberwiseClone() +
    +
    +##### **Namespace**: System.Dynamic.ExpandoObject - -System.Object.ReferenceEquals(System.Object, System.Object) - - - - - -System.Object.ToString() - - - - - -###### **Namespace**: Unity.Multiplayer.Tools.Editor - -###### **Assembly**: Tools.dll +##### **Assembly**: Tools.dll ##### Syntax - - ``` lang-csharp public static class NetStatsMonitorBuildSettings ``` +## Methods +### DisableInDevelopForAllBuildTargets() -### Methods - -#### DisableInDevelopForAllBuildTargets() - - +
    Disables the RNSM in development builds for all build targets +
    +
    +
    - - - -##### Declaration - - +#### Declaration ``` lang-csharp public static void DisableInDevelopForAllBuildTargets() ``` +### DisableInReleaseForAllBuildTargets() - -#### DisableInReleaseForAllBuildTargets() - - +
    Disables the RNSM in release builds for all build targets +
    +
    +
    - - - -##### Declaration - - +#### Declaration ``` lang-csharp public static void DisableInReleaseForAllBuildTargets() ``` +### EnableInDevelopForAllBuildTargets() - -#### EnableInDevelopForAllBuildTargets() - - +
    Enables the RNSM in development builds for all build targets +
    +
    +
    - - - -##### Declaration - - +#### Declaration ``` lang-csharp public static void EnableInDevelopForAllBuildTargets() ``` +### EnableInReleaseForAllBuildTargets() - -#### EnableInReleaseForAllBuildTargets() - - +
    Enables the RNSM in release builds for all build targets +
    +
    +
    - - - -##### Declaration - - +#### Declaration ``` lang-csharp public static void EnableInReleaseForAllBuildTargets() ``` - - diff --git a/tools/api/Unity.Multiplayer.Tools.Editor.md b/tools/api/Unity.Multiplayer.Tools.Editor.md index 5e4e87718..afcbd28cd 100644 --- a/tools/api/Unity.Multiplayer.Tools.Editor.md +++ b/tools/api/Unity.Multiplayer.Tools.Editor.md @@ -1,13 +1,31 @@ +--- +id: Unity.Multiplayer.Tools.Editor +title: Unity.Multiplayer.Tools.Editor --- -id: Unity.Multiplayer.Tools.Editor -title: Unity.Multiplayer.Tools.Editor ---- -### Classes +## Namespace Unity.Multiplayer.Tools.Editor + +
    + +
    + +
    + +
    -#### NetStatsMonitorBuildSettings +
    + +
    + +## Classes + +### Unity.Multiplayer.Tools.Editor.NetStatsMonitorBuildSettings + +
    Methods to control whether the Runtime Net Stats Monitor is included in the build. When making automated builds of your project, you can use this to dynamically control whether the monitor is included in release -or development builds. \ No newline at end of file +or development builds. + +
    diff --git a/tools/api/Unity.Multiplayer.Tools.MetricTypes.DirectedMetricType.md b/tools/api/Unity.Multiplayer.Tools.MetricTypes.DirectedMetricType.md index 1ad929276..a4390ab5c 100644 --- a/tools/api/Unity.Multiplayer.Tools.MetricTypes.DirectedMetricType.md +++ b/tools/api/Unity.Multiplayer.Tools.MetricTypes.DirectedMetricType.md @@ -1,165 +1,58 @@ +--- +id: Unity.Multiplayer.Tools.MetricTypes.DirectedMetricType +title: Unity.Multiplayer.Tools.MetricTypes.DirectedMetricType --- -id: Unity.Multiplayer.Tools.MetricTypes.DirectedMetricType -title: Unity.Multiplayer.Tools.MetricTypes.DirectedMetricType ---- - - - - - -# Enum DirectedMetricType - +
    The built in set of metrics that can be displayed in the multiplayer tools, such as the Network Profiler and the Runtime Net Stats Monitor. +
    +
    +
    +##### **Namespace**: System.Dynamic.ExpandoObject - - -###### **Namespace**: Unity.Multiplayer.Tools.MetricTypes - -###### **Assembly**: Tools.dll +##### **Assembly**: Tools.dll ##### Syntax - - ``` lang-csharp public enum DirectedMetricType ``` - - -### Fields - -Name - - - - - - - - - -Description - -Connections - -Number of active network connections. A client will always show one -active connection (client to server). - -NamedMessageReceived - -Number of custom named message received. - -NamedMessageSent - -Number of custom named message sent. - -NetworkMessageReceived - -Number of network message received. - -NetworkMessageSent - -Number of network message sent. - -NetworkObjects - -Number of active Network Objects. - -NetworkVariableDeltaReceived - -Number of network variable delta message received. - -NetworkVariableDeltaSent - -Number of network variable delta message sent. - -ObjectDestroyedReceived - -Number of network object destroyed message received. - -ObjectDestroyedSent - -Number of network object destroyed message sent. - -ObjectSpawnedReceived - -Number of network object spawned message received. - -ObjectSpawnedSent - -Number of network object spawned message sent. - -OwnershipChangeReceived - -Number of ownership change message received. - -OwnershipChangeSent - -Number of ownership change message sent. - -PacketLoss - -Percentage of packet loss over the lifetime of the connection. This is -only valid for clients. This value will always be zero on a server. - -PacketsReceived - -Number of packets received. - -PacketsSent - -Number of packets sent. - -RpcReceived - -Number of RPC received. - -RpcSent - -Number of RPC sent. - -RttToServer - -The RTT from a client to a server. This include the processing time at -the transport level but does not contain the processing time spent -inside the Netcode for GameObjects. - -SceneEventReceived - -Number of scene event message received. - -SceneEventSent - -Number of scene event message sent. - -ServerLogReceived - -Number of server log message received. - -ServerLogSent - -Number of server log message sent. - -TotalBytesReceived - -Number of total bytes received. - -TotalBytesSent - -Number of total bytes sent. - -UnnamedMessageReceived - -Number of custom unnamed message received. - -UnnamedMessageSent - -Number of custom unnamed message sent. \ No newline at end of file +## Fields + +| Name | Description | +|------------------------------|-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------| +| Connections | Number of active network connections. A client will always show one active connection (client to server). | +| NamedMessageReceived | Number of custom named message received. | +| NamedMessageSent | Number of custom named message sent. | +| NetworkMessageReceived | Number of network message received. | +| NetworkMessageSent | Number of network message sent. | +| NetworkObjects | Number of active Network Objects. | +| NetworkVariableDeltaReceived | Number of network variable delta message received. | +| NetworkVariableDeltaSent | Number of network variable delta message sent. | +| ObjectDestroyedReceived | Number of network object destroyed message received. | +| ObjectDestroyedSent | Number of network object destroyed message sent. | +| ObjectSpawnedReceived | Number of network object spawned message received. | +| ObjectSpawnedSent | Number of network object spawned message sent. | +| OwnershipChangeReceived | Number of ownership change message received. | +| OwnershipChangeSent | Number of ownership change message sent. | +| PacketLoss | Percentage of packet loss over the lifetime of the connection. This is only valid for clients. This value will always be zero on a server. | +| PacketsReceived | Number of packets received. | +| PacketsSent | Number of packets sent. | +| RpcReceived | Number of RPC received. | +| RpcSent | Number of RPC sent. | +| RttToServer | The RTT from a client to a server. This include the processing time at the transport level but does not contain the processing time spent inside the Netcode for GameObjects. | +| SceneEventReceived | Number of scene event message received. | +| SceneEventSent | Number of scene event message sent. | +| ServerLogReceived | Number of server log message received. | +| ServerLogSent | Number of server log message sent. | +| TotalBytesReceived | Number of total bytes received. | +| TotalBytesSent | Number of total bytes sent. | +| UnnamedMessageReceived | Number of custom unnamed message received. | +| UnnamedMessageSent | Number of custom unnamed message sent. | diff --git a/tools/api/Unity.Multiplayer.Tools.MetricTypes.Tests.MetricTypeStringTests.md b/tools/api/Unity.Multiplayer.Tools.MetricTypes.Tests.MetricTypeStringTests.md new file mode 100644 index 000000000..b8960210e --- /dev/null +++ b/tools/api/Unity.Multiplayer.Tools.MetricTypes.Tests.MetricTypeStringTests.md @@ -0,0 +1,244 @@ +--- +id: Unity.Multiplayer.Tools.MetricTypes.Tests.MetricTypeStringTests +title: Unity.Multiplayer.Tools.MetricTypes.Tests.MetricTypeStringTests +--- + +
    + +
    + +
    + +
    + +
    + +##### Inheritance + +
    + +System.Dynamic.ExpandoObject + +
    + +
    + +System.Dynamic.ExpandoObject + +
    + +
    + +
    + +##### Inherited Members + +
    + +Object.ToString() + +
    + +
    + +Object.Equals(Object) + +
    + +
    + +Object.Equals(Object, Object) + +
    + +
    + +Object.ReferenceEquals(Object, Object) + +
    + +
    + +Object.GetHashCode() + +
    + +
    + +Object.GetType() + +
    + +
    + +Object.MemberwiseClone() + +
    + +
    + +##### **Namespace**: System.Dynamic.ExpandoObject + +##### **Assembly**: Tools.dll + +##### Syntax + +``` lang-csharp +[Obsolete("This test class has been marked obsolete because it was not intended to be a public API", false)] +public class MetricTypeStringTests +``` + +## Methods + +### NamedMessageEvent_Name() + +
    + +
    + +
    + +
    + +#### Declaration + +``` lang-csharp +[Obsolete("This test method has been marked obsolete because it was not intended to be part of the public API", false)] +public void NamedMessageEvent_Name() +``` + +### NetworkMessageEvent_Name() + +
    + +
    + +
    + +
    + +#### Declaration + +``` lang-csharp +[Obsolete("This test method has been marked obsolete because it was not intended to be part of the public API", false)] +public void NetworkMessageEvent_Name() +``` + +### NetworkObjectIdentifier_Name() + +
    + +
    + +
    + +
    + +#### Declaration + +``` lang-csharp +[Obsolete("This test method has been marked obsolete because it was not intended to be part of the public API", false)] +public void NetworkObjectIdentifier_Name() +``` + +### NetworkVariableEvent_BehaviourName() + +
    + +
    + +
    + +
    + +#### Declaration + +``` lang-csharp +[Obsolete("This test method has been marked obsolete because it was not intended to be part of the public API", false)] +public void NetworkVariableEvent_BehaviourName() +``` + +### NetworkVariableEvent_VariableName() + +
    + +
    + +
    + +
    + +#### Declaration + +``` lang-csharp +[Obsolete("This test method has been marked obsolete because it was not intended to be part of the public API", false)] +public void NetworkVariableEvent_VariableName() +``` + +### RpcEvent_BehaviourName() + +
    + +
    + +
    + +
    + +#### Declaration + +``` lang-csharp +[Obsolete("This test method has been marked obsolete because it was not intended to be part of the public API", false)] +public void RpcEvent_BehaviourName() +``` + +### RpcEvent_RpcName() + +
    + +
    + +
    + +
    + +#### Declaration + +``` lang-csharp +[Obsolete("This test method has been marked obsolete because it was not intended to be part of the public API", false)] +public void RpcEvent_RpcName() +``` + +### SceneEvent_SceneEventType() + +
    + +
    + +
    + +
    + +#### Declaration + +``` lang-csharp +[Obsolete("This test method has been marked obsolete because it was not intended to be part of the public API", false)] +public void SceneEvent_SceneEventType() +``` + +### SceneEvent_SceneName() + +
    + +
    + +
    + +
    + +#### Declaration + +``` lang-csharp +[Obsolete("This test method has been marked obsolete because it was not intended to be part of the public API", false)] +public void SceneEvent_SceneName() +``` diff --git a/tools/api/Unity.Multiplayer.Tools.MetricTypes.Tests.md b/tools/api/Unity.Multiplayer.Tools.MetricTypes.Tests.md new file mode 100644 index 000000000..df1992809 --- /dev/null +++ b/tools/api/Unity.Multiplayer.Tools.MetricTypes.Tests.md @@ -0,0 +1,26 @@ +--- +id: Unity.Multiplayer.Tools.MetricTypes.Tests +title: Unity.Multiplayer.Tools.MetricTypes.Tests +--- + +## Namespace Unity.Multiplayer.Tools.MetricTypes.Tests + +
    + +
    + +
    + +
    + +
    + +
    + +## Classes + +### Unity.Multiplayer.Tools.MetricTypes.Tests.MetricTypeStringTests + +
    + +
    diff --git a/tools/api/Unity.Multiplayer.Tools.MetricTypes.md b/tools/api/Unity.Multiplayer.Tools.MetricTypes.md index 4fade2d17..0ad5c7620 100644 --- a/tools/api/Unity.Multiplayer.Tools.MetricTypes.md +++ b/tools/api/Unity.Multiplayer.Tools.MetricTypes.md @@ -1,13 +1,29 @@ +--- +id: Unity.Multiplayer.Tools.MetricTypes +title: Unity.Multiplayer.Tools.MetricTypes --- -id: Unity.Multiplayer.Tools.MetricTypes -title: Unity.Multiplayer.Tools.MetricTypes ---- -### Enums -#### DirectedMetricType +## Namespace Unity.Multiplayer.Tools.MetricTypes + +
    + +
    + +
    + +
    + +
    + +
    + +## Enums +### Unity.Multiplayer.Tools.MetricTypes.DirectedMetricType +
    The built in set of metrics that can be displayed in the multiplayer tools, such as the Network Profiler and the Runtime Net Stats Monitor. +
    diff --git a/tools/api/Unity.Multiplayer.Tools.NetStats.AssemblyRequiresTypeRegistrationAttribute.md b/tools/api/Unity.Multiplayer.Tools.NetStats.AssemblyRequiresTypeRegistrationAttribute.md new file mode 100644 index 000000000..27376aca2 --- /dev/null +++ b/tools/api/Unity.Multiplayer.Tools.NetStats.AssemblyRequiresTypeRegistrationAttribute.md @@ -0,0 +1,355 @@ +--- +id: Unity.Multiplayer.Tools.NetStats.AssemblyRequiresTypeRegistrationAttribute +title: Unity.Multiplayer.Tools.NetStats.AssemblyRequiresTypeRegistrationAttribute +--- + +
    + +For internal use. This attribute is automatically added to assemblies +that use types from the multiplayer tools package that require code +generation to work correctly + +
    + +
    + +
    + +
    + +##### Inheritance + +
    + +System.Dynamic.ExpandoObject + +
    + +
    + +System.Dynamic.ExpandoObject + +
    + +
    + +System.Dynamic.ExpandoObject + +
    + +
    + +
    + +##### Implements + +
    + +System.Runtime.InteropServices.\_Attribute + +
    + +
    + +
    + +##### Inherited Members + +
    + +Attribute.GetCustomAttributes(MemberInfo, Type) + +
    + +
    + +Attribute.GetCustomAttributes(MemberInfo, Type, Boolean) + +
    + +
    + +Attribute.GetCustomAttributes(MemberInfo) + +
    + +
    + +Attribute.GetCustomAttributes(MemberInfo, Boolean) + +
    + +
    + +Attribute.IsDefined(MemberInfo, Type) + +
    + +
    + +Attribute.IsDefined(MemberInfo, Type, Boolean) + +
    + +
    + +Attribute.GetCustomAttribute(MemberInfo, Type) + +
    + +
    + +Attribute.GetCustomAttribute(MemberInfo, Type, Boolean) + +
    + +
    + +Attribute.GetCustomAttributes(ParameterInfo) + +
    + +
    + +Attribute.GetCustomAttributes(ParameterInfo, Type) + +
    + +
    + +Attribute.GetCustomAttributes(ParameterInfo, Type, Boolean) + +
    + +
    + +Attribute.GetCustomAttributes(ParameterInfo, Boolean) + +
    + +
    + +Attribute.IsDefined(ParameterInfo, Type) + +
    + +
    + +Attribute.IsDefined(ParameterInfo, Type, Boolean) + +
    + +
    + +Attribute.GetCustomAttribute(ParameterInfo, Type) + +
    + +
    + +Attribute.GetCustomAttribute(ParameterInfo, Type, Boolean) + +
    + +
    + +Attribute.GetCustomAttributes(Module, Type) + +
    + +
    + +Attribute.GetCustomAttributes(Module) + +
    + +
    + +Attribute.GetCustomAttributes(Module, Boolean) + +
    + +
    + +Attribute.GetCustomAttributes(Module, Type, Boolean) + +
    + +
    + +Attribute.IsDefined(Module, Type) + +
    + +
    + +Attribute.IsDefined(Module, Type, Boolean) + +
    + +
    + +Attribute.GetCustomAttribute(Module, Type) + +
    + +
    + +Attribute.GetCustomAttribute(Module, Type, Boolean) + +
    + +
    + +Attribute.GetCustomAttributes(Assembly, Type) + +
    + +
    + +Attribute.GetCustomAttributes(Assembly, Type, Boolean) + +
    + +
    + +Attribute.GetCustomAttributes(Assembly) + +
    + +
    + +Attribute.GetCustomAttributes(Assembly, Boolean) + +
    + +
    + +Attribute.IsDefined(Assembly, Type) + +
    + +
    + +Attribute.IsDefined(Assembly, Type, Boolean) + +
    + +
    + +Attribute.GetCustomAttribute(Assembly, Type) + +
    + +
    + +Attribute.GetCustomAttribute(Assembly, Type, Boolean) + +
    + +
    + +Attribute.Equals(Object) + +
    + +
    + +Attribute.GetHashCode() + +
    + +
    + +Attribute.Match(Object) + +
    + +
    + +Attribute.IsDefaultAttribute() + +
    + +
    + +Attribute.\_Attribute.GetTypeInfoCount(UInt32) + +
    + +
    + +Attribute.\_Attribute.GetTypeInfo(UInt32, UInt32, IntPtr) + +
    + +
    + +Attribute.\_Attribute.GetIDsOfNames(Guid, IntPtr, UInt32, UInt32, +IntPtr) + +
    + +
    + +Attribute.\_Attribute.Invoke(UInt32, Guid, UInt32, Int16, IntPtr, +IntPtr, IntPtr, IntPtr) + +
    + +
    + +Attribute.TypeId + +
    + +
    + +Object.ToString() + +
    + +
    + +Object.Equals(Object, Object) + +
    + +
    + +Object.ReferenceEquals(Object, Object) + +
    + +
    + +Object.GetType() + +
    + +
    + +Object.MemberwiseClone() + +
    + +
    + +##### **Namespace**: System.Dynamic.ExpandoObject + +##### **Assembly**: Tools.dll + +##### Syntax + +``` lang-csharp +[AttributeUsage(AttributeTargets.Assembly)] +public class AssemblyRequiresTypeRegistrationAttribute : Attribute, _Attribute +``` + +### Implements + +
    + +System.Runtime.InteropServices.\_Attribute + +
    diff --git a/tools/api/Unity.Multiplayer.Tools.NetStats.MetricId.md b/tools/api/Unity.Multiplayer.Tools.NetStats.MetricId.md index f910772ea..52eeee45a 100644 --- a/tools/api/Unity.Multiplayer.Tools.NetStats.MetricId.md +++ b/tools/api/Unity.Multiplayer.Tools.NetStats.MetricId.md @@ -1,28 +1,58 @@ ---- -id: Unity.Multiplayer.Tools.NetStats.MetricId -title: Unity.Multiplayer.Tools.NetStats.MetricId +--- +id: Unity.Multiplayer.Tools.NetStats.MetricId +title: Unity.Multiplayer.Tools.NetStats.MetricId --- -# Struct MetricId +
    Wrapper around an enum with the MetricTypeEnumAttribute. The struct provide a way to create metric that can be used with multiplayer tools. +
    + +
    + +
    + +
    + ##### Implements +
    + System.IEquatable\ +
    + +
    + +
    + ##### Inherited Members -System.Object.Equals(System.Object, System.Object) +
    + +Object.Equals(Object, Object) + +
    + +
    + +Object.ReferenceEquals(Object, Object) -System.Object.GetType() +
    -System.Object.ReferenceEquals(System.Object, System.Object) +
    -###### **Namespace**: Unity.Multiplayer.Tools.NetStats +Object.GetType() -###### **Assembly**: Tools.dll +
    + +
    + +##### **Namespace**: System.Dynamic.ExpandoObject + +##### **Assembly**: Tools.dll ##### Syntax @@ -31,145 +61,206 @@ System.Object.ReferenceEquals(System.Object, System.Object) public struct MetricId : IEquatable ``` -### Methods +## Methods -#### Create\(T) +### Create\(T) + +
    Static function to create a MetricId. -##### Declaration +
    + +
    + +
    + +#### Declaration ``` lang-csharp public static MetricId Create(T value) + where T : struct, IConvertible ``` -##### Parameters +#### Parameters | Type | Name | Description | |------|-------|----------------------------| | T | value | Enum value for the metric. | -##### Returns +#### Returns | Type | Description | |----------|-------------| | MetricId | | -##### Type Parameters +#### Type Parameters | Name | Description | |------|------------------------------------------| | T | An enum with the MetricTypeEnumAttribute | -#### Equals(Object) +### Equals(Object) + +
    Determines whether the specified object is equal to the current object. -##### Declaration +
    + +
    + +
    + +#### Declaration ``` lang-csharp public override bool Equals(object obj) ``` -##### Parameters +#### Parameters | Type | Name | Description | |---------------|------|-------------------------------------------------| | System.Object | obj | The object to compare with the current object.. | -##### Returns +#### Returns | Type | Description | |----------------|--------------------------------------------------------------------------------| | System.Boolean | true if the specified object is equal to the current object; otherwise, false. | -##### Overrides +#### Overrides + +
    System.ValueType.Equals(System.Object) -#### Equals(MetricId) +
    + +### Equals(MetricId) + +
    Determines whether the specified MetricId is equal to the current MetricId. -##### Declaration +
    + +
    + +
    + +#### Declaration ``` lang-csharp public bool Equals(MetricId other) ``` -##### Parameters +#### Parameters | Type | Name | Description | |----------|-------|----------------------------------------------------| | MetricId | other | The MetricId to compare with the current MetricId. | -##### Returns +#### Returns | Type | Description | |----------------|------------------------------------------------------------------------------------| | System.Boolean | true if the specified MetricId is equal to the current MetricId; otherwise, false. | -#### GetHashCode() +### GetHashCode() + +
    Serves as the default hash function. -##### Declaration +
    + +
    + +
    + +#### Declaration ``` lang-csharp public override int GetHashCode() ``` -##### Returns +#### Returns | Type | Description | |--------------|---------------------------------------| | System.Int32 | A hash code for the current MetricId. | -##### Overrides +#### Overrides + +
    System.ValueType.GetHashCode() -#### ToString() +
    + +### ToString() + +
    Returns a string that represents the current MetricId. -##### Declaration +
    + +
    + +
    + +#### Declaration ``` lang-csharp public override string ToString() ``` -##### Returns +#### Returns | Type | Description | |---------------|------------------------------------------------| | System.String | A string that represents the current MetricId. | -##### Overrides +#### Overrides + +
    System.ValueType.ToString() -### Operators +
    + +## Operators -#### Implicit(MetricId to String) +### Implicit(MetricId to String) + +
    Implicit operator to convert to string. -##### Declaration +
    + +
    + +
    + +#### Declaration ``` lang-csharp public static implicit operator string (MetricId metricId) ``` -##### Parameters +#### Parameters | Type | Name | Description | |----------|----------|------------------------------------| | MetricId | metricId | The MetricId to convert to string. | -##### Returns +#### Returns | Type | Description | |---------------|---------------------------| @@ -177,4 +268,8 @@ public static implicit operator string (MetricId metricId) ### Implements -System.IEquatable\ \ No newline at end of file +
    + +System.IEquatable\ + +
    diff --git a/tools/api/Unity.Multiplayer.Tools.NetStats.MetricIdTypeLibrary.md b/tools/api/Unity.Multiplayer.Tools.NetStats.MetricIdTypeLibrary.md new file mode 100644 index 000000000..b76b5188d --- /dev/null +++ b/tools/api/Unity.Multiplayer.Tools.NetStats.MetricIdTypeLibrary.md @@ -0,0 +1,127 @@ +--- +id: Unity.Multiplayer.Tools.NetStats.MetricIdTypeLibrary +title: Unity.Multiplayer.Tools.NetStats.MetricIdTypeLibrary +--- + +
    + +For internal use. Static class to register MetricId and make them +available to all tools. + +
    + +
    + +
    + +
    + +##### Inheritance + +
    + +System.Dynamic.ExpandoObject + +
    + +
    + +System.Dynamic.ExpandoObject + +
    + +
    + +
    + +##### Inherited Members + +
    + +Object.ToString() + +
    + +
    + +Object.Equals(Object) + +
    + +
    + +Object.Equals(Object, Object) + +
    + +
    + +Object.ReferenceEquals(Object, Object) + +
    + +
    + +Object.GetHashCode() + +
    + +
    + +Object.GetType() + +
    + +
    + +Object.MemberwiseClone() + +
    + +
    + +##### **Namespace**: System.Dynamic.ExpandoObject + +##### **Assembly**: Tools.dll + +##### Syntax + +``` lang-csharp +public static class MetricIdTypeLibrary +``` + +##### **Remarks** + +
    + +There is no need to manually call this class for custom type as they are +automatically registered through CodeGen if they are marked with +MetricTypeEnumAttribute. + +
    + +## Methods + +### RegisterType\() + +
    + +For internal use. Register an enum type to be used as a MetricId. + +
    + +
    + +
    + +#### Declaration + +``` lang-csharp +public static void RegisterType() +``` + +#### Type Parameters + +| Name | Description | +|-----------|----------------------------| +| TEnumType | The enum type to register. | diff --git a/tools/api/Unity.Multiplayer.Tools.NetStats.MetricKind.md b/tools/api/Unity.Multiplayer.Tools.NetStats.MetricKind.md index 49a421dd7..5833c0efe 100644 --- a/tools/api/Unity.Multiplayer.Tools.NetStats.MetricKind.md +++ b/tools/api/Unity.Multiplayer.Tools.NetStats.MetricKind.md @@ -1,60 +1,31 @@ +--- +id: Unity.Multiplayer.Tools.NetStats.MetricKind +title: Unity.Multiplayer.Tools.NetStats.MetricKind --- -id: Unity.Multiplayer.Tools.NetStats.MetricKind -title: Unity.Multiplayer.Tools.NetStats.MetricKind ---- - - - - - -# Enum MetricKind - +
    Represent the kind a metric can be. +
    +
    +
    +##### **Namespace**: System.Dynamic.ExpandoObject - - -###### **Namespace**: Unity.Multiplayer.Tools.NetStats - -###### **Assembly**: Tools.dll +##### **Assembly**: Tools.dll ##### Syntax - - ``` lang-csharp public enum MetricKind ``` +## Fields - -### Fields - -Name - - - - - - - - - -Description - -Counter - -Represent a counter metric. A counter is a cumulative metric whose value -can only be increased or reset to zero. For a metric that could be -decreased, a Gauge should be used. - -Gauge - -Represent a gauge metric. A gauge is a metric that represents a single -numerical value that can go up or down. For a metric that can only go -up, a Counter should be used. \ No newline at end of file +| Name | Description | +|---------|--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------| +| Counter | Represent a counter metric. A counter is a cumulative metric whose value can only be increased or reset to zero. For a metric that could be decreased, a Gauge should be used. | +| Gauge | Represent a gauge metric. A gauge is a metric that represents a single numerical value that can go up or down. For a metric that can only go up, a Counter should be used. | diff --git a/tools/api/Unity.Multiplayer.Tools.NetStats.MetricMetadataAttribute.md b/tools/api/Unity.Multiplayer.Tools.NetStats.MetricMetadataAttribute.md index 6fc1e006a..34dabf141 100644 --- a/tools/api/Unity.Multiplayer.Tools.NetStats.MetricMetadataAttribute.md +++ b/tools/api/Unity.Multiplayer.Tools.NetStats.MetricMetadataAttribute.md @@ -1,496 +1,444 @@ +--- +id: Unity.Multiplayer.Tools.NetStats.MetricMetadataAttribute +title: Unity.Multiplayer.Tools.NetStats.MetricMetadataAttribute --- -id: Unity.Multiplayer.Tools.NetStats.MetricMetadataAttribute -title: Unity.Multiplayer.Tools.NetStats.MetricMetadataAttribute ---- - - - - - -# Class MetricMetadataAttribute - +
    Attribute to provide more information about a metric, such as a custom name and units. +
    +
    +
    - - - - +
    ##### Inheritance +
    +System.Dynamic.ExpandoObject -System.Object - - - - +
    -System.Attribute +
    +System.Dynamic.ExpandoObject +
    +
    +System.Dynamic.ExpandoObject -MetricMetadataAttribute - - - - +
    +
    +
    ##### Implements - +
    System.Runtime.InteropServices.\_Attribute +
    +
    - - - +
    ##### Inherited Members +
    +Attribute.GetCustomAttributes(MemberInfo, Type) -System.Attribute.Equals(System.Object) - - - - - -System.Attribute.GetCustomAttribute(System.Reflection.Assembly, -System.Type) - - - - - -System.Attribute.GetCustomAttribute(System.Reflection.Assembly, -System.Type, System.Boolean) - - - - - -System.Attribute.GetCustomAttribute(System.Reflection.MemberInfo, -System.Type) - - - - - -System.Attribute.GetCustomAttribute(System.Reflection.MemberInfo, -System.Type, System.Boolean) - - - - - -System.Attribute.GetCustomAttribute(System.Reflection.Module, -System.Type) - - - - - -System.Attribute.GetCustomAttribute(System.Reflection.Module, -System.Type, System.Boolean) - - - - - -System.Attribute.GetCustomAttribute(System.Reflection.ParameterInfo, -System.Type) - - - - - -System.Attribute.GetCustomAttribute(System.Reflection.ParameterInfo, -System.Type, System.Boolean) - - - - - -System.Attribute.GetCustomAttributes(System.Reflection.Assembly) - - - - - -System.Attribute.GetCustomAttributes(System.Reflection.Assembly, -System.Boolean) - - - - +
    -System.Attribute.GetCustomAttributes(System.Reflection.Assembly, -System.Type) +
    +Attribute.GetCustomAttributes(MemberInfo, Type, Boolean) +
    +
    +Attribute.GetCustomAttributes(MemberInfo) -System.Attribute.GetCustomAttributes(System.Reflection.Assembly, -System.Type, System.Boolean) +
    +
    +Attribute.GetCustomAttributes(MemberInfo, Boolean) +
    +
    -System.Attribute.GetCustomAttributes(System.Reflection.MemberInfo) +Attribute.IsDefined(MemberInfo, Type) +
    +
    +Attribute.IsDefined(MemberInfo, Type, Boolean) +
    -System.Attribute.GetCustomAttributes(System.Reflection.MemberInfo, -System.Boolean) +
    +Attribute.GetCustomAttribute(MemberInfo, Type) +
    +
    +Attribute.GetCustomAttribute(MemberInfo, Type, Boolean) -System.Attribute.GetCustomAttributes(System.Reflection.MemberInfo, -System.Type) +
    +
    +Attribute.GetCustomAttributes(ParameterInfo) +
    +
    -System.Attribute.GetCustomAttributes(System.Reflection.MemberInfo, -System.Type, System.Boolean) +Attribute.GetCustomAttributes(ParameterInfo, Type) +
    +
    +Attribute.GetCustomAttributes(ParameterInfo, Type, Boolean) +
    -System.Attribute.GetCustomAttributes(System.Reflection.Module) +
    +Attribute.GetCustomAttributes(ParameterInfo, Boolean) +
    +
    +Attribute.IsDefined(ParameterInfo, Type) -System.Attribute.GetCustomAttributes(System.Reflection.Module, -System.Boolean) +
    +
    +Attribute.IsDefined(ParameterInfo, Type, Boolean) +
    +
    -System.Attribute.GetCustomAttributes(System.Reflection.Module, -System.Type) +Attribute.GetCustomAttribute(ParameterInfo, Type) +
    +
    +Attribute.GetCustomAttribute(ParameterInfo, Type, Boolean) +
    -System.Attribute.GetCustomAttributes(System.Reflection.Module, -System.Type, System.Boolean) +
    +Attribute.GetCustomAttributes(Module, Type) +
    +
    +Attribute.GetCustomAttributes(Module) -System.Attribute.GetCustomAttributes(System.Reflection.ParameterInfo) +
    +
    +Attribute.GetCustomAttributes(Module, Boolean) +
    +
    -System.Attribute.GetCustomAttributes(System.Reflection.ParameterInfo, -System.Boolean) +Attribute.GetCustomAttributes(Module, Type, Boolean) +
    +
    +Attribute.IsDefined(Module, Type) +
    -System.Attribute.GetCustomAttributes(System.Reflection.ParameterInfo, -System.Type) +
    +Attribute.IsDefined(Module, Type, Boolean) +
    +
    +Attribute.GetCustomAttribute(Module, Type) -System.Attribute.GetCustomAttributes(System.Reflection.ParameterInfo, -System.Type, System.Boolean) +
    +
    +Attribute.GetCustomAttribute(Module, Type, Boolean) +
    +
    -System.Attribute.GetHashCode() +Attribute.GetCustomAttributes(Assembly, Type) +
    +
    +Attribute.GetCustomAttributes(Assembly, Type, Boolean) +
    -System.Attribute.IsDefaultAttribute() +
    +Attribute.GetCustomAttributes(Assembly) +
    +
    +Attribute.GetCustomAttributes(Assembly, Boolean) -System.Attribute.IsDefined(System.Reflection.Assembly, System.Type) +
    +
    +Attribute.IsDefined(Assembly, Type) +
    +
    -System.Attribute.IsDefined(System.Reflection.Assembly, System.Type, -System.Boolean) +Attribute.IsDefined(Assembly, Type, Boolean) +
    +
    +Attribute.GetCustomAttribute(Assembly, Type) +
    -System.Attribute.IsDefined(System.Reflection.MemberInfo, System.Type) +
    +Attribute.GetCustomAttribute(Assembly, Type, Boolean) +
    +
    +Attribute.Equals(Object) -System.Attribute.IsDefined(System.Reflection.MemberInfo, System.Type, -System.Boolean) +
    +
    +Attribute.GetHashCode() +
    +
    -System.Attribute.IsDefined(System.Reflection.Module, System.Type) +Attribute.Match(Object) +
    +
    +Attribute.IsDefaultAttribute() +
    -System.Attribute.IsDefined(System.Reflection.Module, System.Type, -System.Boolean) +
    +Attribute.\_Attribute.GetTypeInfoCount(UInt32) +
    +
    +Attribute.\_Attribute.GetTypeInfo(UInt32, UInt32, IntPtr) -System.Attribute.IsDefined(System.Reflection.ParameterInfo, System.Type) +
    +
    +Attribute.\_Attribute.GetIDsOfNames(Guid, IntPtr, UInt32, UInt32, +IntPtr) +
    +
    -System.Attribute.IsDefined(System.Reflection.ParameterInfo, System.Type, -System.Boolean) +Attribute.\_Attribute.Invoke(UInt32, Guid, UInt32, Int16, IntPtr, +IntPtr, IntPtr, IntPtr) +
    +
    +Attribute.TypeId +
    -System.Attribute.Match(System.Object) +
    +Object.ToString() +
    +
    +Object.Equals(Object, Object) -System.Attribute.System.Runtime.InteropServices.\_Attribute.GetIDsOfNames(System.Guid, -System.IntPtr, System.UInt32, System.UInt32, System.IntPtr) +
    +
    +Object.ReferenceEquals(Object, Object) +
    +
    -System.Attribute.System.Runtime.InteropServices.\_Attribute.GetTypeInfo(System.UInt32, -System.UInt32, System.IntPtr) +Object.GetType() +
    +
    +Object.MemberwiseClone() +
    -System.Attribute.System.Runtime.InteropServices.\_Attribute.GetTypeInfoCount(System.UInt32) +
    +##### **Namespace**: System.Dynamic.ExpandoObject - - - -System.Attribute.System.Runtime.InteropServices.\_Attribute.Invoke(System.UInt32, -System.Guid, System.UInt32, System.Int16, System.IntPtr, System.IntPtr, -System.IntPtr, System.IntPtr) - - - - - -System.Attribute.TypeId - - - - - -System.Object.Equals(System.Object, System.Object) - - - - - -System.Object.GetType() - - - - - -System.Object.MemberwiseClone() - - - - - -System.Object.ReferenceEquals(System.Object, System.Object) - - - - - -System.Object.ToString() - - - - - -###### **Namespace**: Unity.Multiplayer.Tools.NetStats - -###### **Assembly**: Tools.dll +##### **Assembly**: Tools.dll ##### Syntax - - ``` lang-csharp [AttributeUsage(AttributeTargets.Field)] public class MetricMetadataAttribute : Attribute, _Attribute ``` +## Properties +### DisplayAsPercentage -### Properties - -#### DisplayAsPercentage - - +
    Toggle for the metric to be shown as a percentage. This should only be used for unitless metrics. +
    +
    +
    - - - -##### Declaration - - +#### Declaration ``` lang-csharp public bool DisplayAsPercentage { get; set; } ``` - - -##### Property Value +#### Property Value | Type | Description | |----------------|-------------| | System.Boolean | | -#### DisplayName - +### DisplayName +
    The custom display name to show for a metric. +
    +
    +
    - - - -##### Declaration - - +#### Declaration ``` lang-csharp public string DisplayName { get; set; } ``` - - -##### Property Value +#### Property Value | Type | Description | |---------------|-------------| | System.String | | -#### MetricKind - +### MetricKind +
    The kind of metric. By default, the metric is a counter. +
    +
    +
    - - - -##### Declaration - - +#### Declaration ``` lang-csharp public MetricKind MetricKind { get; set; } ``` - - -##### Property Value +#### Property Value | Type | Description | |------------|-------------| | MetricKind | | -#### Units - +### Units +
    The units for the metric. By default, there are no units. +
    +
    +
    - - - -##### Declaration - - +#### Declaration ``` lang-csharp public Units Units { get; set; } ``` - - -##### Property Value +#### Property Value | Type | Description | |-------|-------------| @@ -498,8 +446,8 @@ public Units Units { get; set; } ### Implements - +
    System.Runtime.InteropServices.\_Attribute - +
    diff --git a/tools/api/Unity.Multiplayer.Tools.NetStats.MetricTypeEnumAttribute.md b/tools/api/Unity.Multiplayer.Tools.NetStats.MetricTypeEnumAttribute.md index 34cf5ede3..464e68eb5 100644 --- a/tools/api/Unity.Multiplayer.Tools.NetStats.MetricTypeEnumAttribute.md +++ b/tools/api/Unity.Multiplayer.Tools.NetStats.MetricTypeEnumAttribute.md @@ -1,169 +1,367 @@ ---- -id: Unity.Multiplayer.Tools.NetStats.MetricTypeEnumAttribute -title: Unity.Multiplayer.Tools.NetStats.MetricTypeEnumAttribute +--- +id: Unity.Multiplayer.Tools.NetStats.MetricTypeEnumAttribute +title: Unity.Multiplayer.Tools.NetStats.MetricTypeEnumAttribute --- -## Class MetricTypeEnumAttribute +
    Use this attribute to declare an enum that represents custom metrics for use with the Multiplayer Tools package. In particular, this attribute can be used to declare custom metrics that can be displayed in the . -### Inheritance +
    -System.Object +
    -System.Attribute +
    -MetricTypeEnumAttribute +
    -### Implements +##### Inheritance + +
    + +System.Dynamic.ExpandoObject + +
    + +
    + +System.Dynamic.ExpandoObject + +
    + +
    + +System.Dynamic.ExpandoObject + +
    + +
    + +
    + +##### Implements + +
    System.Runtime.InteropServices.\_Attribute - +
    -## **Namespace**: Unity.Multiplayer.Tools.NetStats +
    -### **Assembly**: Tools.dll +Attribute.IsDefined(Assembly, Type, Boolean) -### Syntax +
    + +
    + +Attribute.GetCustomAttribute(Assembly, Type) + +
    + +
    + +Attribute.GetCustomAttribute(Assembly, Type, Boolean) + +
    + +
    + +Attribute.Equals(Object) + +
    + +
    + +Attribute.GetHashCode() + +
    + +
    + +Attribute.Match(Object) + +
    + +
    + +Attribute.IsDefaultAttribute() + +
    + +
    + +Attribute.\_Attribute.GetTypeInfoCount(UInt32) + +
    + +
    + +Attribute.\_Attribute.GetTypeInfo(UInt32, UInt32, IntPtr) + +
    + +
    + +Attribute.\_Attribute.GetIDsOfNames(Guid, IntPtr, UInt32, UInt32, +IntPtr) + +
    + +
    + +Attribute.\_Attribute.Invoke(UInt32, Guid, UInt32, Int16, IntPtr, +IntPtr, IntPtr, IntPtr) + +
    + +
    + +Attribute.TypeId + +
    + +
    + +Object.ToString() + +
    + +
    + +Object.Equals(Object, Object) + +
    + +
    + +Object.ReferenceEquals(Object, Object) + +
    + +
    + +Object.GetType() + +
    + +
    + +Object.MemberwiseClone() + +
    + +
    + +##### **Namespace**: System.Dynamic.ExpandoObject + +##### **Assembly**: Tools.dll + +##### Syntax ``` lang-csharp [AttributeUsage(AttributeTargets.Enum)] public class MetricTypeEnumAttribute : Attribute, _Attribute ``` -### Properties +## Properties -#### DisplayName +### DisplayName + +
    The custom display name to use for the metric enum. This can be set to something different than the name of the enum to provide a nicer display name in UIs like the inspector. +
    + +
    + +
    + #### Declaration ``` lang-csharp @@ -178,4 +376,8 @@ public string DisplayName { get; set; } ### Implements -System.Runtime.InteropServices.\_Attribute \ No newline at end of file +
    + +System.Runtime.InteropServices.\_Attribute + +
    diff --git a/tools/api/Unity.Multiplayer.Tools.NetStats.Tests.MetricFactoryTests.md b/tools/api/Unity.Multiplayer.Tools.NetStats.Tests.MetricFactoryTests.md new file mode 100644 index 000000000..5475339ee --- /dev/null +++ b/tools/api/Unity.Multiplayer.Tools.NetStats.Tests.MetricFactoryTests.md @@ -0,0 +1,193 @@ +--- +id: Unity.Multiplayer.Tools.NetStats.Tests.MetricFactoryTests +title: Unity.Multiplayer.Tools.NetStats.Tests.MetricFactoryTests +--- + +
    + +
    + +
    + +
    + +
    + +##### Inheritance + +
    + +System.Dynamic.ExpandoObject + +
    + +
    + +System.Dynamic.ExpandoObject + +
    + +
    + +
    + +##### Inherited Members + +
    + +Object.ToString() + +
    + +
    + +Object.Equals(Object) + +
    + +
    + +Object.Equals(Object, Object) + +
    + +
    + +Object.ReferenceEquals(Object, Object) + +
    + +
    + +Object.GetHashCode() + +
    + +
    + +Object.GetType() + +
    + +
    + +Object.MemberwiseClone() + +
    + +
    + +##### **Namespace**: System.Dynamic.ExpandoObject + +##### **Assembly**: Tools.dll + +##### Syntax + +``` lang-csharp +[Obsolete("This test class has been marked obsolete because it was not intended to be a public API", false)] +public class MetricFactoryTests +``` + +## Methods + +### GivenCounterHeader_WhenTryConstructCalled_CounterMetricReturned() + +
    + +
    + +
    + +
    + +#### Declaration + +``` lang-csharp +[Obsolete("This test method has been marked obsolete because it was not intended to be part of the public API", false)] +public void GivenCounterHeader_WhenTryConstructCalled_CounterMetricReturned() +``` + +### GivenEventHeader_WhenTryConstructCalled_EventMetricReturned() + +
    + +
    + +
    + +
    + +#### Declaration + +``` lang-csharp +[Obsolete("This test method has been marked obsolete because it was not intended to be part of the public API", false)] +public void GivenEventHeader_WhenTryConstructCalled_EventMetricReturned() +``` + +### GivenGaugeHeader_WhenTryConstructCalled_GaugeMetricReturned() + +
    + +
    + +
    + +
    + +#### Declaration + +``` lang-csharp +[Obsolete("This test method has been marked obsolete because it was not intended to be part of the public API", false)] +public void GivenGaugeHeader_WhenTryConstructCalled_GaugeMetricReturned() +``` + +### GivenTimerHeader_WhenTryConstructCalled_TimerMetricReturned() + +
    + +
    + +
    + +
    + +#### Declaration + +``` lang-csharp +[Obsolete("This test method has been marked obsolete because it was not intended to be part of the public API", false)] +public void GivenTimerHeader_WhenTryConstructCalled_TimerMetricReturned() +``` + +### SetUp() + +
    + +
    + +
    + +
    + +#### Declaration + +``` lang-csharp +[Obsolete("This test method has been marked obsolete because it was not intended to be part of the public API", false)] +public void SetUp() +``` + +### WhenTryConstructCalled_MetricHasCorrectName() + +
    + +
    + +
    + +
    + +#### Declaration + +``` lang-csharp +[Obsolete("This test method has been marked obsolete because it was not intended to be part of the public API", false)] +public void WhenTryConstructCalled_MetricHasCorrectName() +``` diff --git a/tools/api/Unity.Multiplayer.Tools.NetStats.Tests.MetricIdTypeLibraryTests.md b/tools/api/Unity.Multiplayer.Tools.NetStats.Tests.MetricIdTypeLibraryTests.md new file mode 100644 index 000000000..04df0a79b --- /dev/null +++ b/tools/api/Unity.Multiplayer.Tools.NetStats.Tests.MetricIdTypeLibraryTests.md @@ -0,0 +1,176 @@ +--- +id: Unity.Multiplayer.Tools.NetStats.Tests.MetricIdTypeLibraryTests +title: Unity.Multiplayer.Tools.NetStats.Tests.MetricIdTypeLibraryTests +--- + +
    + +
    + +
    + +
    + +
    + +##### Inheritance + +
    + +System.Dynamic.ExpandoObject + +
    + +
    + +System.Dynamic.ExpandoObject + +
    + +
    + +
    + +##### Inherited Members + +
    + +Object.ToString() + +
    + +
    + +Object.Equals(Object) + +
    + +
    + +Object.Equals(Object, Object) + +
    + +
    + +Object.ReferenceEquals(Object, Object) + +
    + +
    + +Object.GetHashCode() + +
    + +
    + +Object.GetType() + +
    + +
    + +Object.MemberwiseClone() + +
    + +
    + +##### **Namespace**: System.Dynamic.ExpandoObject + +##### **Assembly**: Tools.dll + +##### Syntax + +``` lang-csharp +[Obsolete("This test class has been marked obsolete because it was not intended to be a public API", false)] +public class MetricIdTypeLibraryTests +``` + +## Methods + +### VerifyCorrectDisplayName() + +
    + +
    + +
    + +
    + +#### Declaration + +``` lang-csharp +[Obsolete("This test method has been marked obsolete because it was not intended to be part of the public API", false)] +public void VerifyCorrectDisplayName() +``` + +### VerifyCorrectMetricKind() + +
    + +
    + +
    + +
    + +#### Declaration + +``` lang-csharp +[Obsolete("This test method has been marked obsolete because it was not intended to be part of the public API", false)] +public void VerifyCorrectMetricKind() +``` + +### VerifyCorrectName() + +
    + +
    + +
    + +
    + +#### Declaration + +``` lang-csharp +[Obsolete("This test method has been marked obsolete because it was not intended to be part of the public API", false)] +public void VerifyCorrectName() +``` + +### VerifyCorrectUnits() + +
    + +
    + +
    + +
    + +#### Declaration + +``` lang-csharp +[Obsolete("This test method has been marked obsolete because it was not intended to be part of the public API", false)] +public void VerifyCorrectUnits() +``` + +### VerifyTestMetricsIncludedInLibrary() + +
    + +
    + +
    + +
    + +#### Declaration + +``` lang-csharp +[Obsolete("This test method has been marked obsolete because it was not intended to be part of the public API", false)] +public void VerifyTestMetricsIncludedInLibrary() +``` diff --git a/tools/api/Unity.Multiplayer.Tools.NetStats.Tests.md b/tools/api/Unity.Multiplayer.Tools.NetStats.Tests.md new file mode 100644 index 000000000..1017249a1 --- /dev/null +++ b/tools/api/Unity.Multiplayer.Tools.NetStats.Tests.md @@ -0,0 +1,32 @@ +--- +id: Unity.Multiplayer.Tools.NetStats.Tests +title: Unity.Multiplayer.Tools.NetStats.Tests +--- + +## Namespace Unity.Multiplayer.Tools.NetStats.Tests + +
    + +
    + +
    + +
    + +
    + +
    + +## Classes + +### Unity.Multiplayer.Tools.NetStats.Tests.MetricFactoryTests + +
    + +
    + +### Unity.Multiplayer.Tools.NetStats.Tests.MetricIdTypeLibraryTests + +
    + +
    diff --git a/tools/api/Unity.Multiplayer.Tools.NetStats.Units.md b/tools/api/Unity.Multiplayer.Tools.NetStats.Units.md index 359901017..8ffb49cd5 100644 --- a/tools/api/Unity.Multiplayer.Tools.NetStats.Units.md +++ b/tools/api/Unity.Multiplayer.Tools.NetStats.Units.md @@ -1,70 +1,36 @@ +--- +id: Unity.Multiplayer.Tools.NetStats.Units +title: Unity.Multiplayer.Tools.NetStats.Units --- -id: Unity.Multiplayer.Tools.NetStats.Units -title: Unity.Multiplayer.Tools.NetStats.Units ---- - - - - - -# Enum Units - +
    This enum can be used to indicate the units that a metric is reported in, so that they can be displayed in the Runtime Network Stats Monitor with the appropriate units. +
    +
    +
    +##### **Namespace**: System.Dynamic.ExpandoObject - - -###### **Namespace**: Unity.Multiplayer.Tools.NetStats - -###### **Assembly**: Tools.dll +##### **Assembly**: Tools.dll ##### Syntax - - ``` lang-csharp public enum Units ``` +## Fields - -### Fields - -Name - - - - - - - - - -Description - -Bytes - -Represent bytes. - -BytesPerSecond - -Represent bytes per second. - -Hertz - -Represent a hertz (1/second). - -None - -A dimensionless metric without units (e.g. connection count) - -Seconds - -Represent a second. \ No newline at end of file +| Name | Description | +|----------------|--------------------------------------------------------------| +| Bytes | Represent bytes. | +| BytesPerSecond | Represent bytes per second. | +| Hertz | Represent a hertz (1/second). | +| None | A dimensionless metric without units (e.g. connection count) | +| Seconds | Represent a second. | diff --git a/tools/api/Unity.Multiplayer.Tools.NetStats.md b/tools/api/Unity.Multiplayer.Tools.NetStats.md index c3dc69c29..2368879c6 100644 --- a/tools/api/Unity.Multiplayer.Tools.NetStats.md +++ b/tools/api/Unity.Multiplayer.Tools.NetStats.md @@ -1,76 +1,89 @@ +--- +id: Unity.Multiplayer.Tools.NetStats +title: Unity.Multiplayer.Tools.NetStats --- -id: Unity.Multiplayer.Tools.NetStats -title: Unity.Multiplayer.Tools.NetStats ---- +## Namespace Unity.Multiplayer.Tools.NetStats + +
    + +
    + +
    + +
    -### Classes +
    -#### AssemblyRequiresTypeRegistrationAttribute +
    +## Classes +### Unity.Multiplayer.Tools.NetStats.AssemblyRequiresTypeRegistrationAttribute + +
    For internal use. This attribute is automatically added to assemblies that use types from the multiplayer tools package that require code generation to work correctly +
    +### Unity.Multiplayer.Tools.NetStats.MetricIdTypeLibrary -#### MetricIdTypeLibrary - - +
    For internal use. Static class to register MetricId and make them available to all tools. +
    +### Unity.Multiplayer.Tools.NetStats.MetricMetadataAttribute -#### MetricMetadataAttribute - - +
    Attribute to provide more information about a metric, such as a custom name and units. +
    +### Unity.Multiplayer.Tools.NetStats.MetricTypeEnumAttribute -#### MetricTypeEnumAttribute - - +
    Use this attribute to declare an enum that represents custom metrics for use with the Multiplayer Tools package. In particular, this attribute can be used to declare custom metrics that can be displayed in the . +
    +## Structs -### Structs - -#### MetricId - +### Unity.Multiplayer.Tools.NetStats.MetricId +
    Wrapper around an enum with the MetricTypeEnumAttribute. The struct provide a way to create metric that can be used with multiplayer tools. +
    +## Enums -### Enums - -#### MetricKind - +### Unity.Multiplayer.Tools.NetStats.MetricKind +
    Represent the kind a metric can be. +
    +### Unity.Multiplayer.Tools.NetStats.Units -#### Units - - +
    This enum can be used to indicate the units that a metric is reported in, so that they can be displayed in the Runtime Network Stats Monitor with the appropriate units. - +
    diff --git a/tools/api/Unity.Multiplayer.Tools.NetStatsMonitor.AggregationMethod.md b/tools/api/Unity.Multiplayer.Tools.NetStatsMonitor.AggregationMethod.md index eba7acb18..0401c26fc 100644 --- a/tools/api/Unity.Multiplayer.Tools.NetStatsMonitor.AggregationMethod.md +++ b/tools/api/Unity.Multiplayer.Tools.NetStatsMonitor.AggregationMethod.md @@ -1,57 +1,32 @@ +--- +id: Unity.Multiplayer.Tools.NetStatsMonitor.AggregationMethod +title: Unity.Multiplayer.Tools.NetStatsMonitor.AggregationMethod --- -id: Unity.Multiplayer.Tools.NetStatsMonitor.AggregationMethod -title: Unity.Multiplayer.Tools.NetStatsMonitor.AggregationMethod ---- - - - - - -# Enum AggregationMethod - +
    Enum to select the different aggregation method offered by CounterConfiguration. +
    +
    +
    +##### **Namespace**: System.Dynamic.ExpandoObject - - -###### **Namespace**: Unity.Multiplayer.Tools.NetStatsMonitor - -###### **Assembly**: Tools.dll +##### **Assembly**: Tools.dll ##### Syntax - - ``` lang-csharp public enum AggregationMethod ``` +## Fields - -### Fields - -Name - - - - - - - - - -Description - -Average - -Aggregation using the average of multiple stats. - -Sum - -Aggregation using the sum of multiple stats. +| Name | Description | +|---------|--------------------------------------------------| +| Average | Aggregation using the average of multiple stats. | +| Sum | Aggregation using the sum of multiple stats. | diff --git a/tools/api/Unity.Multiplayer.Tools.NetStatsMonitor.CounterConfiguration.md b/tools/api/Unity.Multiplayer.Tools.NetStatsMonitor.CounterConfiguration.md index 5505657f9..f0357df3e 100644 --- a/tools/api/Unity.Multiplayer.Tools.NetStatsMonitor.CounterConfiguration.md +++ b/tools/api/Unity.Multiplayer.Tools.NetStatsMonitor.CounterConfiguration.md @@ -1,338 +1,296 @@ +--- +id: Unity.Multiplayer.Tools.NetStatsMonitor.CounterConfiguration +title: Unity.Multiplayer.Tools.NetStatsMonitor.CounterConfiguration --- -id: Unity.Multiplayer.Tools.NetStatsMonitor.CounterConfiguration -title: Unity.Multiplayer.Tools.NetStatsMonitor.CounterConfiguration ---- - - - - - -# Class CounterConfiguration - +
    Counter configuration used by DisplayElementConfiguration. This configuration contain all information about a counter. +
    +
    +
    - - - - +
    ##### Inheritance +
    +System.Dynamic.ExpandoObject -System.Object - - - - - -CounterConfiguration - +
    +
    +System.Dynamic.ExpandoObject +
    +
    +
    ##### Inherited Members +
    +Object.ToString() -System.Object.Equals(System.Object) - - - - - -System.Object.Equals(System.Object, System.Object) - - - +
    +
    -System.Object.GetHashCode() +Object.Equals(Object) +
    +
    +Object.Equals(Object, Object) +
    -System.Object.GetType() +
    +Object.ReferenceEquals(Object, Object) +
    +
    +Object.GetHashCode() -System.Object.MemberwiseClone() +
    +
    +Object.GetType() +
    +
    -System.Object.ReferenceEquals(System.Object, System.Object) +Object.MemberwiseClone() +
    +
    +##### **Namespace**: System.Dynamic.ExpandoObject - -System.Object.ToString() - - - - - -###### **Namespace**: Unity.Multiplayer.Tools.NetStatsMonitor - -###### **Assembly**: Tools.dll +##### **Assembly**: Tools.dll ##### Syntax - - ``` lang-csharp [Serializable] public sealed class CounterConfiguration ``` +## Properties +### AggregationMethod -### Properties - -#### AggregationMethod - - +
    The desired aggregation method for the stats used in the counter. +
    +
    +
    - - - -##### Declaration - - +#### Declaration ``` lang-csharp public AggregationMethod AggregationMethod { get; set; } ``` - - -##### Property Value +#### Property Value | Type | Description | |-------------------|-------------| | AggregationMethod | | -#### ExponentialMovingAverageParams - +### ExponentialMovingAverageParams +
    Parameters used if SmoothingMethod is set to ExponentialMovingAverage. +
    +
    +
    - - - -##### Declaration - - +#### Declaration ``` lang-csharp public ExponentialMovingAverageParams ExponentialMovingAverageParams { get; set; } ``` - - -##### Property Value +#### Property Value | Type | Description | |--------------------------------|-------------| | ExponentialMovingAverageParams | | -#### HighlightLowerBound - +### HighlightLowerBound +
    Values below this threshold will be highlighted by the default styling, and can be highlighted by custom styling using the following USS classes: -- rnsm-counter-out-of-bounds -- rnsm-counter-below-threshold - - - - +- rnsm-counter-out-of-bounds +- rnsm-counter-below-threshold +
    +
    -##### Declaration - +
    +#### Declaration ``` lang-csharp public float HighlightLowerBound { get; set; } ``` - - -##### Property Value +#### Property Value | Type | Description | |---------------|-------------| | System.Single | | -#### HighlightUpperBound - +### HighlightUpperBound +
    Values above this threshold will be highlighted by the default styling, and can be highlighted by custom styling using the following USS classes: -- rnsm-counter-out-of-bounds -- rnsm-counter-above-threshold - - +- rnsm-counter-out-of-bounds +- rnsm-counter-above-threshold +
    +
    +
    - -##### Declaration - - +#### Declaration ``` lang-csharp public float HighlightUpperBound { get; set; } ``` - - -##### Property Value +#### Property Value | Type | Description | |---------------|-------------| | System.Single | | -#### SampleCount - +### SampleCount +
    The current configured sample count. Note that if the SmoothingMethod is set to ExponentialMovingAverage, the sample count will be zero. +
    +
    +
    - - - -##### Declaration - - +#### Declaration ``` lang-csharp public int SampleCount { get; } ``` - - -##### Property Value +#### Property Value | Type | Description | |--------------|-------------| | System.Int32 | | -#### SignificantDigits - +### SignificantDigits +
    The number of significant digits to display for this counter. +
    +
    +
    - - - -##### Declaration - - +#### Declaration ``` lang-csharp public int SignificantDigits { get; set; } ``` - - -##### Property Value +#### Property Value | Type | Description | |--------------|-------------| | System.Int32 | | -#### SimpleMovingAverageParams - +### SimpleMovingAverageParams +
    Parameters used if SmoothingMethod is set to SimpleMovingAverage. +
    +
    +
    - - - -##### Declaration - - +#### Declaration ``` lang-csharp public SimpleMovingAverageParams SimpleMovingAverageParams { get; set; } ``` - - -##### Property Value +#### Property Value | Type | Description | |---------------------------|-------------| | SimpleMovingAverageParams | | -#### SmoothingMethod - +### SmoothingMethod +
    The desired smoothing method over time for the counter. +
    +
    +
    - - - -##### Declaration - - +#### Declaration ``` lang-csharp public SmoothingMethod SmoothingMethod { get; set; } ``` - - -##### Property Value +#### Property Value | Type | Description | |-----------------|-------------| diff --git a/tools/api/Unity.Multiplayer.Tools.NetStatsMonitor.DisplayElementConfiguration.md b/tools/api/Unity.Multiplayer.Tools.NetStatsMonitor.DisplayElementConfiguration.md index 8c3f819e2..787ae364d 100644 --- a/tools/api/Unity.Multiplayer.Tools.NetStatsMonitor.DisplayElementConfiguration.md +++ b/tools/api/Unity.Multiplayer.Tools.NetStatsMonitor.DisplayElementConfiguration.md @@ -1,251 +1,213 @@ +--- +id: Unity.Multiplayer.Tools.NetStatsMonitor.DisplayElementConfiguration +title: Unity.Multiplayer.Tools.NetStatsMonitor.DisplayElementConfiguration --- -id: Unity.Multiplayer.Tools.NetStatsMonitor.DisplayElementConfiguration -title: Unity.Multiplayer.Tools.NetStatsMonitor.DisplayElementConfiguration ---- - - - - - -# Class DisplayElementConfiguration - +
    Configuration class used by NetStatsMonitorConfiguration to be displayed at runtime by RuntimeNetStatsMonitor. +
    +
    +
    - - - - +
    ##### Inheritance +
    +System.Dynamic.ExpandoObject -System.Object - - - - +
    -DisplayElementConfiguration +
    +System.Dynamic.ExpandoObject +
    +
    +##### **Namespace**: System.Dynamic.ExpandoObject -###### **Namespace**: Unity.Multiplayer.Tools.NetStatsMonitor - -###### **Assembly**: Tools.dll +##### **Assembly**: Tools.dll ##### Syntax - - ``` lang-csharp [Serializable] public sealed class DisplayElementConfiguration : ISerializationCallbackReceiver ``` +## Properties +### CounterConfiguration -### Properties - -#### CounterConfiguration - - +
    Counter configuration if Type is set to Counter. +
    +
    +
    - - - -##### Declaration - - +#### Declaration ``` lang-csharp public CounterConfiguration CounterConfiguration { get; set; } ``` - - -##### Property Value +#### Property Value | Type | Description | |----------------------|-------------| | CounterConfiguration | | -#### GraphConfiguration - +### GraphConfiguration +
    Graph configuration if Type is set to LineGraph or StackedAreaGraph. +
    +
    +
    - - - -##### Declaration - - +#### Declaration ``` lang-csharp public GraphConfiguration GraphConfiguration { get; set; } ``` - - -##### Property Value +#### Property Value | Type | Description | |--------------------|-------------| | GraphConfiguration | | -#### Label - +### Label +
    The label of the display element. +
    +
    +
    - - - -##### Declaration - - +#### Declaration ``` lang-csharp public string Label { get; set; } ``` - - -##### Property Value +#### Property Value | Type | Description | |---------------|-------------| | System.String | | -#### Stats - +### Stats +
    The list of stats represented by MetricId to display. +
    +
    +
    - - - -##### Declaration - - +#### Declaration ``` lang-csharp public List Stats { get; set; } ``` - - -##### Property Value +#### Property Value | Type | Description | |---------------------------------------------|-------------| | System.Collections.Generic.List\ | | -#### Type - +### Type +
    The DisplayElementType of the display element. The label to display for this visual element. For graphs this field is optional, as the variables displayed in the graph are shown in the legend. Consider leaving this field blank for graphs if you would like to make them more compact. +
    +
    +
    - - - -##### Declaration - - +#### Declaration ``` lang-csharp public DisplayElementType Type { get; set; } ``` - - -##### Property Value +#### Property Value | Type | Description | |--------------------|-------------| | DisplayElementType | | -### Methods - -#### OnAfterDeserialize() +## Methods +### OnAfterDeserialize() +
    For internal use. Implementation for ISerializationCallbackReceiver. Called after Unity deserialize the object. This allow to keep the configuration details when reloading assemblies or making change in the code. +
    +
    +
    - - - -##### Declaration - - +#### Declaration ``` lang-csharp public void OnAfterDeserialize() ``` +### OnBeforeSerialize() - -#### OnBeforeSerialize() - - +
    For internal use. Implementation for ISerializationCallbackReceiver. Called before Unity serialize the object. This allow to keep the configuration details when reloading assemblies or making change in the code. +
    +
    +
    - - - -##### Declaration - - +#### Declaration ``` lang-csharp public void OnBeforeSerialize() ``` - - diff --git a/tools/api/Unity.Multiplayer.Tools.NetStatsMonitor.DisplayElementType.md b/tools/api/Unity.Multiplayer.Tools.NetStatsMonitor.DisplayElementType.md index a30ae1021..1f667ee96 100644 --- a/tools/api/Unity.Multiplayer.Tools.NetStatsMonitor.DisplayElementType.md +++ b/tools/api/Unity.Multiplayer.Tools.NetStatsMonitor.DisplayElementType.md @@ -1,61 +1,33 @@ +--- +id: Unity.Multiplayer.Tools.NetStatsMonitor.DisplayElementType +title: Unity.Multiplayer.Tools.NetStatsMonitor.DisplayElementType --- -id: Unity.Multiplayer.Tools.NetStatsMonitor.DisplayElementType -title: Unity.Multiplayer.Tools.NetStatsMonitor.DisplayElementType ---- - - - - - -# Enum DisplayElementType - +
    Enum representing the different type of elements the RuntimeNetStatsMonitor can render. +
    +
    +
    +##### **Namespace**: System.Dynamic.ExpandoObject - - -###### **Namespace**: Unity.Multiplayer.Tools.NetStatsMonitor - -###### **Assembly**: Tools.dll +##### **Assembly**: Tools.dll ##### Syntax - - ``` lang-csharp public enum DisplayElementType ``` +## Fields - -### Fields - -Name - - - - - - - - - -Description - -Counter - -Counter type for DisplayElementConfiguration - -LineGraph - -Line graph type for DisplayElementConfiguration - -StackedAreaGraph - -Stacked area graph type for DisplayElementConfiguration \ No newline at end of file +| Name | Description | +|------------------|---------------------------------------------------------| +| Counter | Counter type for DisplayElementConfiguration | +| LineGraph | Line graph type for DisplayElementConfiguration | +| StackedAreaGraph | Stacked area graph type for DisplayElementConfiguration | diff --git a/tools/api/Unity.Multiplayer.Tools.NetStatsMonitor.ExponentialMovingAverageParams.md b/tools/api/Unity.Multiplayer.Tools.NetStatsMonitor.ExponentialMovingAverageParams.md index e4731df6e..c3e17dbd1 100644 --- a/tools/api/Unity.Multiplayer.Tools.NetStatsMonitor.ExponentialMovingAverageParams.md +++ b/tools/api/Unity.Multiplayer.Tools.NetStatsMonitor.ExponentialMovingAverageParams.md @@ -1,132 +1,117 @@ +--- +id: Unity.Multiplayer.Tools.NetStatsMonitor.ExponentialMovingAverageParams +title: Unity.Multiplayer.Tools.NetStatsMonitor.ExponentialMovingAverageParams --- -id: Unity.Multiplayer.Tools.NetStatsMonitor.ExponentialMovingAverageParams -title: Unity.Multiplayer.Tools.NetStatsMonitor.ExponentialMovingAverageParams ---- - - - - - -# Class ExponentialMovingAverageParams - +
    Parameters for the exponential moving average smoothing method in CounterConfiguration. +
    +
    +
    - - - - +
    ##### Inheritance +
    +System.Dynamic.ExpandoObject -System.Object - - - - - -ExponentialMovingAverageParams - +
    +
    +System.Dynamic.ExpandoObject +
    +
    +
    ##### Inherited Members +
    +Object.ToString() -System.Object.Equals(System.Object) - - - - - -System.Object.Equals(System.Object, System.Object) +
    +
    +Object.Equals(Object) +
    +
    -System.Object.GetHashCode() +Object.Equals(Object, Object) +
    +
    +Object.ReferenceEquals(Object, Object) +
    -System.Object.GetType() +
    +Object.GetHashCode() +
    +
    +Object.GetType() -System.Object.MemberwiseClone() +
    +
    +Object.MemberwiseClone() +
    +
    -System.Object.ReferenceEquals(System.Object, System.Object) +##### **Namespace**: System.Dynamic.ExpandoObject - - - - -System.Object.ToString() - - - - - -###### **Namespace**: Unity.Multiplayer.Tools.NetStatsMonitor - -###### **Assembly**: Tools.dll +##### **Assembly**: Tools.dll ##### Syntax - - ``` lang-csharp [Serializable] public sealed class ExponentialMovingAverageParams ``` +## Properties +### HalfLife -### Properties - -#### HalfLife - - - -The half-life (in seconds) by which samples should decay. By default, -this is set to one second. - +
    +The half-life (in seconds) by which samples should decay. By default, This is set to one second. +
    +
    +
    - -##### Declaration - - +#### Declaration ``` lang-csharp public double HalfLife { get; set; } ``` - - -##### Property Value +#### Property Value | Type | Description | |---------------|-------------| diff --git a/tools/api/Unity.Multiplayer.Tools.NetStatsMonitor.GraphConfiguration.md b/tools/api/Unity.Multiplayer.Tools.NetStatsMonitor.GraphConfiguration.md index 6d787ac09..2ad9e1eea 100644 --- a/tools/api/Unity.Multiplayer.Tools.NetStatsMonitor.GraphConfiguration.md +++ b/tools/api/Unity.Multiplayer.Tools.NetStatsMonitor.GraphConfiguration.md @@ -1,226 +1,235 @@ +--- +id: Unity.Multiplayer.Tools.NetStatsMonitor.GraphConfiguration +title: Unity.Multiplayer.Tools.NetStatsMonitor.GraphConfiguration --- -id: Unity.Multiplayer.Tools.NetStatsMonitor.GraphConfiguration -title: Unity.Multiplayer.Tools.NetStatsMonitor.GraphConfiguration ---- - - - - - -# Class GraphConfiguration - +
    Graph configuration used by DisplayElementConfiguration. This configuration contain all information about a Graph. +
    +
    +
    - - - - +
    ##### Inheritance +
    +System.Dynamic.ExpandoObject -System.Object - - - - - -GraphConfiguration - +
    +
    +System.Dynamic.ExpandoObject +
    +
    +
    ##### Inherited Members +
    +Object.ToString() -System.Object.Equals(System.Object) - - +
    +
    +Object.Equals(Object) -System.Object.Equals(System.Object, System.Object) +
    +
    +Object.Equals(Object, Object) +
    +
    -System.Object.GetHashCode() +Object.ReferenceEquals(Object, Object) +
    +
    +Object.GetHashCode() +
    -System.Object.GetType() +
    +Object.GetType() +
    +
    +Object.MemberwiseClone() -System.Object.MemberwiseClone() +
    +
    +##### **Namespace**: System.Dynamic.ExpandoObject - - -System.Object.ReferenceEquals(System.Object, System.Object) - - - - - -System.Object.ToString() - - - - - -###### **Namespace**: Unity.Multiplayer.Tools.NetStatsMonitor - -###### **Assembly**: Tools.dll +##### **Assembly**: Tools.dll ##### Syntax - - ``` lang-csharp [Serializable] public sealed class GraphConfiguration ``` +## Properties +### LineGraphConfiguration -### Properties - -#### LineGraphConfiguration - - +
    Line-graph specific options. +
    +
    +
    - - - -##### Declaration - - +#### Declaration ``` lang-csharp public LineGraphConfiguration LineGraphConfiguration { get; set; } ``` - - -##### Property Value +#### Property Value | Type | Description | |------------------------|-------------| | LineGraphConfiguration | | -#### SampleCount - +### SampleCount +
    The number of samples that are maintained for the purpose of graphing. +
    +
    +
    - - - -##### Declaration - - +#### Declaration ``` lang-csharp public int SampleCount { get; set; } ``` - - -##### Property Value +#### Property Value | Type | Description | |--------------|-------------| | System.Int32 | | -##### Remarks - +#### Remarks +
    The value is clamped to the range \[8, 4096\]. +
    +### SampleRate -#### VariableColors +
    +The sample rate of the graph. +
    -List of colors to override the default colors of the graph. +
    +
    +#### Declaration +``` lang-csharp +public SampleRate SampleRate { get; set; } +``` +#### Property Value +| Type | Description | +|------------|-------------| +| SampleRate | | +#### Remarks -##### Declaration +
    +If the sample rate is PerSecond then each point in the graph corresponds +to data collected over a full second, whereas if the sample rate is +PerFrame then each point in the graph corresponds to data collected +within a single frame. +
    + +### VariableColors + +
    + +List of colors to override the default colors of the graph. + +
    + +
    + +
    + +#### Declaration ``` lang-csharp public List VariableColors { get; set; } ``` - - -##### Property Value +#### Property Value | Type | Description | |------------------------------------------|-------------| | System.Collections.Generic.List\ | | -#### XAxisType - +### XAxisType +
    The units used for displaying the bounds of the graph's x-axis. By default the graph bounds are displayed in units of sample count. If set to time, the the x-axis graph bounds will display the time over which these samples were collected. +
    +
    +
    - - - -##### Declaration - - +#### Declaration ``` lang-csharp public GraphXAxisType XAxisType { get; set; } ``` - - -##### Property Value +#### Property Value | Type | Description | |----------------|-------------| diff --git a/tools/api/Unity.Multiplayer.Tools.NetStatsMonitor.GraphXAxisType.md b/tools/api/Unity.Multiplayer.Tools.NetStatsMonitor.GraphXAxisType.md index 8a62df43c..d31bf175b 100644 --- a/tools/api/Unity.Multiplayer.Tools.NetStatsMonitor.GraphXAxisType.md +++ b/tools/api/Unity.Multiplayer.Tools.NetStatsMonitor.GraphXAxisType.md @@ -1,56 +1,31 @@ +--- +id: Unity.Multiplayer.Tools.NetStatsMonitor.GraphXAxisType +title: Unity.Multiplayer.Tools.NetStatsMonitor.GraphXAxisType --- -id: Unity.Multiplayer.Tools.NetStatsMonitor.GraphXAxisType -title: Unity.Multiplayer.Tools.NetStatsMonitor.GraphXAxisType ---- - - - - - -# Enum GraphXAxisType - +
    Enum used to select the units used to display the graph x-axis labels. +
    +
    +
    +##### **Namespace**: System.Dynamic.ExpandoObject - - -###### **Namespace**: Unity.Multiplayer.Tools.NetStatsMonitor - -###### **Assembly**: Tools.dll +##### **Assembly**: Tools.dll ##### Syntax - - ``` lang-csharp public enum GraphXAxisType ``` +## Fields - -### Fields - -Name - - - - - - - - - -Description - -Samples - -Graph x-axis labels will display the duration of the graph in samples. - -Time - -Graph x-axis labels will display the duration of the graph in seconds. \ No newline at end of file +| Name | Description | +|---------|------------------------------------------------------------------------| +| Samples | Graph x-axis labels will display the duration of the graph in samples. | +| Time | Graph x-axis labels will display the duration of the graph in seconds. | diff --git a/tools/api/Unity.Multiplayer.Tools.NetStatsMonitor.LineGraphConfiguration.md b/tools/api/Unity.Multiplayer.Tools.NetStatsMonitor.LineGraphConfiguration.md index aeab5d95e..f4faa19fd 100644 --- a/tools/api/Unity.Multiplayer.Tools.NetStatsMonitor.LineGraphConfiguration.md +++ b/tools/api/Unity.Multiplayer.Tools.NetStatsMonitor.LineGraphConfiguration.md @@ -1,140 +1,126 @@ +--- +id: Unity.Multiplayer.Tools.NetStatsMonitor.LineGraphConfiguration +title: Unity.Multiplayer.Tools.NetStatsMonitor.LineGraphConfiguration --- -id: Unity.Multiplayer.Tools.NetStatsMonitor.LineGraphConfiguration -title: Unity.Multiplayer.Tools.NetStatsMonitor.LineGraphConfiguration ---- - - - - - -# Class LineGraphConfiguration - +
    Configuration for Line Graph specific options. +
    +
    +
    - - - - +
    ##### Inheritance +
    +System.Dynamic.ExpandoObject -System.Object - - - - - -LineGraphConfiguration - +
    +
    +System.Dynamic.ExpandoObject +
    +
    +
    ##### Inherited Members +
    +Object.ToString() -System.Object.Equals(System.Object) - - - - - -System.Object.Equals(System.Object, System.Object) - +
    +
    +Object.Equals(Object) +
    -System.Object.GetHashCode() +
    +Object.Equals(Object, Object) +
    +
    +Object.ReferenceEquals(Object, Object) -System.Object.GetType() +
    +
    +Object.GetHashCode() +
    +
    -System.Object.MemberwiseClone() +Object.GetType() +
    +
    +Object.MemberwiseClone() +
    -System.Object.ReferenceEquals(System.Object, System.Object) +
    +##### **Namespace**: System.Dynamic.ExpandoObject - - - -System.Object.ToString() - - - - - -###### **Namespace**: Unity.Multiplayer.Tools.NetStatsMonitor - -###### **Assembly**: Tools.dll +##### **Assembly**: Tools.dll ##### Syntax - - ``` lang-csharp [Serializable] public sealed class LineGraphConfiguration ``` +## Properties +### LineThickness -### Properties - -#### LineThickness - - +
    The line thickness for a line graph. By default this is set to one. +
    +
    +
    - - - -##### Declaration - - +#### Declaration ``` lang-csharp public float LineThickness { get; set; } ``` - - -##### Property Value +#### Property Value | Type | Description | |---------------|-------------| | System.Single | | -##### Remarks - +#### Remarks +
    The accepted range for the line thickness is between 1 and 10. If the value goes beyond those value, it will be clamped. - +
    diff --git a/tools/api/Unity.Multiplayer.Tools.NetStatsMonitor.NetStatsMonitorConfiguration.md b/tools/api/Unity.Multiplayer.Tools.NetStatsMonitor.NetStatsMonitorConfiguration.md index 3e7911e9f..7b22e212a 100644 --- a/tools/api/Unity.Multiplayer.Tools.NetStatsMonitor.NetStatsMonitorConfiguration.md +++ b/tools/api/Unity.Multiplayer.Tools.NetStatsMonitor.NetStatsMonitorConfiguration.md @@ -1,108 +1,90 @@ +--- +id: Unity.Multiplayer.Tools.NetStatsMonitor.NetStatsMonitorConfiguration +title: Unity.Multiplayer.Tools.NetStatsMonitor.NetStatsMonitorConfiguration --- -id: Unity.Multiplayer.Tools.NetStatsMonitor.NetStatsMonitorConfiguration -title: Unity.Multiplayer.Tools.NetStatsMonitor.NetStatsMonitorConfiguration ---- - - - - - -# Class NetStatsMonitorConfiguration - +
    The NetStatsMonitorConfiguration includes all fields required to configure the contents of the RuntimeNetStatsMonitor +
    +
    +
    - - - - +
    ##### Inheritance +
    +System.Dynamic.ExpandoObject -System.Object - - - +
    +
    -NetStatsMonitorConfiguration +System.Dynamic.ExpandoObject +
    +
    +##### **Namespace**: System.Dynamic.ExpandoObject - -###### **Namespace**: Unity.Multiplayer.Tools.NetStatsMonitor - -###### **Assembly**: Tools.dll +##### **Assembly**: Tools.dll ##### Syntax - - ``` lang-csharp public class NetStatsMonitorConfiguration : ScriptableObject ``` +## Properties +### DisplayElements -### Properties - -#### DisplayElements - - +
    List of elements to be rendered by the RuntimeNetStatsMonitor. +
    +
    +
    - - - -##### Declaration - - +#### Declaration ``` lang-csharp public List DisplayElements { get; set; } ``` - - -##### Property Value +#### Property Value | Type | Description | |----------------------------------------------------------------|-------------| | System.Collections.Generic.List\ | | -### Methods - -#### OnConfigurationModified() +## Methods +### OnConfigurationModified() +
    Force a configuration reload. This needs to be called if the configuration has been modified at runtime by a script. +
    +
    +
    - - - -##### Declaration - - +#### Declaration ``` lang-csharp public void OnConfigurationModified() ``` - - diff --git a/tools/api/Unity.Multiplayer.Tools.NetStatsMonitor.PositionConfiguration.md b/tools/api/Unity.Multiplayer.Tools.NetStatsMonitor.PositionConfiguration.md index cc146fa1e..ddd3471d3 100644 --- a/tools/api/Unity.Multiplayer.Tools.NetStatsMonitor.PositionConfiguration.md +++ b/tools/api/Unity.Multiplayer.Tools.NetStatsMonitor.PositionConfiguration.md @@ -1,191 +1,169 @@ +--- +id: Unity.Multiplayer.Tools.NetStatsMonitor.PositionConfiguration +title: Unity.Multiplayer.Tools.NetStatsMonitor.PositionConfiguration --- -id: Unity.Multiplayer.Tools.NetStatsMonitor.PositionConfiguration -title: Unity.Multiplayer.Tools.NetStatsMonitor.PositionConfiguration ---- - - - - - -# Class PositionConfiguration - +
    Configuration for the position of the RuntimeNetStatsMonitor on screen +
    +
    +
    - - - - +
    ##### Inheritance +
    +System.Dynamic.ExpandoObject -System.Object - - - - - -PositionConfiguration - +
    +
    +System.Dynamic.ExpandoObject +
    +
    +
    ##### Inherited Members +
    +Object.ToString() -System.Object.Equals(System.Object) - - - - - -System.Object.Equals(System.Object, System.Object) - - - - - -System.Object.GetHashCode() - - - +
    +
    -System.Object.GetType() +Object.Equals(Object) +
    +
    +Object.Equals(Object, Object) +
    -System.Object.MemberwiseClone() +
    +Object.ReferenceEquals(Object, Object) +
    +
    +Object.GetHashCode() -System.Object.ReferenceEquals(System.Object, System.Object) +
    +
    +Object.GetType() +
    +
    -System.Object.ToString() +Object.MemberwiseClone() +
    +
    +##### **Namespace**: System.Dynamic.ExpandoObject - -###### **Namespace**: Unity.Multiplayer.Tools.NetStatsMonitor - -###### **Assembly**: Tools.dll +##### **Assembly**: Tools.dll ##### Syntax - - ``` lang-csharp [Serializable] public class PositionConfiguration ``` +## Properties +### OverridePosition -### Properties - -#### OverridePosition - - +
    If enabled, the position here will override the position set by the USS styling. Disable this options if you would like to use the position from the USS styling instead. +
    +
    +
    - - - -##### Declaration - - +#### Declaration ``` lang-csharp public bool OverridePosition { get; set; } ``` - - -##### Property Value +#### Property Value | Type | Description | |----------------|-------------| | System.Boolean | | -#### PositionLeftToRight - +### PositionLeftToRight +
    The position of the Net Stats Monitor from left to right in the range from 0 to 1. 0 is flush left, 0.5 is centered, and 1 is flush right. +
    +
    +
    - - - -##### Declaration - - +#### Declaration ``` lang-csharp public float PositionLeftToRight { get; set; } ``` - - -##### Property Value +#### Property Value | Type | Description | |---------------|-------------| | System.Single | | -#### PositionTopToBottom - +### PositionTopToBottom +
    The position of the Net Stats Monitor from top to bottom in the range from 0 to 1. 0 is flush to the top, 0.5 is centered, and 1 is flush to the bottom. +
    +
    +
    - - - -##### Declaration - - +#### Declaration ``` lang-csharp public float PositionTopToBottom { get; set; } ``` - - -##### Property Value +#### Property Value | Type | Description | |---------------|-------------| diff --git a/tools/api/Unity.Multiplayer.Tools.NetStatsMonitor.RuntimeNetStatsMonitor.md b/tools/api/Unity.Multiplayer.Tools.NetStatsMonitor.RuntimeNetStatsMonitor.md index d25d0448c..e9d348287 100644 --- a/tools/api/Unity.Multiplayer.Tools.NetStatsMonitor.RuntimeNetStatsMonitor.md +++ b/tools/api/Unity.Multiplayer.Tools.NetStatsMonitor.RuntimeNetStatsMonitor.md @@ -1,22 +1,40 @@ ---- -id: Unity.Multiplayer.Tools.NetStatsMonitor.RuntimeNetStatsMonitor -title: Unity.Multiplayer.Tools.NetStatsMonitor.RuntimeNetStatsMonitor +--- +id: Unity.Multiplayer.Tools.NetStatsMonitor.RuntimeNetStatsMonitor +title: Unity.Multiplayer.Tools.NetStatsMonitor.RuntimeNetStatsMonitor --- -# Class RuntimeNetStatsMonitor +
    The Runtime Net Stats Monitor component. Add this component to a game object in a scene to display network statistics on screen. +
    + +
    + +
    + +
    + ##### Inheritance -System.Object +
    + +System.Dynamic.ExpandoObject -RuntimeNetStatsMonitor +
    -###### **Namespace**: Unity.Multiplayer.Tools.NetStatsMonitor +
    -###### **Assembly**: Tools.dll +System.Dynamic.ExpandoObject + +
    + +
    + +##### **Namespace**: System.Dynamic.ExpandoObject + +##### **Assembly**: Tools.dll ##### Syntax @@ -24,139 +42,195 @@ RuntimeNetStatsMonitor public class RuntimeNetStatsMonitor : MonoBehaviour ``` -### Properties +## Properties + +### Configuration -#### Configuration +
    The configuration asset used to configure the information displayed in this Runtime Net Stats Monitor. The NetStatsMonitorConfiguration can created from the Create menu, or from C# using ScriptableObject.CreateInstance. -##### Declaration +
    + +
    + +
    + +#### Declaration ``` lang-csharp public NetStatsMonitorConfiguration Configuration { get; set; } ``` -##### Property Value +#### Property Value | Type | Description | |------------------------------|-------------| | NetStatsMonitorConfiguration | | -#### CustomStyleSheet +### CustomStyleSheet + +
    Custom stylesheet to override the default style of the Runtime Net Stats Monitor. +
    + +
    -##### Declaration +
    +#### Declaration ``` lang-csharp public StyleSheet CustomStyleSheet { get; set; } ``` -##### Property Value +#### Property Value | Type | Description | |------------|-------------| | StyleSheet | | -#### MaxRefreshRate +### MaxRefreshRate + +
    The maximum rate at which the Runtime Net Stats Monitor's on-screen display is updated (per second). The on-screen display will never be updated faster than the overall refresh rate. The default refresh rate is 30fps. -##### Declaration +
    + +
    + +
    + +#### Declaration ``` lang-csharp public double MaxRefreshRate { get; set; } ``` -##### Property Value +#### Property Value | Type | Description | |---------------|-------------| | System.Double | | -#### PanelSettingsOverride +### PanelSettingsOverride + +
    Optional panel settings that can be used to override the default. These panel settings can be used to control a number of things, including how the on-screen display of the Runtime Net Stats Monitor scales on different devices and displays. -##### Declaration +
    + +
    + +
    + +#### Declaration ``` lang-csharp public PanelSettings PanelSettingsOverride { get; set; } ``` -##### Property Value +#### Property Value | Type | Description | |---------------|-------------| | PanelSettings | | -#### Position +### Position + +
    Position configuration that allows custom positioning on screen The default position is the top left corner of the screen -##### Declaration +
    + +
    + +
    + +#### Declaration ``` lang-csharp public PositionConfiguration Position { get; set; } ``` -##### Property Value +#### Property Value | Type | Description | |-----------------------|-------------| | PositionConfiguration | | -#### Visible +### Visible + +
    Visibility toggle to hide or show the on-screen display. -##### Declaration +
    + +
    + +
    + +#### Declaration ``` lang-csharp public bool Visible { get; set; } ``` -##### Property Value +#### Property Value | Type | Description | |----------------|-------------| | System.Boolean | | -### Methods +## Methods + +### AddCustomValue(MetricId, Single) -#### AddCustomValue(MetricId, Single) +
    Add a custom value for this metricId, which can be displayed in the RuntimeNetStatsMonitor using a counter or graph configured to display this metric. -##### Declaration +
    + +
    + +
    + +#### Declaration ``` lang-csharp public void AddCustomValue(MetricId metricId, float value) ``` -##### Parameters +#### Parameters | Type | Name | Description | |---------------|----------|---------------------------------------------| | MetricId | metricId | The custom MetricId to provide a value for. | | System.Single | value | The value of the metric. | -#### ApplyConfiguration() +### ApplyConfiguration() + +
    Apply the CustomStyleSheet, Position, and Configuration to the monitor. This function must be called when these fields have been modified from @@ -164,8 +238,14 @@ C# in order to apply the changes. This function does not need to be called when these fields are modified in the inspector, as changes made in the inspector are detected and applied automatically -##### Declaration +
    + +
    + +
    + +#### Declaration ``` lang-csharp public void ApplyConfiguration() -``` \ No newline at end of file +``` diff --git a/tools/api/Unity.Multiplayer.Tools.NetStatsMonitor.SampleRate.md b/tools/api/Unity.Multiplayer.Tools.NetStatsMonitor.SampleRate.md new file mode 100644 index 000000000..b0ca8279d --- /dev/null +++ b/tools/api/Unity.Multiplayer.Tools.NetStatsMonitor.SampleRate.md @@ -0,0 +1,42 @@ +--- +id: Unity.Multiplayer.Tools.NetStatsMonitor.SampleRate +title: Unity.Multiplayer.Tools.NetStatsMonitor.SampleRate +--- + +
    + +The sample rate of a graph or simple-moving-average counter + +
    + +
    + +
    + +##### **Namespace**: System.Dynamic.ExpandoObject + +##### **Assembly**: Tools.dll + +##### Syntax + +``` lang-csharp +public enum SampleRate +``` + +##### **Remarks** + +
    + +In display elements with a PerSecond sample rate, each point or sample +corresponds to data collected over a full second, whereas in display +elements with a PerFrame sample rate, each point or sample corresponds +to data collected in a single frame. + +
    + +## Fields + +| Name | Description | +|-----------|------------------------------------------------------------------------------------------------------------| +| PerFrame | Graph points and Simple Moving Average counter samples correspond to data collected within a single frame. | +| PerSecond | Graph points and Simple Moving Average counter samples correspond to data collected over a full second. | diff --git a/tools/api/Unity.Multiplayer.Tools.NetStatsMonitor.SimpleMovingAverageParams.md b/tools/api/Unity.Multiplayer.Tools.NetStatsMonitor.SimpleMovingAverageParams.md index 79c75dd5b..0f94e9a4c 100644 --- a/tools/api/Unity.Multiplayer.Tools.NetStatsMonitor.SimpleMovingAverageParams.md +++ b/tools/api/Unity.Multiplayer.Tools.NetStatsMonitor.SimpleMovingAverageParams.md @@ -1,39 +1,88 @@ ---- -id: Unity.Multiplayer.Tools.NetStatsMonitor.SimpleMovingAverageParams -title: Unity.Multiplayer.Tools.NetStatsMonitor.SimpleMovingAverageParams +--- +id: Unity.Multiplayer.Tools.NetStatsMonitor.SimpleMovingAverageParams +title: Unity.Multiplayer.Tools.NetStatsMonitor.SimpleMovingAverageParams --- -# Class SimpleMovingAverageParams +
    Parameters for the simple moving average smoothing method in CounterConfiguration. +
    + +
    + +
    + +
    + ##### Inheritance -System.Object +
    + +System.Dynamic.ExpandoObject -SimpleMovingAverageParams +
    + +
    + +System.Dynamic.ExpandoObject + +
    + +
    + +
    ##### Inherited Members -System.Object.Equals(System.Object) +
    + +Object.ToString() + +
    + +
    + +Object.Equals(Object) + +
    + +
    + +Object.Equals(Object, Object) + +
    + +
    + +Object.ReferenceEquals(Object, Object) + +
    + +
    + +Object.GetHashCode() -System.Object.Equals(System.Object, System.Object) +
    -System.Object.GetHashCode() +
    -System.Object.GetType() +Object.GetType() -System.Object.MemberwiseClone() +
    -System.Object.ReferenceEquals(System.Object, System.Object) +
    -System.Object.ToString() +Object.MemberwiseClone() +
    -###### **Namespace**: Unity.Multiplayer.Tools.NetStatsMonitor +
    -###### **Assembly**: Tools.dll +##### **Namespace**: System.Dynamic.ExpandoObject + +##### **Assembly**: Tools.dll ##### Syntax @@ -42,24 +91,70 @@ System.Object.ToString() public sealed class SimpleMovingAverageParams ``` -### Properties +## Properties + +### SampleCount -#### SampleCount +
    The number of samples that are maintained for the purpose of smoothing. -##### Declaration +
    + +
    + +
    + +#### Declaration ``` lang-csharp public int SampleCount { get; set; } ``` -##### Property Value +#### Property Value | Type | Description | |--------------|-------------| | System.Int32 | | -##### Remarks +#### Remarks + +
    + +The value is clamped to the range \[8, 4096\]. + +
    + +### SampleRate + +
    + +The sample rate of the Simple Moving Average counter. + +
    + +
    + +
    + +#### Declaration + +``` lang-csharp +public SampleRate SampleRate { get; set; } +``` + +#### Property Value + +| Type | Description | +|------------|-------------| +| SampleRate | | + +#### Remarks + +
    + +If the sample rate is PerSecond then each sample in the counter is +collected over a full second, whereas if the sample rate is PerFrame +then each sample in the counter is collected during a single frame. -The value is clamped to the range \[8, 4096\]. \ No newline at end of file +
    diff --git a/tools/api/Unity.Multiplayer.Tools.NetStatsMonitor.SmoothingMethod.md b/tools/api/Unity.Multiplayer.Tools.NetStatsMonitor.SmoothingMethod.md index 153129ac0..8b5f5c475 100644 --- a/tools/api/Unity.Multiplayer.Tools.NetStatsMonitor.SmoothingMethod.md +++ b/tools/api/Unity.Multiplayer.Tools.NetStatsMonitor.SmoothingMethod.md @@ -1,16 +1,22 @@ ---- -id: Unity.Multiplayer.Tools.NetStatsMonitor.SmoothingMethod -title: Unity.Multiplayer.Tools.NetStatsMonitor.SmoothingMethod +--- +id: Unity.Multiplayer.Tools.NetStatsMonitor.SmoothingMethod +title: Unity.Multiplayer.Tools.NetStatsMonitor.SmoothingMethod --- -# Enum SmoothingMethod +
    Enum to select the different smoothing method offered by CounterConfiguration. -###### **Namespace**: Unity.Multiplayer.Tools.NetStatsMonitor +
    + +
    + +
    -###### **Assembly**: Tools.dll +##### **Namespace**: System.Dynamic.ExpandoObject + +##### **Assembly**: Tools.dll ##### Syntax @@ -18,16 +24,9 @@ CounterConfiguration. public enum SmoothingMethod ``` -### Fields - -Name - -Description - -ExponentialMovingAverage - -Smoothing method using an exponential moving average. - -SimpleMovingAverage +## Fields -Smoothing method using a simple moving average. \ No newline at end of file +| Name | Description | +|--------------------------|-------------------------------------------------------| +| ExponentialMovingAverage | Smoothing method using an exponential moving average. | +| SimpleMovingAverage | Smoothing method using a simple moving average. | diff --git a/tools/api/Unity.Multiplayer.Tools.NetStatsMonitor.md b/tools/api/Unity.Multiplayer.Tools.NetStatsMonitor.md index 9c039eb4f..b698042a7 100644 --- a/tools/api/Unity.Multiplayer.Tools.NetStatsMonitor.md +++ b/tools/api/Unity.Multiplayer.Tools.NetStatsMonitor.md @@ -1,70 +1,144 @@ +--- +id: Unity.Multiplayer.Tools.NetStatsMonitor +title: Unity.Multiplayer.Tools.NetStatsMonitor --- -id: Unity.Multiplayer.Tools.NetStatsMonitor -title: Unity.Multiplayer.Tools.NetStatsMonitor ---- -### Classes +## Namespace Unity.Multiplayer.Tools.NetStatsMonitor + +
    + +
    + +
    + +
    -#### CounterConfiguration +
    + +
    + +## Classes + +### Unity.Multiplayer.Tools.NetStatsMonitor.CounterConfiguration + +
    Counter configuration used by DisplayElementConfiguration. This configuration contain all information about a counter. -#### DisplayElementConfiguration +
    + +### Unity.Multiplayer.Tools.NetStatsMonitor.DisplayElementConfiguration + +
    Configuration class used by NetStatsMonitorConfiguration to be displayed at runtime by RuntimeNetStatsMonitor. -#### ExponentialMovingAverageParams +
    + +### Unity.Multiplayer.Tools.NetStatsMonitor.ExponentialMovingAverageParams + +
    Parameters for the exponential moving average smoothing method in CounterConfiguration. -#### GraphConfiguration +
    + +### Unity.Multiplayer.Tools.NetStatsMonitor.GraphConfiguration + +
    Graph configuration used by DisplayElementConfiguration. This configuration contain all information about a Graph. -#### LineGraphConfiguration +
    + +### Unity.Multiplayer.Tools.NetStatsMonitor.LineGraphConfiguration + +
    Configuration for Line Graph specific options. -#### NetStatsMonitorConfiguration +
    + +### Unity.Multiplayer.Tools.NetStatsMonitor.NetStatsMonitorConfiguration + +
    The NetStatsMonitorConfiguration includes all fields required to configure the contents of the RuntimeNetStatsMonitor -#### PositionConfiguration +
    + +### Unity.Multiplayer.Tools.NetStatsMonitor.PositionConfiguration + +
    Configuration for the position of the RuntimeNetStatsMonitor on screen -#### RuntimeNetStatsMonitor +
    + +### Unity.Multiplayer.Tools.NetStatsMonitor.RuntimeNetStatsMonitor + +
    The Runtime Net Stats Monitor component. Add this component to a game object in a scene to display network statistics on screen. -#### SimpleMovingAverageParams +
    + +### Unity.Multiplayer.Tools.NetStatsMonitor.SimpleMovingAverageParams + +
    Parameters for the simple moving average smoothing method in CounterConfiguration. -### Enums +
    -#### AggregationMethod +## Enums + +### Unity.Multiplayer.Tools.NetStatsMonitor.AggregationMethod + +
    Enum to select the different aggregation method offered by CounterConfiguration. -#### DisplayElementType +
    + +### Unity.Multiplayer.Tools.NetStatsMonitor.DisplayElementType + +
    Enum representing the different type of elements the RuntimeNetStatsMonitor can render. -#### GraphXAxisType +
    + +### Unity.Multiplayer.Tools.NetStatsMonitor.GraphXAxisType + +
    Enum used to select the units used to display the graph x-axis labels. -#### SmoothingMethod +
    + +### Unity.Multiplayer.Tools.NetStatsMonitor.SampleRate + +
    + +The sample rate of a graph or simple-moving-average counter + +
    + +### Unity.Multiplayer.Tools.NetStatsMonitor.SmoothingMethod + +
    Enum to select the different smoothing method offered by -CounterConfiguration. \ No newline at end of file +CounterConfiguration. + +
    diff --git a/tools/api/Unity.Multiplayer.Tools.NetworkSimulator.Editor.UI.PropertyDrawers.MinMaxDrawer.md b/tools/api/Unity.Multiplayer.Tools.NetworkSimulator.Editor.UI.PropertyDrawers.MinMaxDrawer.md new file mode 100644 index 000000000..444587fef --- /dev/null +++ b/tools/api/Unity.Multiplayer.Tools.NetworkSimulator.Editor.UI.PropertyDrawers.MinMaxDrawer.md @@ -0,0 +1,66 @@ +--- +id: Unity.Multiplayer.Tools.NetworkSimulator.Editor.UI.PropertyDrawers.MinMaxDrawer +title: Unity.Multiplayer.Tools.NetworkSimulator.Editor.UI.PropertyDrawers.MinMaxDrawer +--- + +
    + +
    + +
    + +
    + +
    + +##### Inheritance + +
    + +System.Dynamic.ExpandoObject + +
    + +
    + +System.Dynamic.ExpandoObject + +
    + +
    + +##### **Namespace**: System.Dynamic.ExpandoObject + +##### **Assembly**: Tools.dll + +##### Syntax + +``` lang-csharp +public class MinMaxDrawer : PropertyDrawer +``` + +## Methods + +### OnGUI(Rect, SerializedProperty, GUIContent) + +
    + +
    + +
    + +
    + +#### Declaration + +``` lang-csharp +public override void OnGUI(Rect position, SerializedProperty property, GUIContent label) +``` + +#### Parameters + +| Type | Name | Description | +|--------------------|----------|-------------| +| Rect | position | | +| SerializedProperty | property | | +| GUIContent | label | | diff --git a/tools/api/Unity.Multiplayer.Tools.NetworkSimulator.Editor.UI.PropertyDrawers.md b/tools/api/Unity.Multiplayer.Tools.NetworkSimulator.Editor.UI.PropertyDrawers.md new file mode 100644 index 000000000..7b688a210 --- /dev/null +++ b/tools/api/Unity.Multiplayer.Tools.NetworkSimulator.Editor.UI.PropertyDrawers.md @@ -0,0 +1,26 @@ +--- +id: Unity.Multiplayer.Tools.NetworkSimulator.Editor.UI.PropertyDrawers +title: Unity.Multiplayer.Tools.NetworkSimulator.Editor.UI.PropertyDrawers +--- + +## Namespace Unity.Multiplayer.Tools.NetworkSimulator.Editor.UI.PropertyDrawers + +
    + +
    + +
    + +
    + +
    + +
    + +## Classes + +### Unity.Multiplayer.Tools.NetworkSimulator.Editor.UI.PropertyDrawers.MinMaxDrawer + +
    + +
    diff --git a/tools/api/Unity.Multiplayer.Tools.NetworkSimulator.Runtime.BuiltInScenarios.ConnectionsCycle.Configuration.md b/tools/api/Unity.Multiplayer.Tools.NetworkSimulator.Runtime.BuiltInScenarios.ConnectionsCycle.Configuration.md new file mode 100644 index 000000000..8d672a389 --- /dev/null +++ b/tools/api/Unity.Multiplayer.Tools.NetworkSimulator.Runtime.BuiltInScenarios.ConnectionsCycle.Configuration.md @@ -0,0 +1,130 @@ +--- +id: Unity.Multiplayer.Tools.NetworkSimulator.Runtime.BuiltInScenarios.ConnectionsCycle.Configuration +title: Unity.Multiplayer.Tools.NetworkSimulator.Runtime.BuiltInScenarios.ConnectionsCycle.Configuration +--- + +
    + +Specifies the ConnectionPreset and the ChangeIntervalMilliseconds +configuration. PresetConfiguration + +
    + +
    + +
    + +
    + +##### Inheritance + +
    + +System.Dynamic.ExpandoObject + +
    + +
    + +System.Dynamic.ExpandoObject + +
    + +
    + +System.Dynamic.ExpandoObject + +
    + +
    + +
    + +##### Inherited Members + +
    + +PresetConfiguration.ConnectionPreset + +
    + +
    + +Object.ToString() + +
    + +
    + +Object.Equals(Object) + +
    + +
    + +Object.Equals(Object, Object) + +
    + +
    + +Object.ReferenceEquals(Object, Object) + +
    + +
    + +Object.GetHashCode() + +
    + +
    + +Object.GetType() + +
    + +
    + +Object.MemberwiseClone() + +
    + +
    + +##### **Namespace**: System.Dynamic.ExpandoObject + +##### **Assembly**: Tools.dll + +##### Syntax + +``` lang-csharp +[Serializable] +public sealed class Configuration : PresetConfiguration +``` + +## Fields + +### ChangeIntervalMilliseconds + +
    + +Time in milliseconds to activate the next ConnectionPreset. + +
    + +
    + +
    + +#### Declaration + +``` lang-csharp +public int ChangeIntervalMilliseconds +``` + +#### Field Value + +| Type | Description | +|--------------|-------------| +| System.Int32 | | diff --git a/tools/api/Unity.Multiplayer.Tools.NetworkSimulator.Runtime.BuiltInScenarios.ConnectionsCycle.md b/tools/api/Unity.Multiplayer.Tools.NetworkSimulator.Runtime.BuiltInScenarios.ConnectionsCycle.md new file mode 100644 index 000000000..435aca2da --- /dev/null +++ b/tools/api/Unity.Multiplayer.Tools.NetworkSimulator.Runtime.BuiltInScenarios.ConnectionsCycle.md @@ -0,0 +1,199 @@ +--- +id: Unity.Multiplayer.Tools.NetworkSimulator.Runtime.BuiltInScenarios.ConnectionsCycle +title: Unity.Multiplayer.Tools.NetworkSimulator.Runtime.BuiltInScenarios.ConnectionsCycle +--- + +
    + +NetworkScenario that iterates through the Configurations list by order. + +
    + +
    + +
    + +
    + +##### Inheritance + +
    + +System.Dynamic.ExpandoObject + +
    + +
    + +System.Dynamic.ExpandoObject + +
    + +
    + +System.Dynamic.ExpandoObject + +
    + +
    + +System.Dynamic.ExpandoObject + +
    + +
    + +
    + +##### Inherited Members + +
    + +NetworkScenarioTask.Start(INetworkEventsApi) + +
    + +
    + +NetworkScenarioTask.Dispose() + +
    + +
    + +NetworkScenario.IsPaused + +
    + +
    + +NetworkScenario.OnPause() + +
    + +
    + +NetworkScenario.OnResume() + +
    + +
    + +Object.ToString() + +
    + +
    + +Object.Equals(Object) + +
    + +
    + +Object.Equals(Object, Object) + +
    + +
    + +Object.ReferenceEquals(Object, Object) + +
    + +
    + +Object.GetHashCode() + +
    + +
    + +Object.GetType() + +
    + +
    + +Object.MemberwiseClone() + +
    + +
    + +##### **Namespace**: System.Dynamic.ExpandoObject + +##### **Assembly**: Tools.dll + +##### Syntax + +``` lang-csharp +[Serializable] +public sealed class ConnectionsCycle : NetworkScenarioTask +``` + +## Properties + +### Configurations + +
    + +The list of configuration used to define ConnectionPreset and the +ChangeIntervalMilliseconds. ConnectionsCycle.Configuration + +
    + +
    + +
    + +#### Declaration + +``` lang-csharp +public ICollection Configurations { get; } +``` + +#### Property Value + +| Type | Description | +|--------------------------------------------------------------------------|-------------| +| System.Collections.Generic.ICollection\ | | + +## Methods + +### Run(INetworkEventsApi, CancellationToken) + +
    + +
    + +
    + +
    + +#### Declaration + +``` lang-csharp +protected override async Task Run(INetworkEventsApi networkEventsApi, CancellationToken cancellationToken) +``` + +#### Parameters + +| Type | Name | Description | +|-------------------|-------------------|-------------| +| INetworkEventsApi | networkEventsApi | | +| CancellationToken | cancellationToken | | + +#### Returns + +| Type | Description | +|------|-------------| +| Task | | + +#### Overrides + +
    + +NetworkScenarioTask.Run(INetworkEventsApi, CancellationToken) + +
    diff --git a/tools/api/Unity.Multiplayer.Tools.NetworkSimulator.Runtime.BuiltInScenarios.PresetConfiguration.md b/tools/api/Unity.Multiplayer.Tools.NetworkSimulator.Runtime.BuiltInScenarios.PresetConfiguration.md new file mode 100644 index 000000000..fd39e7be6 --- /dev/null +++ b/tools/api/Unity.Multiplayer.Tools.NetworkSimulator.Runtime.BuiltInScenarios.PresetConfiguration.md @@ -0,0 +1,128 @@ +--- +id: Unity.Multiplayer.Tools.NetworkSimulator.Runtime.BuiltInScenarios.PresetConfiguration +title: Unity.Multiplayer.Tools.NetworkSimulator.Runtime.BuiltInScenarios.PresetConfiguration +--- + +
    + +Base class that provides support for Connection Presets, used for +Network Scenario Configurations. + +
    + +
    + +
    + +
    + +##### Inheritance + +
    + +System.Dynamic.ExpandoObject + +
    + +
    + +System.Dynamic.ExpandoObject + +
    + +
    + +System.Dynamic.ExpandoObject + +
    + +
    + +System.Dynamic.ExpandoObject + +
    + +
    + +
    + +##### Inherited Members + +
    + +Object.ToString() + +
    + +
    + +Object.Equals(Object) + +
    + +
    + +Object.Equals(Object, Object) + +
    + +
    + +Object.ReferenceEquals(Object, Object) + +
    + +
    + +Object.GetHashCode() + +
    + +
    + +Object.GetType() + +
    + +
    + +Object.MemberwiseClone() + +
    + +
    + +##### **Namespace**: System.Dynamic.ExpandoObject + +##### **Assembly**: Tools.dll + +##### Syntax + +``` lang-csharp +[Serializable] +public class PresetConfiguration +``` + +## Properties + +### ConnectionPreset + +
    + +
    + +
    + +
    + +#### Declaration + +``` lang-csharp +public INetworkSimulatorPreset ConnectionPreset { get; set; } +``` + +#### Property Value + +| Type | Description | +|-------------------------|-------------| +| INetworkSimulatorPreset | | diff --git a/tools/api/Unity.Multiplayer.Tools.NetworkSimulator.Runtime.BuiltInScenarios.RandomConnectionsSwap.Configuration.md b/tools/api/Unity.Multiplayer.Tools.NetworkSimulator.Runtime.BuiltInScenarios.RandomConnectionsSwap.Configuration.md new file mode 100644 index 000000000..6b55e2e42 --- /dev/null +++ b/tools/api/Unity.Multiplayer.Tools.NetworkSimulator.Runtime.BuiltInScenarios.RandomConnectionsSwap.Configuration.md @@ -0,0 +1,103 @@ +--- +id: Unity.Multiplayer.Tools.NetworkSimulator.Runtime.BuiltInScenarios.RandomConnectionsSwap.Configuration +title: Unity.Multiplayer.Tools.NetworkSimulator.Runtime.BuiltInScenarios.RandomConnectionsSwap.Configuration +--- + +
    + +Specifies a ConnectionPreset that can be selected. PresetConfiguration + +
    + +
    + +
    + +
    + +##### Inheritance + +
    + +System.Dynamic.ExpandoObject + +
    + +
    + +System.Dynamic.ExpandoObject + +
    + +
    + +System.Dynamic.ExpandoObject + +
    + +
    + +
    + +##### Inherited Members + +
    + +PresetConfiguration.ConnectionPreset + +
    + +
    + +Object.ToString() + +
    + +
    + +Object.Equals(Object) + +
    + +
    + +Object.Equals(Object, Object) + +
    + +
    + +Object.ReferenceEquals(Object, Object) + +
    + +
    + +Object.GetHashCode() + +
    + +
    + +Object.GetType() + +
    + +
    + +Object.MemberwiseClone() + +
    + +
    + +##### **Namespace**: System.Dynamic.ExpandoObject + +##### **Assembly**: Tools.dll + +##### Syntax + +``` lang-csharp +[Serializable] +public sealed class Configuration : PresetConfiguration +``` diff --git a/tools/api/Unity.Multiplayer.Tools.NetworkSimulator.Runtime.BuiltInScenarios.RandomConnectionsSwap.md b/tools/api/Unity.Multiplayer.Tools.NetworkSimulator.Runtime.BuiltInScenarios.RandomConnectionsSwap.md new file mode 100644 index 000000000..ca19067eb --- /dev/null +++ b/tools/api/Unity.Multiplayer.Tools.NetworkSimulator.Runtime.BuiltInScenarios.RandomConnectionsSwap.md @@ -0,0 +1,226 @@ +--- +id: Unity.Multiplayer.Tools.NetworkSimulator.Runtime.BuiltInScenarios.RandomConnectionsSwap +title: Unity.Multiplayer.Tools.NetworkSimulator.Runtime.BuiltInScenarios.RandomConnectionsSwap +--- + +
    + +NetworkScenario that iterates through the Configurations list in a +random order. + +
    + +
    + +
    + +
    + +##### Inheritance + +
    + +System.Dynamic.ExpandoObject + +
    + +
    + +System.Dynamic.ExpandoObject + +
    + +
    + +System.Dynamic.ExpandoObject + +
    + +
    + +System.Dynamic.ExpandoObject + +
    + +
    + +
    + +##### Inherited Members + +
    + +NetworkScenarioTask.Start(INetworkEventsApi) + +
    + +
    + +NetworkScenarioTask.Dispose() + +
    + +
    + +NetworkScenario.IsPaused + +
    + +
    + +NetworkScenario.OnPause() + +
    + +
    + +NetworkScenario.OnResume() + +
    + +
    + +Object.ToString() + +
    + +
    + +Object.Equals(Object) + +
    + +
    + +Object.Equals(Object, Object) + +
    + +
    + +Object.ReferenceEquals(Object, Object) + +
    + +
    + +Object.GetHashCode() + +
    + +
    + +Object.GetType() + +
    + +
    + +Object.MemberwiseClone() + +
    + +
    + +##### **Namespace**: System.Dynamic.ExpandoObject + +##### **Assembly**: Tools.dll + +##### Syntax + +``` lang-csharp +[Serializable] +public sealed class RandomConnectionsSwap : NetworkScenarioTask +``` + +## Fields + +### ChangeIntervalMilliseconds + +
    + +Time in milliseconds to activate the next ConnectionPreset. + +
    + +
    + +
    + +#### Declaration + +``` lang-csharp +public int ChangeIntervalMilliseconds +``` + +#### Field Value + +| Type | Description | +|--------------|-------------| +| System.Int32 | | + +## Properties + +### Configurations + +
    + +Defines the available ConnectionPreset list. +RandomConnectionsSwap.Configuration + +
    + +
    + +
    + +#### Declaration + +``` lang-csharp +public ICollection Configurations { get; } +``` + +#### Property Value + +| Type | Description | +|-------------------------------------------------------------------------------|-------------| +| System.Collections.Generic.ICollection\ | | + +## Methods + +### Run(INetworkEventsApi, CancellationToken) + +
    + +
    + +
    + +
    + +#### Declaration + +``` lang-csharp +protected override async Task Run(INetworkEventsApi networkEventsApi, CancellationToken cancellationToken) +``` + +#### Parameters + +| Type | Name | Description | +|-------------------|-------------------|-------------| +| INetworkEventsApi | networkEventsApi | | +| CancellationToken | cancellationToken | | + +#### Returns + +| Type | Description | +|------|-------------| +| Task | | + +#### Overrides + +
    + +NetworkScenarioTask.Run(INetworkEventsApi, CancellationToken) + +
    diff --git a/tools/api/Unity.Multiplayer.Tools.NetworkSimulator.Runtime.BuiltInScenarios.md b/tools/api/Unity.Multiplayer.Tools.NetworkSimulator.Runtime.BuiltInScenarios.md new file mode 100644 index 000000000..69f37008c --- /dev/null +++ b/tools/api/Unity.Multiplayer.Tools.NetworkSimulator.Runtime.BuiltInScenarios.md @@ -0,0 +1,63 @@ +--- +id: Unity.Multiplayer.Tools.NetworkSimulator.Runtime.BuiltInScenarios +title: Unity.Multiplayer.Tools.NetworkSimulator.Runtime.BuiltInScenarios +--- + +## Namespace Unity.Multiplayer.Tools.NetworkSimulator.Runtime.BuiltInScenarios + +
    + +
    + +
    + +
    + +
    + +
    + +## Classes + +### Unity.Multiplayer.Tools.NetworkSimulator.Runtime.BuiltInScenarios.ConnectionsCycle + +
    + +NetworkScenario that iterates through the Configurations list by order. + +
    + +### Unity.Multiplayer.Tools.NetworkSimulator.Runtime.BuiltInScenarios.ConnectionsCycle.Configuration + +
    + +Specifies the ConnectionPreset and the ChangeIntervalMilliseconds +configuration. PresetConfiguration + +
    + +### Unity.Multiplayer.Tools.NetworkSimulator.Runtime.BuiltInScenarios.PresetConfiguration + +
    + +Base class that provides support for Connection Presets, used for +Network Scenario Configurations. + +
    + +### Unity.Multiplayer.Tools.NetworkSimulator.Runtime.BuiltInScenarios.RandomConnectionsSwap + +
    + +NetworkScenario that iterates through the Configurations list in a +random order. + +
    + +### Unity.Multiplayer.Tools.NetworkSimulator.Runtime.BuiltInScenarios.RandomConnectionsSwap.Configuration + +
    + +Specifies a ConnectionPreset that can be selected. PresetConfiguration + +
    diff --git a/tools/api/Unity.Multiplayer.Tools.NetworkSimulator.Runtime.INetworkEventsApi.md b/tools/api/Unity.Multiplayer.Tools.NetworkSimulator.Runtime.INetworkEventsApi.md new file mode 100644 index 000000000..26b85ed12 --- /dev/null +++ b/tools/api/Unity.Multiplayer.Tools.NetworkSimulator.Runtime.INetworkEventsApi.md @@ -0,0 +1,218 @@ +--- +id: Unity.Multiplayer.Tools.NetworkSimulator.Runtime.INetworkEventsApi +title: Unity.Multiplayer.Tools.NetworkSimulator.Runtime.INetworkEventsApi +--- + +
    + +API that can be used to inspect the state of the simulated network and +trigger events. + +
    + +
    + +
    + +##### **Namespace**: System.Dynamic.ExpandoObject + +##### **Assembly**: Tools.dll + +##### Syntax + +``` lang-csharp +public interface INetworkEventsApi +``` + +## Properties + +### CurrentPreset + +
    + +Returns the current connection preset used to simulate network +conditions. + +
    + +
    + +
    + +#### Declaration + +``` lang-csharp +INetworkSimulatorPreset CurrentPreset { get; } +``` + +#### Property Value + +| Type | Description | +|-------------------------|-------------| +| INetworkSimulatorPreset | | + +### IsAvailable + +
    + +Returns whether the Network Simulator fulfills all required dependencies +and is available to be used. + +
    + +
    + +
    + +#### Declaration + +``` lang-csharp +bool IsAvailable { get; } +``` + +#### Property Value + +| Type | Description | +|----------------|-------------| +| System.Boolean | | + +### IsConnected + +
    + +Returns true when Network Simulator is connected. + +
    + +
    + +
    + +#### Declaration + +``` lang-csharp +bool IsConnected { get; } +``` + +#### Property Value + +| Type | Description | +|----------------|-------------| +| System.Boolean | | + +## Methods + +### ChangeConnectionPreset(INetworkSimulatorPreset) + +
    + +Changes the current connection preset used to simulate network condition +parameters. + +
    + +
    + +
    + +#### Declaration + +``` lang-csharp +void ChangeConnectionPreset(INetworkSimulatorPreset preset) +``` + +#### Parameters + +| Type | Name | Description | +|-------------------------|--------|-----------------------------------------| +| INetworkSimulatorPreset | preset | The Network Simulator Preset being set. | + +### Disconnect() + +
    + +Simulates a network disconnection. + +
    + +
    + +
    + +#### Declaration + +``` lang-csharp +void Disconnect() +``` + +### Reconnect() + +
    + +Reconnects after simulating a network disconnection. + +
    + +
    + +
    + +#### Declaration + +``` lang-csharp +void Reconnect() +``` + +### TriggerLagSpike(TimeSpan) + +
    + +Simulates a lag spike for the specified duration. + +
    + +
    + +
    + +#### Declaration + +``` lang-csharp +void TriggerLagSpike(TimeSpan duration) +``` + +#### Parameters + +| Type | Name | Description | +|-----------------|----------|--------------------------------------------------| +| System.TimeSpan | duration | The duration for which the lag spike shall last. | + +### TriggerLagSpikeAsync(TimeSpan) + +
    + +Simulates a lag spike for the specified duration. + +
    + +
    + +
    + +#### Declaration + +``` lang-csharp +Task TriggerLagSpikeAsync(TimeSpan duration) +``` + +#### Parameters + +| Type | Name | Description | +|-----------------|----------|--------------------------------------------------| +| System.TimeSpan | duration | The duration for which the lag spike shall last. | + +#### Returns + +| Type | Description | +|------|-------------------------------------------------------| +| Task | The task that runs for the duration of the lag spike. | diff --git a/tools/api/Unity.Multiplayer.Tools.NetworkSimulator.Runtime.INetworkSimulatorPreset.md b/tools/api/Unity.Multiplayer.Tools.NetworkSimulator.Runtime.INetworkSimulatorPreset.md new file mode 100644 index 000000000..b2a038b65 --- /dev/null +++ b/tools/api/Unity.Multiplayer.Tools.NetworkSimulator.Runtime.INetworkSimulatorPreset.md @@ -0,0 +1,176 @@ +--- +id: Unity.Multiplayer.Tools.NetworkSimulator.Runtime.INetworkSimulatorPreset +title: Unity.Multiplayer.Tools.NetworkSimulator.Runtime.INetworkSimulatorPreset +--- + +
    + +Aggregates configuration values used as presets for the network +simulator. + +
    + +
    + +
    + +##### **Namespace**: System.Dynamic.ExpandoObject + +##### **Assembly**: Tools.dll + +##### Syntax + +``` lang-csharp +public interface INetworkSimulatorPreset +``` + +## Properties + +### Description + +
    + +A description for the preset, usually explaining the real-world +situation that the preset is attempting to re-create. + +
    + +
    + +
    + +#### Declaration + +``` lang-csharp +string Description { get; set; } +``` + +#### Property Value + +| Type | Description | +|---------------|-------------| +| System.String | | + +### Name + +
    + +The name of the preset. + +
    + +
    + +
    + +#### Declaration + +``` lang-csharp +string Name { get; set; } +``` + +#### Property Value + +| Type | Description | +|---------------|-------------| +| System.String | | + +### PacketDelayMs + +
    + +Fixed delay to apply to all packets which pass through. + +
    + +
    + +
    + +#### Declaration + +``` lang-csharp +int PacketDelayMs { get; set; } +``` + +#### Property Value + +| Type | Description | +|--------------|-------------| +| System.Int32 | | + +### PacketJitterMs + +
    + +Variable delay to apply to all packets which pass through, adds or +subtracts amount from fixed delay. + +
    + +
    + +
    + +#### Declaration + +``` lang-csharp +int PacketJitterMs { get; set; } +``` + +#### Property Value + +| Type | Description | +|--------------|-------------| +| System.Int32 | | + +### PacketLossInterval + +
    + +Fixed interval to drop packets on. This is most suitable for tests where +predictable behaviour is desired, every Xth packet will be dropped. E.g. +If PacketLossInterval is 5 every 5th packet is dropped. + +
    + +
    + +
    + +#### Declaration + +``` lang-csharp +int PacketLossInterval { get; set; } +``` + +#### Property Value + +| Type | Description | +|--------------|-------------| +| System.Int32 | | + +### PacketLossPercent + +
    + +0 - 100, denotes the percentage of packets that will be dropped. E.g. +"5" means approximately every 20th packet will be dropped. + +
    + +
    + +
    + +#### Declaration + +``` lang-csharp +int PacketLossPercent { get; set; } +``` + +#### Property Value + +| Type | Description | +|--------------|-------------| +| System.Int32 | | diff --git a/tools/api/Unity.Multiplayer.Tools.NetworkSimulator.Runtime.MinMaxRangeAttribute.md b/tools/api/Unity.Multiplayer.Tools.NetworkSimulator.Runtime.MinMaxRangeAttribute.md new file mode 100644 index 000000000..3fd806b59 --- /dev/null +++ b/tools/api/Unity.Multiplayer.Tools.NetworkSimulator.Runtime.MinMaxRangeAttribute.md @@ -0,0 +1,134 @@ +--- +id: Unity.Multiplayer.Tools.NetworkSimulator.Runtime.MinMaxRangeAttribute +title: Unity.Multiplayer.Tools.NetworkSimulator.Runtime.MinMaxRangeAttribute +--- + +
    + +
    + +
    + +
    + +
    + +##### Inheritance + +
    + +System.Dynamic.ExpandoObject + +
    + +
    + +System.Dynamic.ExpandoObject + +
    + +
    + +##### **Namespace**: System.Dynamic.ExpandoObject + +##### **Assembly**: Tools.dll + +##### Syntax + +``` lang-csharp +public class MinMaxRangeAttribute : PropertyAttribute +``` + +## Constructors + +### MinMaxRangeAttribute(Single, Single, Boolean) + +
    + +
    + +
    + +
    + +#### Declaration + +``` lang-csharp +public MinMaxRangeAttribute(float min, float max, bool roundToInt = false) +``` + +#### Parameters + +| Type | Name | Description | +|----------------|------------|-------------| +| System.Single | min | | +| System.Single | max | | +| System.Boolean | roundToInt | | + +## Fields + +### Max + +
    + +
    + +
    + +
    + +#### Declaration + +``` lang-csharp +public readonly float Max +``` + +#### Field Value + +| Type | Description | +|---------------|-------------| +| System.Single | | + +### Min + +
    + +
    + +
    + +
    + +#### Declaration + +``` lang-csharp +public readonly float Min +``` + +#### Field Value + +| Type | Description | +|---------------|-------------| +| System.Single | | + +### RoundToInt + +
    + +
    + +
    + +
    + +#### Declaration + +``` lang-csharp +public readonly bool RoundToInt +``` + +#### Field Value + +| Type | Description | +|----------------|-------------| +| System.Boolean | | diff --git a/tools/api/Unity.Multiplayer.Tools.NetworkSimulator.Runtime.NetworkScenario.md b/tools/api/Unity.Multiplayer.Tools.NetworkSimulator.Runtime.NetworkScenario.md new file mode 100644 index 000000000..23a1336a1 --- /dev/null +++ b/tools/api/Unity.Multiplayer.Tools.NetworkSimulator.Runtime.NetworkScenario.md @@ -0,0 +1,224 @@ +--- +id: Unity.Multiplayer.Tools.NetworkSimulator.Runtime.NetworkScenario +title: Unity.Multiplayer.Tools.NetworkSimulator.Runtime.NetworkScenario +--- + +
    + +Base class to implement network scenarios, used to start, pause, and +resume their behavior at runtime. + +
    + +
    + +
    + +
    + +##### Inheritance + +
    + +System.Dynamic.ExpandoObject + +
    + +
    + +System.Dynamic.ExpandoObject + +
    + +
    + +System.Dynamic.ExpandoObject + +
    + +
    + +System.Dynamic.ExpandoObject + +
    + +
    + +
    + +##### Inherited Members + +
    + +Object.ToString() + +
    + +
    + +Object.Equals(Object) + +
    + +
    + +Object.Equals(Object, Object) + +
    + +
    + +Object.ReferenceEquals(Object, Object) + +
    + +
    + +Object.GetHashCode() + +
    + +
    + +Object.GetType() + +
    + +
    + +Object.MemberwiseClone() + +
    + +
    + +##### **Namespace**: System.Dynamic.ExpandoObject + +##### **Assembly**: Tools.dll + +##### Syntax + +``` lang-csharp +[Serializable] +public abstract class NetworkScenario +``` + +##### **Remarks** + +
    + +This base class should be used for custom scenarios. If an frame update +is desired, NetworkScenarioBehaviour instead. If an asynchronous +task-based implementation is desired, NetworkScenarioTask instead. + +
    + +## Properties + +### IsPaused + +
    + +Pause state of the scenario. Returns true when the scenario is paused, +false otherwise. Set to true to pause, set to false when paused to +resume. + +
    + +
    + +
    + +#### Declaration + +``` lang-csharp +public bool IsPaused { get; set; } +``` + +#### Property Value + +| Type | Description | +|----------------|-------------| +| System.Boolean | | + +## Methods + +### Dispose() + +
    + +Disposes the scenario. + +
    + +
    + +
    + +#### Declaration + +``` lang-csharp +public virtual void Dispose() +``` + +### OnPause() + +
    + +Implement to define custom behaviour to be called when the scenario is +paused. + +
    + +
    + +
    + +#### Declaration + +``` lang-csharp +protected virtual void OnPause() +``` + +### OnResume() + +
    + +Implement to define custom behaviour to be called when the scenario is +resumed. + +
    + +
    + +
    + +#### Declaration + +``` lang-csharp +protected virtual void OnResume() +``` + +### Start(INetworkEventsApi) + +
    + +Starts running the underlying network scenario. + +
    + +
    + +
    + +#### Declaration + +``` lang-csharp +public abstract void Start(INetworkEventsApi networkEventsApi) +``` + +#### Parameters + +| Type | Name | Description | +|-------------------|------------------|-------------------------------------------| +| INetworkEventsApi | networkEventsApi | API to trigger network simulation events. | diff --git a/tools/api/Unity.Multiplayer.Tools.NetworkSimulator.Runtime.NetworkScenarioBehaviour.md b/tools/api/Unity.Multiplayer.Tools.NetworkSimulator.Runtime.NetworkScenarioBehaviour.md new file mode 100644 index 000000000..e9e29ba9f --- /dev/null +++ b/tools/api/Unity.Multiplayer.Tools.NetworkSimulator.Runtime.NetworkScenarioBehaviour.md @@ -0,0 +1,155 @@ +--- +id: Unity.Multiplayer.Tools.NetworkSimulator.Runtime.NetworkScenarioBehaviour +title: Unity.Multiplayer.Tools.NetworkSimulator.Runtime.NetworkScenarioBehaviour +--- + +
    + +Base class to use a MonoBehaviour-style frame update loop with network +scenarios. + +
    + +
    + +
    + +
    + +##### Inheritance + +
    + +System.Dynamic.ExpandoObject + +
    + +
    + +System.Dynamic.ExpandoObject + +
    + +
    + +System.Dynamic.ExpandoObject + +
    + +
    + +
    + +##### Inherited Members + +
    + +NetworkScenario.IsPaused + +
    + +
    + +NetworkScenario.Start(INetworkEventsApi) + +
    + +
    + +NetworkScenario.Dispose() + +
    + +
    + +NetworkScenario.OnPause() + +
    + +
    + +NetworkScenario.OnResume() + +
    + +
    + +Object.ToString() + +
    + +
    + +Object.Equals(Object) + +
    + +
    + +Object.Equals(Object, Object) + +
    + +
    + +Object.ReferenceEquals(Object, Object) + +
    + +
    + +Object.GetHashCode() + +
    + +
    + +Object.GetType() + +
    + +
    + +Object.MemberwiseClone() + +
    + +
    + +##### **Namespace**: System.Dynamic.ExpandoObject + +##### **Assembly**: Tools.dll + +##### Syntax + +``` lang-csharp +public abstract class NetworkScenarioBehaviour : NetworkScenario +``` + +## Methods + +### Update(Single) + +
    + +Method called on every frame to determine what the scenario should run +since the last frame. Only called when the scenario is not paused, so +there is no need to manually check it in the implementation. + +
    + +
    + +
    + +#### Declaration + +``` lang-csharp +protected abstract void Update(float deltaTime) +``` + +#### Parameters + +| Type | Name | Description | +|---------------|-----------|------------------------------------| +| System.Single | deltaTime | The time elapsed since last frame. | diff --git a/tools/api/Unity.Multiplayer.Tools.NetworkSimulator.Runtime.NetworkScenarioTask.md b/tools/api/Unity.Multiplayer.Tools.NetworkSimulator.Runtime.NetworkScenarioTask.md new file mode 100644 index 000000000..7542f3c1c --- /dev/null +++ b/tools/api/Unity.Multiplayer.Tools.NetworkSimulator.Runtime.NetworkScenarioTask.md @@ -0,0 +1,214 @@ +--- +id: Unity.Multiplayer.Tools.NetworkSimulator.Runtime.NetworkScenarioTask +title: Unity.Multiplayer.Tools.NetworkSimulator.Runtime.NetworkScenarioTask +--- + +
    + +Base class to use network scenarios with asynchronous Tasks. + +
    + +
    + +
    + +
    + +##### Inheritance + +
    + +System.Dynamic.ExpandoObject + +
    + +
    + +System.Dynamic.ExpandoObject + +
    + +
    + +System.Dynamic.ExpandoObject + +
    + +
    + +System.Dynamic.ExpandoObject + +
    + +
    + +System.Dynamic.ExpandoObject + +
    + +
    + +
    + +##### Inherited Members + +
    + +NetworkScenario.IsPaused + +
    + +
    + +NetworkScenario.OnPause() + +
    + +
    + +NetworkScenario.OnResume() + +
    + +
    + +Object.ToString() + +
    + +
    + +Object.Equals(Object) + +
    + +
    + +Object.Equals(Object, Object) + +
    + +
    + +Object.ReferenceEquals(Object, Object) + +
    + +
    + +Object.GetHashCode() + +
    + +
    + +Object.GetType() + +
    + +
    + +Object.MemberwiseClone() + +
    + +
    + +##### **Namespace**: System.Dynamic.ExpandoObject + +##### **Assembly**: Tools.dll + +##### Syntax + +``` lang-csharp +public abstract class NetworkScenarioTask : NetworkScenario +``` + +## Methods + +### Dispose() + +
    + +
    + +
    + +
    + +#### Declaration + +``` lang-csharp +public override void Dispose() +``` + +#### Overrides + +
    + +NetworkScenario.Dispose() + +
    + +### Run(INetworkEventsApi, CancellationToken) + +
    + +Starts running the underlying network scenario. Make sure to handle when +IsPaused and the cancellation token. + +
    + +
    + +
    + +#### Declaration + +``` lang-csharp +protected abstract Task Run(INetworkEventsApi networkEventsApi, CancellationToken cancellationToken) +``` + +#### Parameters + +| Type | Name | Description | +|-------------------|-------------------|----------------------------------------------------------------------------| +| INetworkEventsApi | networkEventsApi | API to trigger network simulation events. | +| CancellationToken | cancellationToken | Cancellation token to handle cancellation requests to the underlying task. | + +#### Returns + +| Type | Description | +|------|------------------------------| +| Task | Task simulating the scenario | + +### Start(INetworkEventsApi) + +
    + +
    + +
    + +
    + +#### Declaration + +``` lang-csharp +public override void Start(INetworkEventsApi networkEventsApi) +``` + +#### Parameters + +| Type | Name | Description | +|-------------------|------------------|-------------| +| INetworkEventsApi | networkEventsApi | | + +#### Overrides + +
    + +NetworkScenario.Start(INetworkEventsApi) + +
    diff --git a/tools/api/Unity.Multiplayer.Tools.NetworkSimulator.Runtime.NetworkSimulator.md b/tools/api/Unity.Multiplayer.Tools.NetworkSimulator.Runtime.NetworkSimulator.md new file mode 100644 index 000000000..136a4befd --- /dev/null +++ b/tools/api/Unity.Multiplayer.Tools.NetworkSimulator.Runtime.NetworkSimulator.md @@ -0,0 +1,214 @@ +--- +id: Unity.Multiplayer.Tools.NetworkSimulator.Runtime.NetworkSimulator +title: Unity.Multiplayer.Tools.NetworkSimulator.Runtime.NetworkSimulator +--- + +
    + +Add this component to any game object to configure network simulation +parameters. + +
    + +
    + +
    + +
    + +##### Inheritance + +
    + +System.Dynamic.ExpandoObject + +
    + +
    + +System.Dynamic.ExpandoObject + +
    + +
    + +
    + +##### Implements + +
    + +System.ComponentModel.INotifyPropertyChanged + +
    + +
    + +##### **Namespace**: System.Dynamic.ExpandoObject + +##### **Assembly**: Tools.dll + +##### Syntax + +``` lang-csharp +public class NetworkSimulator : MonoBehaviour, INotifyPropertyChanged +``` + +## Fields + +### AutoRunScenario + +
    + +Allows to determine if network scenarios should start automatically or +not. + +
    + +
    + +
    + +#### Declaration + +``` lang-csharp +public bool AutoRunScenario +``` + +#### Field Value + +| Type | Description | +|----------------|-------------| +| System.Boolean | | + +## Properties + +### ConnectionPreset + +
    + +The Connection Preset used to define a set of connection parameters to +simulate the network condition at runtime. + +
    + +
    + +
    + +#### Declaration + +``` lang-csharp +public INetworkSimulatorPreset ConnectionPreset { get; set; } +``` + +#### Property Value + +| Type | Description | +|-------------------------|-------------| +| INetworkSimulatorPreset | | + +### IsAvailable + +
    + +Returns whether the underlying network transport is available. + +
    + +
    + +
    + +#### Declaration + +``` lang-csharp +public bool IsAvailable { get; } +``` + +#### Property Value + +| Type | Description | +|----------------|-------------| +| System.Boolean | | + +### IsConnected + +
    + +Returns whether the underlying network transport is connected. + +
    + +
    + +
    + +#### Declaration + +``` lang-csharp +public bool IsConnected { get; } +``` + +#### Property Value + +| Type | Description | +|----------------|-------------| +| System.Boolean | | + +### Scenario + +
    + +The Network Scenario used to modify network connection parameters at +runtime. + +
    + +
    + +
    + +#### Declaration + +``` lang-csharp +public NetworkScenario Scenario { get; set; } +``` + +#### Property Value + +| Type | Description | +|-----------------|-------------| +| NetworkScenario | | + +## Explicit Interface Implementations + +### INotifyPropertyChanged.PropertyChanged + +
    + +
    + +
    + +
    + +#### Declaration + +``` lang-csharp +event PropertyChangedEventHandler INotifyPropertyChanged.PropertyChanged +``` + +#### Returns + +| Type | Description | +|---------------------------------------------------|-------------| +| System.ComponentModel.PropertyChangedEventHandler | | + +### Implements + +
    + +System.ComponentModel.INotifyPropertyChanged + +
    diff --git a/tools/api/Unity.Multiplayer.Tools.NetworkSimulator.Runtime.NetworkSimulatorPreset.md b/tools/api/Unity.Multiplayer.Tools.NetworkSimulator.Runtime.NetworkSimulatorPreset.md new file mode 100644 index 000000000..d674fdc92 --- /dev/null +++ b/tools/api/Unity.Multiplayer.Tools.NetworkSimulator.Runtime.NetworkSimulatorPreset.md @@ -0,0 +1,416 @@ +--- +id: Unity.Multiplayer.Tools.NetworkSimulator.Runtime.NetworkSimulatorPreset +title: Unity.Multiplayer.Tools.NetworkSimulator.Runtime.NetworkSimulatorPreset +--- + +
    + +Preset containing the parameters to configure and simulate network +conditions. + +
    + +
    + +
    + +
    + +##### Inheritance + +
    + +System.Dynamic.ExpandoObject + +
    + +
    + +System.Dynamic.ExpandoObject + +
    + +
    + +
    + +##### Implements + +
    + +INetworkSimulatorPreset + +
    + +
    + +System.IEquatable\ + +
    + +
    + +
    + +##### Inherited Members + +
    + +Object.Equals(Object, Object) + +
    + +
    + +Object.ReferenceEquals(Object, Object) + +
    + +
    + +Object.GetType() + +
    + +
    + +Object.MemberwiseClone() + +
    + +
    + +##### **Namespace**: System.Dynamic.ExpandoObject + +##### **Assembly**: Tools.dll + +##### Syntax + +``` lang-csharp +[Serializable] +public class NetworkSimulatorPreset : INetworkSimulatorPreset, IEquatable +``` + +## Properties + +### Description + +
    + +Optional description of the configuration. + +
    + +
    + +
    + +#### Declaration + +``` lang-csharp +public string Description { get; set; } +``` + +#### Property Value + +| Type | Description | +|---------------|-------------| +| System.String | | + +### Name + +
    + +Network simulation configuration name. + +
    + +
    + +
    + +#### Declaration + +``` lang-csharp +public string Name { get; set; } +``` + +#### Property Value + +| Type | Description | +|---------------|-------------| +| System.String | | + +### PacketDelayMs + +
    + +Value for the delay between packet in milliseconds. + +
    + +
    + +
    + +#### Declaration + +``` lang-csharp +public int PacketDelayMs { get; set; } +``` + +#### Property Value + +| Type | Description | +|--------------|-------------| +| System.Int32 | | + +### PacketJitterMs + +
    + +Value for the network jitter (variance) in milliseconds. + +
    + +
    + +
    + +#### Declaration + +``` lang-csharp +public int PacketJitterMs { get; set; } +``` + +#### Property Value + +| Type | Description | +|--------------|-------------| +| System.Int32 | | + +### PacketLossInterval + +
    + +Value for at which interval packet are dropped This value is a drop +every X packet, not in time. + +
    + +
    + +
    + +#### Declaration + +``` lang-csharp +public int PacketLossInterval { get; set; } +``` + +#### Property Value + +| Type | Description | +|--------------|-------------| +| System.Int32 | | + +### PacketLossPercent + +
    + +Value for the average percentage of packet are dropped. + +
    + +
    + +
    + +#### Declaration + +``` lang-csharp +public int PacketLossPercent { get; set; } +``` + +#### Property Value + +| Type | Description | +|--------------|-------------| +| System.Int32 | | + +## Methods + +### Create(String, String, Int32, Int32, Int32, Int32) + +
    + +Utility function to create a configuration at runtime. + +
    + +
    + +
    + +#### Declaration + +``` lang-csharp +public static NetworkSimulatorPreset Create(string name, string description = "", int packetDelayMs = 0, int packetJitterMs = 0, int packetLossInterval = 0, int packetLossPercent = 0) +``` + +#### Parameters + +| Type | Name | Description | +|---------------|--------------------|-----------------------------------------------| +| System.String | name | Name of the configuration. | +| System.String | description | Description of the configuration. | +| System.Int32 | packetDelayMs | Value for the packet delay in milliseconds. | +| System.Int32 | packetJitterMs | Value for the network jitter in milliseconds. | +| System.Int32 | packetLossInterval | Value for the packet loss interval. | +| System.Int32 | packetLossPercent | Value for the packet loss percentage. | + +#### Returns + +| Type | Description | +|------------------------|-----------------------------------| +| NetworkSimulatorPreset | A valid simulation configuration. | + +### Equals(Object) + +
    + +
    + +
    + +
    + +#### Declaration + +``` lang-csharp +public override bool Equals(object obj) +``` + +#### Parameters + +| Type | Name | Description | +|---------------|------|-------------| +| System.Object | obj | | + +#### Returns + +| Type | Description | +|----------------|-------------| +| System.Boolean | | + +#### Overrides + +
    + +System.Object.Equals(System.Object) + +
    + +### Equals(NetworkSimulatorPreset) + +
    + +Determines whether the specified object is equal to the current object. + +
    + +
    + +
    + +#### Declaration + +``` lang-csharp +public bool Equals(NetworkSimulatorPreset other) +``` + +#### Parameters + +| Type | Name | Description | +|------------------------|-------|------------------------------------------------| +| NetworkSimulatorPreset | other | The object to compare with the current object. | + +#### Returns + +| Type | Description | +|----------------|--------------------------------------------------------------------------------| +| System.Boolean | true if the specified object is equal to the current object; otherwise, false. | + +### GetHashCode() + +
    + +
    + +
    + +
    + +#### Declaration + +``` lang-csharp +public override int GetHashCode() +``` + +#### Returns + +| Type | Description | +|--------------|-------------| +| System.Int32 | | + +#### Overrides + +
    + +System.Object.GetHashCode() + +
    + +### ToString() + +
    + +
    + +
    + +
    + +#### Declaration + +``` lang-csharp +public override string ToString() +``` + +#### Returns + +| Type | Description | +|---------------|-------------| +| System.String | | + +#### Overrides + +
    + +System.Object.ToString() + +
    + +### Implements + +
    + +INetworkSimulatorPreset + +
    + +
    + +System.IEquatable\ + +
    diff --git a/tools/api/Unity.Multiplayer.Tools.NetworkSimulator.Runtime.NetworkSimulatorPresetAsset.md b/tools/api/Unity.Multiplayer.Tools.NetworkSimulator.Runtime.NetworkSimulatorPresetAsset.md new file mode 100644 index 000000000..70057d5d6 --- /dev/null +++ b/tools/api/Unity.Multiplayer.Tools.NetworkSimulator.Runtime.NetworkSimulatorPresetAsset.md @@ -0,0 +1,247 @@ +--- +id: Unity.Multiplayer.Tools.NetworkSimulator.Runtime.NetworkSimulatorPresetAsset +title: Unity.Multiplayer.Tools.NetworkSimulator.Runtime.NetworkSimulatorPresetAsset +--- + +
    + +ScriptableObject used to store the parameters to configure and simulate +network conditions. + +
    + +
    + +
    + +
    + +##### Inheritance + +
    + +System.Dynamic.ExpandoObject + +
    + +
    + +System.Dynamic.ExpandoObject + +
    + +
    + +
    + +##### Implements + +
    + +INetworkSimulatorPreset + +
    + +
    + +##### **Namespace**: System.Dynamic.ExpandoObject + +##### **Assembly**: Tools.dll + +##### Syntax + +``` lang-csharp +public class NetworkSimulatorPresetAsset : ScriptableObject, INetworkSimulatorPreset +``` + +## Properties + +### Description + +
    + +Optional description of the configuration. + +
    + +
    + +
    + +#### Declaration + +``` lang-csharp +public string Description { get; set; } +``` + +#### Property Value + +| Type | Description | +|---------------|-------------| +| System.String | | + +### Name + +
    + +Network simulation configuration name. + +
    + +
    + +
    + +#### Declaration + +``` lang-csharp +public string Name { get; set; } +``` + +#### Property Value + +| Type | Description | +|---------------|-------------| +| System.String | | + +### PacketDelayMs + +
    + +Value for the delay between packet in milliseconds. + +
    + +
    + +
    + +#### Declaration + +``` lang-csharp +public int PacketDelayMs { get; set; } +``` + +#### Property Value + +| Type | Description | +|--------------|-------------| +| System.Int32 | | + +### PacketJitterMs + +
    + +Value for the network jitter (variance) in milliseconds. + +
    + +
    + +
    + +#### Declaration + +``` lang-csharp +public int PacketJitterMs { get; set; } +``` + +#### Property Value + +| Type | Description | +|--------------|-------------| +| System.Int32 | | + +### PacketLossInterval + +
    + +Value for at which interval packet are dropped This value is a drop +every X packet, not in time. + +
    + +
    + +
    + +#### Declaration + +``` lang-csharp +public int PacketLossInterval { get; set; } +``` + +#### Property Value + +| Type | Description | +|--------------|-------------| +| System.Int32 | | + +### PacketLossPercent + +
    + +Value for the average percentage of packet are dropped. + +
    + +
    + +
    + +#### Declaration + +``` lang-csharp +public int PacketLossPercent { get; set; } +``` + +#### Property Value + +| Type | Description | +|--------------|-------------| +| System.Int32 | | + +## Methods + +### Create(String, String, Int32, Int32, Int32, Int32) + +
    + +Utility function to create a configuration at runtime. + +
    + +
    + +
    + +#### Declaration + +``` lang-csharp +public static NetworkSimulatorPresetAsset Create(string name, string description = "", int packetDelayMs = 0, int packetJitterMs = 0, int packetLossInterval = 0, int packetLossPercent = 0) +``` + +#### Parameters + +| Type | Name | Description | +|---------------|--------------------|-----------------------------------------------| +| System.String | name | Name of the configuration. | +| System.String | description | Description of the configuration. | +| System.Int32 | packetDelayMs | Value for the packet delay in milliseconds. | +| System.Int32 | packetJitterMs | Value for the network jitter in milliseconds. | +| System.Int32 | packetLossInterval | Value for the packet loss interval. | +| System.Int32 | packetLossPercent | Value for the packet loss percentage. | + +#### Returns + +| Type | Description | +|-----------------------------|-----------------------------------| +| NetworkSimulatorPresetAsset | A valid simulation configuration. | + +### Implements + +
    + +INetworkSimulatorPreset + +
    diff --git a/tools/api/Unity.Multiplayer.Tools.NetworkSimulator.Runtime.NetworkSimulatorPresets.md b/tools/api/Unity.Multiplayer.Tools.NetworkSimulator.Runtime.NetworkSimulatorPresets.md new file mode 100644 index 000000000..19cae8468 --- /dev/null +++ b/tools/api/Unity.Multiplayer.Tools.NetworkSimulator.Runtime.NetworkSimulatorPresets.md @@ -0,0 +1,381 @@ +--- +id: Unity.Multiplayer.Tools.NetworkSimulator.Runtime.NetworkSimulatorPresets +title: Unity.Multiplayer.Tools.NetworkSimulator.Runtime.NetworkSimulatorPresets +--- + +
    + +Static class containing the built-in presets to configure and simulate +network conditions. + +
    + +
    + +
    + +
    + +##### Inheritance + +
    + +System.Dynamic.ExpandoObject + +
    + +
    + +System.Dynamic.ExpandoObject + +
    + +
    + +
    + +##### Inherited Members + +
    + +Object.ToString() + +
    + +
    + +Object.Equals(Object) + +
    + +
    + +Object.Equals(Object, Object) + +
    + +
    + +Object.ReferenceEquals(Object, Object) + +
    + +
    + +Object.GetHashCode() + +
    + +
    + +Object.GetType() + +
    + +
    + +Object.MemberwiseClone() + +
    + +
    + +##### **Namespace**: System.Dynamic.ExpandoObject + +##### **Assembly**: Tools.dll + +##### Syntax + +``` lang-csharp +public static class NetworkSimulatorPresets +``` + +## Fields + +### HomeBroadband + +
    + +Preset that simulates a typical home broadband connection. + +
    + +
    + +
    + +#### Declaration + +``` lang-csharp +public static readonly NetworkSimulatorPreset HomeBroadband +``` + +#### Field Value + +| Type | Description | +|------------------------|-------------| +| NetworkSimulatorPreset | | + +### Mobile2_5G + +
    + +Preset that simulates a typical 2.5G (GPRS) mobile connection. + +
    + +
    + +
    + +#### Declaration + +``` lang-csharp +public static readonly NetworkSimulatorPreset Mobile2_5G +``` + +#### Field Value + +| Type | Description | +|------------------------|-------------| +| NetworkSimulatorPreset | | + +### Mobile2_75G + +
    + +Preset that simulates a typical 2.75G (EDGE) mobile connection. + +
    + +
    + +
    + +#### Declaration + +``` lang-csharp +public static readonly NetworkSimulatorPreset Mobile2_75G +``` + +#### Field Value + +| Type | Description | +|------------------------|-------------| +| NetworkSimulatorPreset | | + +### Mobile2G + +
    + +Preset that simulates a typical 2G mobile connection. + +
    + +
    + +
    + +#### Declaration + +``` lang-csharp +public static readonly NetworkSimulatorPreset Mobile2G +``` + +#### Field Value + +| Type | Description | +|------------------------|-------------| +| NetworkSimulatorPreset | | + +### Mobile3_5G + +
    + +Preset that simulates a typical 3.5G (HSDPA/H) mobile connection. + +
    + +
    + +
    + +#### Declaration + +``` lang-csharp +public static readonly NetworkSimulatorPreset Mobile3_5G +``` + +#### Field Value + +| Type | Description | +|------------------------|-------------| +| NetworkSimulatorPreset | | + +### Mobile3_75G + +
    + +Preset that simulates a typical 3.75G (HSPA+/H+) mobile connection. + +
    + +
    + +
    + +#### Declaration + +``` lang-csharp +public static readonly NetworkSimulatorPreset Mobile3_75G +``` + +#### Field Value + +| Type | Description | +|------------------------|-------------| +| NetworkSimulatorPreset | | + +### Mobile3G + +
    + +Preset that simulates a typical 3G mobile connection. + +
    + +
    + +
    + +#### Declaration + +``` lang-csharp +public static readonly NetworkSimulatorPreset Mobile3G +``` + +#### Field Value + +| Type | Description | +|------------------------|-------------| +| NetworkSimulatorPreset | | + +### Mobile4_5G + +
    + +Preset that simulates a typical 4.5G (LTE+) mobile connection. + +
    + +
    + +
    + +#### Declaration + +``` lang-csharp +public static readonly NetworkSimulatorPreset Mobile4_5G +``` + +#### Field Value + +| Type | Description | +|------------------------|-------------| +| NetworkSimulatorPreset | | + +### Mobile4G + +
    + +Preset that simulates a typical 4G (LTE) mobile connection. + +
    + +
    + +
    + +#### Declaration + +``` lang-csharp +public static readonly NetworkSimulatorPreset Mobile4G +``` + +#### Field Value + +| Type | Description | +|------------------------|-------------| +| NetworkSimulatorPreset | | + +### Mobile5G + +
    + +Preset that simulates a typical 5G mobile connection. + +
    + +
    + +
    + +#### Declaration + +``` lang-csharp +public static readonly NetworkSimulatorPreset Mobile5G +``` + +#### Field Value + +| Type | Description | +|------------------------|-------------| +| NetworkSimulatorPreset | | + +### None + +
    + +Preset with no network simulation applied. + +
    + +
    + +
    + +#### Declaration + +``` lang-csharp +public static readonly NetworkSimulatorPreset None +``` + +#### Field Value + +| Type | Description | +|------------------------|-------------| +| NetworkSimulatorPreset | | + +### Values + +
    + +Contains all available network preset values. + +
    + +
    + +
    + +#### Declaration + +``` lang-csharp +public static readonly NetworkSimulatorPreset[] Values +``` + +#### Field Value + +| Type | Description | +|----------------------------|-------------| +| NetworkSimulatorPreset\[\] | | diff --git a/tools/api/Unity.Multiplayer.Tools.NetworkSimulator.Runtime.md b/tools/api/Unity.Multiplayer.Tools.NetworkSimulator.Runtime.md new file mode 100644 index 000000000..c1721e672 --- /dev/null +++ b/tools/api/Unity.Multiplayer.Tools.NetworkSimulator.Runtime.md @@ -0,0 +1,108 @@ +--- +id: Unity.Multiplayer.Tools.NetworkSimulator.Runtime +title: Unity.Multiplayer.Tools.NetworkSimulator.Runtime +--- + +## Namespace Unity.Multiplayer.Tools.NetworkSimulator.Runtime + +
    + +
    + +
    + +
    + +
    + +
    + +## Classes + +### Unity.Multiplayer.Tools.NetworkSimulator.Runtime.MinMaxRangeAttribute + +
    + +
    + +### Unity.Multiplayer.Tools.NetworkSimulator.Runtime.NetworkScenario + +
    + +Base class to implement network scenarios, used to start, pause, and +resume their behavior at runtime. + +
    + +### Unity.Multiplayer.Tools.NetworkSimulator.Runtime.NetworkScenarioBehaviour + +
    + +Base class to use a MonoBehaviour-style frame update loop with network +scenarios. + +
    + +### Unity.Multiplayer.Tools.NetworkSimulator.Runtime.NetworkScenarioTask + +
    + +Base class to use network scenarios with asynchronous Tasks. + +
    + +### Unity.Multiplayer.Tools.NetworkSimulator.Runtime.NetworkSimulator + +
    + +Add this component to any game object to configure network simulation +parameters. + +
    + +### Unity.Multiplayer.Tools.NetworkSimulator.Runtime.NetworkSimulatorPreset + +
    + +Preset containing the parameters to configure and simulate network +conditions. + +
    + +### Unity.Multiplayer.Tools.NetworkSimulator.Runtime.NetworkSimulatorPresetAsset + +
    + +ScriptableObject used to store the parameters to configure and simulate +network conditions. + +
    + +### Unity.Multiplayer.Tools.NetworkSimulator.Runtime.NetworkSimulatorPresets + +
    + +Static class containing the built-in presets to configure and simulate +network conditions. + +
    + +## Interfaces + +### Unity.Multiplayer.Tools.NetworkSimulator.Runtime.INetworkEventsApi + +
    + +API that can be used to inspect the state of the simulated network and +trigger events. + +
    + +### Unity.Multiplayer.Tools.NetworkSimulator.Runtime.INetworkSimulatorPreset + +
    + +Aggregates configuration values used as presets for the network +simulator. + +
    diff --git a/tools/api/Unity.Multiplayer.Tools.Tests.Editor.BuildSymbolTests.md b/tools/api/Unity.Multiplayer.Tools.Tests.Editor.BuildSymbolTests.md new file mode 100644 index 000000000..d57f0e322 --- /dev/null +++ b/tools/api/Unity.Multiplayer.Tools.Tests.Editor.BuildSymbolTests.md @@ -0,0 +1,106 @@ +--- +id: Unity.Multiplayer.Tools.Tests.Editor.BuildSymbolTests +title: Unity.Multiplayer.Tools.Tests.Editor.BuildSymbolTests +--- + +
    + +
    + +
    + +
    + +
    + +##### Inheritance + +
    + +System.Dynamic.ExpandoObject + +
    + +
    + +System.Dynamic.ExpandoObject + +
    + +
    + +
    + +##### Inherited Members + +
    + +Object.ToString() + +
    + +
    + +Object.Equals(Object) + +
    + +
    + +Object.Equals(Object, Object) + +
    + +
    + +Object.ReferenceEquals(Object, Object) + +
    + +
    + +Object.GetHashCode() + +
    + +
    + +Object.GetType() + +
    + +
    + +Object.MemberwiseClone() + +
    + +
    + +##### **Namespace**: System.Dynamic.ExpandoObject + +##### **Assembly**: Tools.dll + +##### Syntax + +``` lang-csharp +public class BuildSymbolTests +``` + +## Methods + +### When_GettingToolBuildSymbol_IsExpectedString() + +
    + +
    + +
    + +
    + +#### Declaration + +``` lang-csharp +public void When_GettingToolBuildSymbol_IsExpectedString() +``` diff --git a/tools/api/Unity.Multiplayer.Tools.Tests.Editor.md b/tools/api/Unity.Multiplayer.Tools.Tests.Editor.md new file mode 100644 index 000000000..a8e5311e4 --- /dev/null +++ b/tools/api/Unity.Multiplayer.Tools.Tests.Editor.md @@ -0,0 +1,26 @@ +--- +id: Unity.Multiplayer.Tools.Tests.Editor +title: Unity.Multiplayer.Tools.Tests.Editor +--- + +## Namespace Unity.Multiplayer.Tools.Tests.Editor + +
    + +
    + +
    + +
    + +
    + +
    + +## Classes + +### Unity.Multiplayer.Tools.Tests.Editor.BuildSymbolTests + +
    + +