From 5bc9211f809e37bc589a7722f591230bda12ebdc Mon Sep 17 00:00:00 2001 From: bd_ <64174065+bdunderscore@users.noreply.github.com> Date: Wed, 30 Nov 2022 12:49:45 -0800 Subject: [PATCH] Add a component to block PhysBone chains (#113) Closes: #111, #104 --- .../Editor/AvatarProcessor.cs | 1 + .../Editor/Inspector/PBBlockerEditor.cs | 40 ++++++++++ .../Editor/Inspector/PBBlockerEditor.cs.meta | 3 + .../Editor/Localization/en.json | 3 +- .../Editor/Localization/ja.json | 3 +- .../Editor/PhysboneBlockerPass.cs | 72 ++++++++++++++++++ .../Editor/PhysboneBlockerPass.cs.meta | 3 + .../Runtime/ModularAvatarPBBlocker.cs | 34 +++++++++ .../Runtime/ModularAvatarPBBlocker.cs.meta | 3 + docs/docs/reference/physbone-blocker.md | 25 ++++++ docs/docs/reference/physbone-blocker.png | Bin 0 -> 18761 bytes .../current/reference/physbone-blocker.md | 24 ++++++ .../current/reference/physbone-blocker.png | Bin 0 -> 20336 bytes 13 files changed, 209 insertions(+), 2 deletions(-) create mode 100644 Packages/nadena.dev.modular-avatar/Editor/Inspector/PBBlockerEditor.cs create mode 100644 Packages/nadena.dev.modular-avatar/Editor/Inspector/PBBlockerEditor.cs.meta create mode 100644 Packages/nadena.dev.modular-avatar/Editor/PhysboneBlockerPass.cs create mode 100644 Packages/nadena.dev.modular-avatar/Editor/PhysboneBlockerPass.cs.meta create mode 100644 Packages/nadena.dev.modular-avatar/Runtime/ModularAvatarPBBlocker.cs create mode 100644 Packages/nadena.dev.modular-avatar/Runtime/ModularAvatarPBBlocker.cs.meta create mode 100644 docs/docs/reference/physbone-blocker.md create mode 100644 docs/docs/reference/physbone-blocker.png create mode 100644 docs/i18n/ja/docusaurus-plugin-content-docs/current/reference/physbone-blocker.md create mode 100644 docs/i18n/ja/docusaurus-plugin-content-docs/current/reference/physbone-blocker.png diff --git a/Packages/nadena.dev.modular-avatar/Editor/AvatarProcessor.cs b/Packages/nadena.dev.modular-avatar/Editor/AvatarProcessor.cs index f701b240..18e10bbf 100644 --- a/Packages/nadena.dev.modular-avatar/Editor/AvatarProcessor.cs +++ b/Packages/nadena.dev.modular-avatar/Editor/AvatarProcessor.cs @@ -145,6 +145,7 @@ namespace nadena.dev.modular_avatar.core.editor new VisibleHeadAccessoryProcessor(avatarGameObject.GetComponent()).Process(); new MergeAnimatorProcessor().OnPreprocessAvatar(avatarGameObject); new BlendshapeSyncAnimationProcessor().OnPreprocessAvatar(avatarGameObject); + PhysboneBlockerPass.Process(avatarGameObject); AfterProcessing?.Invoke(avatarGameObject); } diff --git a/Packages/nadena.dev.modular-avatar/Editor/Inspector/PBBlockerEditor.cs b/Packages/nadena.dev.modular-avatar/Editor/Inspector/PBBlockerEditor.cs new file mode 100644 index 00000000..ca43a9b9 --- /dev/null +++ b/Packages/nadena.dev.modular-avatar/Editor/Inspector/PBBlockerEditor.cs @@ -0,0 +1,40 @@ +/* + * MIT License + * + * Copyright (c) 2022 bd_ + * + * Permission is hereby granted, free of charge, to any person obtaining a copy + * of this software and associated documentation files (the "Software"), to deal + * in the Software without restriction, including without limitation the rights + * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell + * copies of the Software, and to permit persons to whom the Software is + * furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included in all + * copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE + * SOFTWARE. + */ + +using UnityEditor; + +namespace nadena.dev.modular_avatar.core.editor +{ + [CustomEditor(typeof(ModularAvatarPBBlocker))] + [CanEditMultipleObjects] + internal class PBBlockerEditor : MAEditorBase + { + protected override void OnInnerInspectorGUI() + { + EditorGUILayout.HelpBox(Localization.S("pb_blocker.help"), MessageType.Info); + + Localization.ShowLanguageUI(); + } + } +} \ No newline at end of file diff --git a/Packages/nadena.dev.modular-avatar/Editor/Inspector/PBBlockerEditor.cs.meta b/Packages/nadena.dev.modular-avatar/Editor/Inspector/PBBlockerEditor.cs.meta new file mode 100644 index 00000000..e5f41e49 --- /dev/null +++ b/Packages/nadena.dev.modular-avatar/Editor/Inspector/PBBlockerEditor.cs.meta @@ -0,0 +1,3 @@ +fileFormatVersion: 2 +guid: ebb82fd864d647a893f9a5c1dee80703 +timeCreated: 1669750103 \ No newline at end of file diff --git a/Packages/nadena.dev.modular-avatar/Editor/Localization/en.json b/Packages/nadena.dev.modular-avatar/Editor/Localization/en.json index bfc70e52..64ef7078 100644 --- a/Packages/nadena.dev.modular-avatar/Editor/Localization/en.json +++ b/Packages/nadena.dev.modular-avatar/Editor/Localization/en.json @@ -50,5 +50,6 @@ "boneproxy.err.NotInAvatar": "You must specify an object that is in the avatar", "boneproxy.attachment": "Attachment mode", "boneproxy.attachment.AsChildAtRoot": "As child; at root", - "boneproxy.attachment.AsChildKeepWorldPosition": "As child; keep position" + "boneproxy.attachment.AsChildKeepWorldPosition": "As child; keep position", + "pb_blocker.help": "This object will not be affected by PhysBones attached to parents." } \ No newline at end of file diff --git a/Packages/nadena.dev.modular-avatar/Editor/Localization/ja.json b/Packages/nadena.dev.modular-avatar/Editor/Localization/ja.json index 7a5d1088..ffd5693d 100644 --- a/Packages/nadena.dev.modular-avatar/Editor/Localization/ja.json +++ b/Packages/nadena.dev.modular-avatar/Editor/Localization/ja.json @@ -50,5 +50,6 @@ "boneproxy.err.NotInAvatar": "アバター内のオブジェクトを指定してください。", "boneproxy.attachment": "配置モード", "boneproxy.attachment.AsChildAtRoot": "子として・ルートに配置", - "boneproxy.attachment.AsChildKeepWorldPosition": "子として・ワールド位置を維持" + "boneproxy.attachment.AsChildKeepWorldPosition": "子として・ワールド位置を維持", + "pb_blocker.help": "このオブジェクトは親のPhysBoneから影響を受けなくなります。" } \ No newline at end of file diff --git a/Packages/nadena.dev.modular-avatar/Editor/PhysboneBlockerPass.cs b/Packages/nadena.dev.modular-avatar/Editor/PhysboneBlockerPass.cs new file mode 100644 index 00000000..bd152db7 --- /dev/null +++ b/Packages/nadena.dev.modular-avatar/Editor/PhysboneBlockerPass.cs @@ -0,0 +1,72 @@ +/* + * MIT License + * + * Copyright (c) 2022 bd_ + * + * Permission is hereby granted, free of charge, to any person obtaining a copy + * of this software and associated documentation files (the "Software"), to deal + * in the Software without restriction, including without limitation the rights + * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell + * copies of the Software, and to permit persons to whom the Software is + * furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included in all + * copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE + * SOFTWARE. + */ + +using System.Collections.Generic; +using UnityEngine; +using VRC.SDK3.Dynamics.PhysBone.Components; + +namespace nadena.dev.modular_avatar.core.editor +{ + internal class PhysboneBlockerPass + { + public static void Process(GameObject avatarRoot) + { + var blockers = avatarRoot.GetComponentsInChildren(true); + if (blockers.Length == 0) return; + + var physBones = avatarRoot.GetComponentsInChildren(true); + if (physBones.Length == 0) return; + + Dictionary> physBoneRootToIgnores = new Dictionary>(); + + var avatarTransform = avatarRoot.transform; + foreach (var tip in blockers) + { + var node = tip.transform; + // We deliberately skip the node itself to allow for a specific PhysBone to be attached here. + while (node != null && node != avatarTransform && node.parent != null) + { + node = node.parent; + if (!physBoneRootToIgnores.TryGetValue(node, out var parent)) + { + parent = new List(); + physBoneRootToIgnores.Add(node, parent); + } + + parent.Add(tip.transform); + node = node.parent; + } + } + + foreach (var pb in physBones) + { + var root = pb.rootTransform != null ? pb.rootTransform : pb.transform; + if (physBoneRootToIgnores.TryGetValue(root, out var ignores)) + { + pb.ignoreTransforms.AddRange(ignores); + } + } + } + } +} \ No newline at end of file diff --git a/Packages/nadena.dev.modular-avatar/Editor/PhysboneBlockerPass.cs.meta b/Packages/nadena.dev.modular-avatar/Editor/PhysboneBlockerPass.cs.meta new file mode 100644 index 00000000..f9957f76 --- /dev/null +++ b/Packages/nadena.dev.modular-avatar/Editor/PhysboneBlockerPass.cs.meta @@ -0,0 +1,3 @@ +fileFormatVersion: 2 +guid: 375dac2ebd964a6db0f271d0ab93da2f +timeCreated: 1669749518 \ No newline at end of file diff --git a/Packages/nadena.dev.modular-avatar/Runtime/ModularAvatarPBBlocker.cs b/Packages/nadena.dev.modular-avatar/Runtime/ModularAvatarPBBlocker.cs new file mode 100644 index 00000000..964cc3d5 --- /dev/null +++ b/Packages/nadena.dev.modular-avatar/Runtime/ModularAvatarPBBlocker.cs @@ -0,0 +1,34 @@ +/* + * MIT License + * + * Copyright (c) 2022 bd_ + * + * Permission is hereby granted, free of charge, to any person obtaining a copy + * of this software and associated documentation files (the "Software"), to deal + * in the Software without restriction, including without limitation the rights + * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell + * copies of the Software, and to permit persons to whom the Software is + * furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included in all + * copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE + * SOFTWARE. + */ + +using UnityEngine; + +namespace nadena.dev.modular_avatar.core +{ + [DisallowMultipleComponent] + [AddComponentMenu("Modular Avatar/MA PhysBone Blocker")] + public class ModularAvatarPBBlocker : AvatarTagComponent + { + } +} \ No newline at end of file diff --git a/Packages/nadena.dev.modular-avatar/Runtime/ModularAvatarPBBlocker.cs.meta b/Packages/nadena.dev.modular-avatar/Runtime/ModularAvatarPBBlocker.cs.meta new file mode 100644 index 00000000..a8671dd3 --- /dev/null +++ b/Packages/nadena.dev.modular-avatar/Runtime/ModularAvatarPBBlocker.cs.meta @@ -0,0 +1,3 @@ +fileFormatVersion: 2 +guid: a5bf908a199a4648845ebe2fd3b5a4bd +timeCreated: 1669749485 \ No newline at end of file diff --git a/docs/docs/reference/physbone-blocker.md b/docs/docs/reference/physbone-blocker.md new file mode 100644 index 00000000..26e2afa7 --- /dev/null +++ b/docs/docs/reference/physbone-blocker.md @@ -0,0 +1,25 @@ +# PhysBone Blocker + +:::caution + +This component is planned to be added in 1.1.0, and is not available in the 1.0.x series. + +::: + +![PhysBone Blocker](physbone-blocker.png) + +The PhysBone Blocker prevents physbones rooted in parent objects from affecting a child object. +It does this by adding this child object to the Ignore list for any PhysBone affecting a parent object. + +## When should I use it? + +When making accessories that someone might want to attach to a PhysBone chain like a tail or an ear, +you can attach a PhysBone Blocker to prevent the parent PhysBone chain from affecting the child object. + +Note that you can still attach a PhysBone component to the child object that has the PhysBone Blocker on it. + +## Use with Bone Proxies + +When using the [Bone Proxy component](bone-proxy.md) to attach an object to a pre-existing PhysBone chain, +attaching the PhysBone blocker will ensure that your object is rigidly attached to the parent chain. +When doing this, it's best to have the PhysBone Blocker on the same object that has the Bone Proxy. \ No newline at end of file diff --git a/docs/docs/reference/physbone-blocker.png b/docs/docs/reference/physbone-blocker.png new file mode 100644 index 0000000000000000000000000000000000000000..1d3c32d24cf624b89e7a52663d070ed6befaa922 GIT binary patch literal 18761 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

mes`TA zFBbCtXk!)1+5HcW9xoZ);2WdSZ#oQ2cg4OHk+(q3e#T`h%2A0-iRv@2|jC* z9a@=55myUDxrv?pX~W1KXj5lIA8bNBi zFi{?n)QDJL7QG+(0Z4kt-_hmlw|&iEZ)Fulj2nsfTq#*WLop5P(ZPoSo;v?xXa2Fo zkPiij0Dn&b2%Zu>c^51mn;cGz-!*g6{xT8H_5*Aox1C)jD(lnN+=F$cE zfGCRoH2zDJt#@k>5kH08A6sb0*bHKoVxz1UZ_qC zC@Mt2Rfb5aw$4dUxic*jPnyeQ9o`52Be4mAi%@@?p!*OuZb})0vWkd6N zhu1Nj$2}g(#TM!4j+MQ4hYiqfZ(RkZT0(Nq$Ljc3p#g4uTaCn9YN9;y=4hV2o|4CD zZ#=#@+fy27Jm6>>1J_Wcnob&0a?`m?u0O77llKL;Z46X!{jgaI^$F~(|NcG#RYJ`p z4$5_sA3XfG_M3>zzfd1q3T1&h;O>?9i8yxs8|+tXnxrPP`9)+<%wC@#9RF}E4mT|7 zmtTVvVNKIvfa^Gza9NISAC*_flyPkW%HM^*BYS^-?i##3YM5J?&_uE#18aD+UqXW# zuwC0+77-aK;zSPU!}D4UX%g%HJGl#-tSd8q*HQqMkNpC4t0iDr#0R+ljRyJ>)qYo- z=3n2+iG?+FdY6|LJaPfYQGV1WWM`9P@H%(${o@9PhoB2e=z2^!@u|Kg&&6@X|h&)_mKEsf?+1_$EHW6EfX4*KeswHDYc zCpC2Ev*ci&9Pg`<8Ni4T))foQCjqG5@(g~d?s+dQ^2Y-0`-QxkJi4>^F6-=DSY(2r zg*gE_uMYAx4T?01D!yJXdhr5sTY7jNSkro&6?HwG;!MYgiCM%>i`k-g>I9fXZy#Rl z3_@rpHFc)F@WEn}YSHTN2_AZOT+*|&Gu^-mZvB8GOkg6rH?sA-%Zx!7h1jzbs&bCQvKB8~=B{$W)`GE6O^IwG|---b{gF8WYiNQ^exJ)E+b zV+#u@J%GNca93yW<)KEEZmG*Q-v*#)cy~!HB&t)83ISFTnI(ye1I}Jien&^go2`78 z-dluFoUtE}AK2G>?@U6c15V~j6H_GUE<1gm-bF{DNn>McfU=HX0LmV4qG{_F?!u>l z0%0xqn{3z0cDd2M3U#!|(!;@;T}Hc&r=_)emcl}nF=^rX{y$D8~y$hkWb41rYL7p<>u0YH%^zblUtgJ*{aAtbMjC}yKUAQAaFmd6&?hYJ1zdc?|<$p#YVOX>a zNt+ywr*I+h4LrUech+Zz zTq=wQk+Z(u+sWPVFKy|&wB^O=k3#hMHJ|5+Wl zyo;Sg1xxyf{eb~Ccl^~$w3MwbdN2OKyJFKJr&_}vsB~_pB3sgM$^9|D6sVyBqS3IM zXy|Otq}PkBzIm80K9A0NB!?|XbZiIQrY4p_n3(&4$*>?Wc0hKZ z1M~#5rV!@bLFZ&Z!A}8N97lcfd41TgGoL1ZiJU>A`ndO$Ob(X1eJF637%8WJk$wRDF@7J`hu8QR{#`+#iS90 zBI?N$IEv&ckFE~no=n*cb}1OfO64$DgTVjYdqF;!&AiJT%r-UD1v2BZQCea3sh=b>HfE<~?Ewd!oU40O(SZWj$S3<^nu8s1>P zOtN+-_lO`c6en+Pe!ezrzg^JbnO@%H>?NUs(8Rd!dO;1hG7T1qyy?eOnCp_I5Ram9 zQc?{u--iR;hX3~{z%72LY+cm%lB+Drz3MCdFO^7`Es&y$Addi`nH{7$|Q8u z=FQ`JZ=^REQ4KFeqL6jWOWyzX%zLb@dJ9@F=PE{L{RQcfxZc16%$7O2t`P>#h!5L7 z3c6JwHuk9sJklYlYL^5DUYA=g`t2-hPiQi|CvLyj-;(LK!v(iPaXXjQ|LoXfA-N#BD0^G8tn7416fvC$qisPqi79U0=Jm8k_;C0CzB*C^ z)|KSq@!rW)Cy+f`v)Ri^x%ykZ zRmf^VH9iikX{aD#t-vDa7Mc9HHFyIxY z>Y3KfFJz({=PDaF(IXH~f;Jj?V+{R&XNOtEMRt%$ta~0ogHrO}wlW1g*cUm>(If(z z;$v*f4}&80tlvE3`@-*5#mQ%GY0sOd&&&#s&%+uGre2WpS-~9bF}1pEM-4bK1l3ED9!)Aj-6hEBbU7ZTt1l667W$iC_D|rSSm{8x? zzK@5ERND|eU65>wNAICTq#n`CmhjkHZDEvK8u_qyzlaAe#zuA#VUK;V2W>G$ig)?G zIP-qqEAT&e_}3o}dCDdWX~hv+vH~sX zk!h6$K!X|GN-88j%A?L>*<>Y6d+N)|4BzeV=vf72d=OS!?>0%mD6i#|OD_UsMG>cW zFzDi_3bhwc7B&%wLhAQidshd;N+u~tF)TaE^e_qCPpyz$;e&@K5q84{HZjVU+G z_hKOf(UI^Wng}(2xvuiZjR7p|?>sEvcntAsNqf{Pddyg3nffj;Gov{sOR=&l;FW_j z%YO&@|NoRGwIqAu(Rqc1qJlEkc!SfS)eTovi}u#;7zN_~|IDXy{Q*7wfru4wDo~s# z2X=pUeG8#Kg!+pm7GFgX7gE9ZZm;1dyg!(L1*zmq+CO0aA|B@jw5SDx{~`TY-K^!!>1g1+4f5ojbL{ddey)B3)4#^2PF5CO}4JH62Z=8yVQ6gJLX= zA?7`L2AI4Zz$;x0c=V6YCGVR!k+v1f^gJ%Ed~T*Ct^l?>S&op?7O9dyDKnD@F#V?j zsOnwQKB^D2v;}lL!Dp4%$^NaBpFfBA;txRqp60~)a*b3u=nHenOvh2$835jLpSNG{ z)X&QE?i6r9-^U2Px~H=k1>Br0sQ})17fo`>W@AYinM6QMq%|S<=DoJA@ca9p8!od< zhY*3B5F_`|ZAtH4JK&Z8thiiPnwu+>N--=ELqxlu?N#M`ydakf$=v9q0GJCU9G#rh zJdj8QbW>}652o^3Nf)I5pEl0?AIdchTCB%fNMRyl8v9aY`?O8y zAV!E`Oht~J9BWL*k;YgiStdeca72x)g)CFnXwEa|bAC8Kod4i`pXYhs`@XK{{$94W z$y(Osx#5#ZfulPU5K}S__2FQD8HB`IW~Jwm(UmUlS)ybh2*3q3`;Iv}^}tEnjfIcR zjl9u*+>20m(wrGrs2jVRC=OQ!fefS+d7Vk43h@S$@kctoov(p@`EKGn zU`T0R$2sr+HrqQG#EhDPbEYWN9LCIJ*Y8g={SYJtJxUezRn)YJrbiRD;JBOrK+8g~ z{7KmZj(Y6Ko9#*X)rV&1mI9i^X%E7?eaK`YUZQJ#n)l}`}tP$-)F^BFLC(+!upFJ_pm?TOqI?Z(C!Zoc_z&2qBaKmGg|G*8dL6#s>bRv#dht zUyuzz*LEW*N-JTU=`Qs}s^bMonqEXch_qm-%nXB5;jjS}cpAS6Ac^DOv+jH@O7!c? zHK3E`=6M|-8`ZQzKpf7uO7dpy3qMHK`&5$x-ZX|-PS0Sb>U~su@!_`XXgiUoHY9MI z8%|qbZ?z`RkxFWVMzrvrRbaFVR~JxJz2cuAVKw`<00m+SYSp1-1`(qL(c4#f1)J3Y z6IqMtiGD^EY*0mU4{dcS*9JuJZ5cvb_;8Y5q!+QC&Rz9z=w9FH@n}>@3lV{ z9RBG{#!d-NJ6i52^QgM|o?YpvQrbqsbq!9R(Q^9QAm8jI3`}}&&rr27(mq#>hoZkh z8s2lBR)LIL2hYj9!@@Nn_e5uyVuUT=B3~f#c{Z?>_8ln~T`Xqp%)K<|u;^cXlF@at zP0t}{hd1SKua*sB13quR7sdE{czBFnM2K#zq^;lV?VbWX!Gp%-7T2kpSPFo390O9l zSqSnmUgZfMtv#bUyIYGyNbj_)&kOL^fT@$(Bz>{!hLs-Gas8Rr=(_sdngRx19#yxV zbSM&7!rzIqM>~)1X z3kzuB5d+nI5FMGa@?s?vE~~1|$Gql($;?A}bj}Agz&n>2Z%)Kr9t7zK7D38wZ&tw4 zofVNnXuM!YH_`>c(5@0r0lp+Gu~$QCywcbK5b>b_)!r-YVX3RZh>dev z2%a6a5kK1^oN9eupw-3-wj_#++RTTM>vlq$*Dz68{AbLsT4>QX*=hRbmDb1L6I433Ttp}m7!iz8 zvfu)_>I6gglz4F@*{;d-Q&bmL#QFnAf4Frh_P6ApNE+j_)ZTL#^oh#io@~ivm{@w} zn=tBBu{Y~TK#z{JsKiBMljy*dv2JZeEW|m)4nWJMwD+r#_sW{%{Ir@PWbnyJ0 zRO0_SlsRqbOoG$$NEa{Vhwxu&8rYVK!*ApI4*lbSK}V8C457SaAswgpXVKGKK?_0= VA~Q430K^~hojqfJnquKa_!|oZ0>A(O literal 0 HcmV?d00001 diff --git a/docs/i18n/ja/docusaurus-plugin-content-docs/current/reference/physbone-blocker.md b/docs/i18n/ja/docusaurus-plugin-content-docs/current/reference/physbone-blocker.md new file mode 100644 index 00000000..c3a0efe6 --- /dev/null +++ b/docs/i18n/ja/docusaurus-plugin-content-docs/current/reference/physbone-blocker.md @@ -0,0 +1,24 @@ +# PhysBone Blocker + +:::caution 注意 + +このコンポーネントは1.1.0で追加される予定であり、1.0.xでは利用できません。 + +::: + +![PhysBone Blocker](physbone-blocker.png) + +PhysBone Blockerは、子オブジェクトから親オブジェクトをルートとするPhysBoneの影響を防ぎます。 +親オブジェクトを影響するPhysBoneコンポーネントのIgnoreリストに子オブジェクトを追加することにより実装しています。 + +## いつ使うもの? + +PhysBoneによる揺れ物、例えば耳やしっぽにつけるアクセサリーを作るとき、PhysBone Blockerを付けることで +既存の親のPhysBoneの影響を防ぐことができます。 + +なお、PhysBone Blockerを付けた子オブジェクトでも、そのオブジェクトそのものにPhysBoneを付けることが可能です。 + +## Bone Proxiesとの使用 + +[Bone Proxy コンポーネント](bone-proxy.md)を使って、既存のPhysBoneチェーンに装着するとき、 +PhysBone Blockerも付けるとしっかりと親に固定できます。この時はPhysBone BlockerをBone Proxyと同じオブジェクトに付けることを推奨します。 \ No newline at end of file diff --git a/docs/i18n/ja/docusaurus-plugin-content-docs/current/reference/physbone-blocker.png b/docs/i18n/ja/docusaurus-plugin-content-docs/current/reference/physbone-blocker.png new file mode 100644 index 0000000000000000000000000000000000000000..df6f6a20e9f981b77c810d9a892fd95d27daad21 GIT binary patch literal 20336 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