From 79d0965dd2f862bbf37b16785d07c45ed4693d3f Mon Sep 17 00:00:00 2001 From: GuyQuad Date: Wed, 20 Jan 2016 23:07:04 +0530 Subject: [PATCH] capsule/bullet collider Added a feature to the capsule collider 2D which can transform the capsule into a bullet --- .../Scripts/CapsuleCollider2D.cs | 79 +++++++++++++----- .../Editor/CapsuleCollider2D_Editor.cs | 7 ++ CustomColliders2D.unitypackage | Bin 8030 -> 8264 bytes 3 files changed, 66 insertions(+), 20 deletions(-) diff --git a/Custom 2D Colliders/Scripts/CapsuleCollider2D.cs b/Custom 2D Colliders/Scripts/CapsuleCollider2D.cs index 61457c5..cc94671 100644 --- a/Custom 2D Colliders/Scripts/CapsuleCollider2D.cs +++ b/Custom 2D Colliders/Scripts/CapsuleCollider2D.cs @@ -35,6 +35,10 @@ [RequireComponent(typeof(EdgeCollider2D))] public class CapsuleCollider2D : MonoBehaviour { + [HideInInspector] + public bool bullet = false, flip = false; + + [HideInInspector] [Range(.5f, 25)] public float radius = 1; @@ -48,50 +52,85 @@ public class CapsuleCollider2D : MonoBehaviour { public int rotation = 0; Vector2 origin, center, center1, center2; - + List points; + float ang = 0; + public Vector2[] getPoints(Vector2 off) { - List points = new List(); + points = new List(); origin = transform.localPosition; center = origin + off; float r = (height / 2f) - (radius); + + if (bullet && flip) r += radius; center1.x = center.x + r * Mathf.Sin(rotation * Mathf.Deg2Rad); center1.y = center.y + r * Mathf.Cos(rotation * Mathf.Deg2Rad); + if (bullet) { + if (!flip) r += radius; + else r -= radius; + } + center2.x = center.x + r * Mathf.Sin((rotation + 180f) * Mathf.Deg2Rad); center2.y = center.y + r * Mathf.Cos((rotation + 180f) * Mathf.Deg2Rad); - float ang = 360 - rotation; - - for (int i = 0; i <= smoothness/2; i++) - { - float a = ang * Mathf.Deg2Rad; - float x = center1.x + radius * Mathf.Cos(a); - float y = center1.y + radius * Mathf.Sin(a); - points.Add(new Vector2(x, y)); - ang += 360f/smoothness; - } - ang -= 360f / smoothness; + ang = 360f - rotation; + ang %= 360; - for (int i = smoothness/2; i <= smoothness; i++) + // top semi circle + for (int i = 0; i <= smoothness; i++) { - float a = ang * Mathf.Deg2Rad; - float x = center2.x + radius * Mathf.Cos(a); - float y = center2.y + radius * Mathf.Sin(a); + if (bullet && flip) + { + calcPointLocation(radius, center1); + ang += 180f; + calcPointLocation(radius, center1); + i = smoothness + 1; + } + else + { + calcPointLocation(radius, center1); + ang += 180f / smoothness; + } + } + + ang -= 180f / smoothness; + ang %= 360; - points.Add(new Vector2(x, y)); - ang += 360f / smoothness; + // bottom semi circle + for (int i = 0; i <= smoothness; i++) + { + if (bullet && !flip) + { + calcPointLocation(radius, center2); + ang += 180f; + calcPointLocation(radius, center2); + i = smoothness + 1; + } + else + { + calcPointLocation(radius, center2); + ang += 180f / smoothness; + } } points.Add(points[0]); - return points.ToArray(); } + + void calcPointLocation(float r, Vector2 centerPt) + { + float a = ang * Mathf.Deg2Rad; + float x = centerPt.x + r * Mathf.Cos(a); + float y = centerPt.y + r * Mathf.Sin(a); + + points.Add(new Vector2(x, y)); + } } #endif \ No newline at end of file diff --git a/Custom 2D Colliders/Scripts/Editor/CapsuleCollider2D_Editor.cs b/Custom 2D Colliders/Scripts/Editor/CapsuleCollider2D_Editor.cs index 32b3e5a..6605979 100644 --- a/Custom 2D Colliders/Scripts/Editor/CapsuleCollider2D_Editor.cs +++ b/Custom 2D Colliders/Scripts/Editor/CapsuleCollider2D_Editor.cs @@ -35,6 +35,7 @@ public class CapsuleCollider_Editor : Editor { CapsuleCollider2D capCol; EdgeCollider2D edgeCollider; Vector2 off; + bool advanced; void OnEnable() { @@ -55,6 +56,12 @@ public override void OnInspectorGUI() DrawDefaultInspector(); capCol.radius = Mathf.Clamp(capCol.radius, 0.5f, capCol.height / 2); + capCol.radius = EditorGUILayout.Slider("Radius", capCol.radius, 0.25f, capCol.height / 2f); + + GUILayout.Space(8); + capCol.bullet = EditorGUILayout.Toggle("Bullet", capCol.bullet); + if(capCol.bullet) capCol.flip = EditorGUILayout.Toggle("Flip", capCol.flip); + if (GUI.changed || !off.Equals(edgeCollider.offset)) { diff --git a/CustomColliders2D.unitypackage b/CustomColliders2D.unitypackage index ae0e4f9f1606a31cfa6a2c341caa486dc626e287..214d164c110354c9903170c89b27d330736708ef 100644 GIT binary patch delta 8224 zcmXYVbySp(^EF6!cMAg2Aky6-(j`(7k}BOibcnRHNT+o7g2VzM4GSU-(k-yS?mj<1 z-}n9J{x|2$xo2kXy|X4as({UsfQu_JoQnNa@aHUHZ>n!NlVhyDTcxirxgoCQF6cZ*%6HhU}ZNi*gy6wv`-jy8N zGls2>a(AZ3&JVt}hq0A4E^Z7rMqDooOj49vI8NK%PL4JzH>f*#s%8vhG=9ThF*IZc zGPU1jdU?jxF$O(E(fSKt$251I_zy|`R&&}U-@^=olMY~f^A@DZlzT$suhwL{ZUY_4 z#2K*of}+cy@(fDqjmL6m@Bw&SK@F;BC~I=c=yp&luGOkNr00WdP)sR>x0`MSr>JXt zNUh`_#x)}Ex#oQSms6=KpERL*3m&F`fe#b?hMAGZnS!3T&iqK)jmoyXamF3Io|uOp zSUh=$WaoJbsD45~ST&jO#;uRNJHh(sUo2;C>o0JnSk?-k0ogJ1=MCM>z0DzRQ&~v? z(ieKlE2?R%zSCI=yD);9xpvc`oE!nBXOHJpDYjBB$XBJ7A~vll=!n@y#ZmyVfk}Sn z$5U!cuZkuA@}=}M2Q9U{IHI;KRTPk3AzjErV}XhFNFS5N)y@eQ)aH20#Cuyg+rhO>Cf2 zU-4(c-W)!bb9p)`))0N+oE{JSQh8<}PIRxG?RYip@6wgdIjb`s)N{@{9j&nbMWe&8GZ+@R7${CJ}i0^;f9M+^D>g%Q_s;i&bb$T1*AL=8 z)ct<7d>0)vMD8egdf{khVfPvhQv$t@W-!5&ebn)TTt|nqVjF1;_If`?m)uD~{!EW= z+e5u#I2jcgleJYZ9T7yPSFs}NEf)rEuq4{@z2FqKs9-tl!W{4i)>OEVSEwwE%tP{} zus~8lQqqthsX|*(s2l#=9VX^T>Ir`10~Cgyc*KoEc>>W-r4ZO3vPVFYoV$T>&xV~JTBv2b34KoDe_LTfe!oflgCDTLi0@(3 z)ZP(`{4;EZ7`m2eDVIY7e(3b%7q%{?CtvI@AI|nMQW~CzjfnDR%A`DI8yn1iET*n- zp36B^f$P2p9=k!-xBk8_b=d}?!vIxLdOy$|Cl^N!uz)Z{*YowJ>c&T>R97F)I^CBw zYiOjrXxVZhkz5 zt4aXV_L^af+}xh^>ZM!*fPVWNl_bgnCnFOq*@mPo9pDP1R;Zq$ct@E|!6Vir&=Zlh z4PgX#;qU3e5Y5o%@m@V2)@p~twwzWvM2 zB~n_pYfWdt;Q%so8-xad?Z$4Ud>KT@cS&~SWLu#KCF##b> z#*Orm{K48H3r~`4_1@wrj$+DvCqo2Bd^}?9Sy{2D3ZBMy*onZ2Fv+pI?7h3Gl!#V6 zt#dOAjhhd|vK#TLG(&lngc(vOlAv)HW1V(mS>eafGk+R-mF6O<+&94@%3iLgJtqA1 z?a^CwufNW$25#d^UpSeD?I+?-8xjB~?P-hJ{<#JX`Cq6d-|s3Pn%a_)%&q1-r-&Y2 z(f$vbLf%nDY_~{}xKhFSur30)oyDBPWX?{SVlGuuyugiSc;(ShVl5Lbd)v)gML4$l zo#@$*=h@5WSvaqGD-{drYOkB}_O}Qg5swK50yXYZby?Kx8ehaKHQl)|?~H+o=II!v z*%(%nCj5Kh5J##{-CFfe>&i`>Y^*z}OxD!5Fr1ihIC9Psl3fWuJl<3pDfbatA;P)( znNy|w@|$~0<9$CPYQMnXM<`+IXZi~#3|GZp&too*18lw!nVp{0zLjb#%KEAr%$tWq zcA=}-?q&Klczo){Yb0fWHy4Wl{6U+K6K|&9g`U$5kNSB%K{~K1)SUU^|FR>M**>6$= zO(f_>8FnjWe4^tAO7f&EQB;3$Z|Q!U^6_vcxa%StM~S?DxyhW9r8y7o(>F)yfaj4HGDgAC{pvPvDNL(UK@;T4S6wD*$ zy>1z%i{G1j3qN|*a@RjUCwQPMt3;w%Hv9nvvKiv>W|P*e4yk}ft@ZTRdKDvDSoyAn zIDU9>YGGWp#=&0O>x>nVtd+)-y3yJ+-(hSb##d%MiPpJJ=97XmB<_nW!x_9sVPdsr zc@orDjjzW)W-1O=H;hST20vGLVDK#hEg?N#8piLTSV1Nm^fJ=oWMeP5BVpe-KL=P-B`O>oF466* zax2{A-d$1@*1a3o;CrLO8xk!E@cA6;EK{ObCeEs!t)-9e!FO|WRCApRmwU5M;-imm zJ|ZLA+WlG#$!Y?ZR7-K>)%4v#)71xXxQ_1}Y3(zeiv&OiXXdBg%PC7Xb9YX;1ah#Hmts<4{Z)1BtaK( zcmxn*?U10=1T5T>-|R=^oloI%2=YsEEf!yFxiop}{ETMv@)r@Kmr`CzSZ(K99bMlc zElaG+nt3nYX@Nbm8yh!SY@LP|`u11CP*ud4I;ELQoDN6TXWgDGd9+BTnmmGA>9Dnb z$Nn6fxwM22r)ZgCmXUUUZ_)8rE~Z~{ME%OI3>i%PZN|Pz{-jML zh>EUM%$4QQ*b4bu?~fNl$I9?d*~zJh?=NvG?A<&{RG;(6_bpUO!GP4>M^2dYox-*c z7Xbi8#G5T=joo{3k2yPuy(@N~FQTw&q zNz6An9TDi}b({#s6KQ;Fb}Lx>Qov+)#02=RWKENYTBY=}cksL$_#p~=-W8ms&w1@M zcTyTYBa&9Zd{RS%&({DE8O+u%Bh0ap{DI}3v&OtITFd7!WM>?b%nzeG=_sp_`m;$& zqGn)=E$+MSaV`=dhmQhN%!D>p0z-}5QKsT3K_4nP@LTla#(!hC4NirP<98AR2o|5N zhB!Mx9U+LVCx{!pjO}6!*VK* zttQ*0S%!}$(~l4P7^hZQn7u1Ucy?7K@?uxLqF>08#4vEsh9N zljrc;^#b&Np^#}?o23dkoe02h>ap+KmxncMv!za2cFpswCk~N;FcLI z1Ec1Lt|-b7GddYOES$Zpw?$f0l@8s@cY}%<4*xlxP*n1J^bHF%ICU6!NF4?Y-a%Z= z?10fh0QkI)@fC42mky{ia0Z%tE9t!(&qpXi;Mw`PQiHe1r`$rHvc|y-F3ck-W;1_2 zArXbUaQXF-zZ7U0#E84->@H5TFxQ9@dJkIaEB)Pc`vWh_yTK@`$++m6CR3(NYgq}% z)J%QM`g+eCq+;5G&N{rDi!w6L$mvcEH~c+(U}bF97})Y>@vOeJ~QF(=%s- zMS#Aaf8Wc?gT^GrW?;pjeklAX$3XqW)|g`9>)Nx=b(L|nq0bezFcpU^5k`9uj?`^P ztDf^6EDRhs;2HspbG9H&-=}~DB}T;Vh9C|g34b^qSOa6v4(v8>Zkz z)0;ZOnA0El)fgLVVqVKVf5|vX{|=4#_W0$6+nPo%hDt{n{ZFBRsOiwKP+kmp?M5av zpM5$<6|Fu0hZ4`kpawy{jRf=@>o)Qc-3WnGyHz-$_{|Bw(JhUjIi_`tgkqPP*zDQ& zO6=bsdSkA5{Q;f3k<TMA9IUIO+2+%hbQ8AX*lbS_mPTn+}=n$tSOdX{SbPzH5N(k<) zgO$-*Kfsv_pljJ89s=@@6N0A3|Jw-=$NCYlp^X-dw*l$GY#5_He^>|geKAJ0FTde! zTwQz*xGgL|zr8bP%aFr5t%B(jKpXQs%ONj!ct-fki@Nmj8DbV+$K0PtgY@grOH90RV$bKJkaj4fkWOxe~}K@>C7~UR7@6LQF3vScQvr4y+;(Sr= z=+`N#FQpR9aMvgFl97B^6E6<8rmvRrr1^Q8aJ{5v=&gL;3YS+a3C~t<^3cw6`J5Nk zIsFqk{l9-O*rt&zYv-|5Z@0{9=g^!P?&j3G&1@N;lIK@q4H3Ye8Y2Sv*-yqJfxK#R zT?2&Z#rm+WZ2-c=dyr%oQ<7%AiQ`_C>|wPvi*NWv@`aJb3tLYm>BIhr#2BYS-v}CH zOYbtFQBD+~O{%2&a-l=1vFv!(v((G>2Gy%=WuH??j;pU{wxz20My@E^Px(ZQsce8% zhwID{-sT|PUTf{a@F(_-h2F0S;1{!D{LS;jk>4RbXZ&GL{zjj~sedN23~-14m^Zy) z%C3JxJN-x|`^T6~w;9T^L!p{YSwqB=)Ua4s7EWeZ)_^W19No^HT89B2d!QL>g?h{D ze&USrAjJ0Ju~cbo$!d(b%uJ{fXWm$}`5i2+Nc#AD4XI_qJ5fFQXFJKRUl+@UO0&}zzC=v~5~8O_?? zj8ccX!sIG+Uqkl`+ZZOdD1hu72)j_yf8sSt_~+uu^@OO{+2Aam8ed)?%uJtO`ROwr zM?;)}ch|~c(+eGxaehlUQB^+YM3gke=}&4&wO=4LQ2Mi0VIU@zPr~Iw4}%0LOoqj z!N6}4-{8Htj*PFbl+Vph^!cdIY9}Xj4+%Q?uG z91rG~nr{K{x;;Sz_nqB?JnR&Fkvel?)G_PBvecv8(Z@Hp#bkRJ z4|Bs3EV-o!e!2m88tUurbt#j-E{M$mL~b7^i^Ep}b25tqGmCteN2qBSC&s}pL?l!m zj!;IUYr*J|bm@4CvyQUj?$(hf+;?QjZoVHn#82CZq?|ZS>F|S9#T+;2?*RBBLwE0u@ zRth6NtnqQFIJ>sDuRa}ao?>4!2o`FwvQ!(KK6QEt|He}Q%?%!ry}Ao)PI5c-aZJ}( z{zSFh&^EvOS1Fz1u)whSWM^Xb2{&Ku@9dUR!pvXpr*&(g{nMie&(GbeJ(t)A&>3=Z#h2-Z%*htqk`fD(&de~Kl!xq z=|v<6($=Rui=pA>x>{j&-a&TU#A(=e@H7dp2+TEkyP)u1jF{(KbScDkJ#b*=o2C|$gS$(cr z%0A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