diff --git a/en/.doctrees/environment.pickle b/en/.doctrees/environment.pickle index 501bcaafb..f7359f6e8 100644 Binary files a/en/.doctrees/environment.pickle and b/en/.doctrees/environment.pickle differ diff --git a/en/_static/pygments.css b/en/_static/pygments.css index 3003859f6..4aef807b6 100644 --- a/en/_static/pygments.css +++ b/en/_static/pygments.css @@ -54,6 +54,7 @@ .highlight .nt { color: #204a87; font-weight: bold } /* Name.Tag */ .highlight .nv { color: #000000 } /* Name.Variable */ .highlight .ow { color: #204a87; font-weight: bold } /* Operator.Word */ +.highlight .pm { color: #000000; font-weight: bold } /* Punctuation.Marker */ .highlight .w { color: #f8f8f8 } /* Text.Whitespace */ .highlight .mb { color: #0000cf; font-weight: bold } /* Literal.Number.Bin */ .highlight .mf { color: #0000cf; font-weight: bold } /* Literal.Number.Float */ @@ -87,21 +88,21 @@ body[data-theme="dark"] .highlight td.linenos .special { color: #000000; backgro body[data-theme="dark"] .highlight span.linenos.special { color: #000000; background-color: #ffffc0; padding-left: 5px; padding-right: 5px; } body[data-theme="dark"] .highlight .hll { background-color: #404040 } body[data-theme="dark"] .highlight { background: #202020; color: #d0d0d0 } -body[data-theme="dark"] .highlight .c { color: #999999; font-style: italic } /* Comment */ +body[data-theme="dark"] .highlight .c { color: #ababab; font-style: italic } /* Comment */ body[data-theme="dark"] .highlight .err { color: #a61717; background-color: #e3d2d2 } /* Error */ body[data-theme="dark"] .highlight .esc { color: #d0d0d0 } /* Escape */ body[data-theme="dark"] .highlight .g { color: #d0d0d0 } /* Generic */ -body[data-theme="dark"] .highlight .k { color: #6ab825; font-weight: bold } /* Keyword */ +body[data-theme="dark"] .highlight .k { color: #6ebf26; font-weight: bold } /* Keyword */ body[data-theme="dark"] .highlight .l { color: #d0d0d0 } /* Literal */ body[data-theme="dark"] .highlight .n { color: #d0d0d0 } /* Name */ body[data-theme="dark"] .highlight .o { color: #d0d0d0 } /* Operator */ body[data-theme="dark"] .highlight .x { color: #d0d0d0 } /* Other */ body[data-theme="dark"] .highlight .p { color: #d0d0d0 } /* Punctuation */ -body[data-theme="dark"] .highlight .ch { color: #999999; font-style: italic } /* Comment.Hashbang */ -body[data-theme="dark"] .highlight .cm { color: #999999; font-style: italic } /* Comment.Multiline */ -body[data-theme="dark"] .highlight .cp { color: #cd2828; font-weight: bold } /* Comment.Preproc */ -body[data-theme="dark"] .highlight .cpf { color: #999999; font-style: italic } /* Comment.PreprocFile */ -body[data-theme="dark"] .highlight .c1 { color: #999999; font-style: italic } /* Comment.Single */ +body[data-theme="dark"] .highlight .ch { color: #ababab; font-style: italic } /* Comment.Hashbang */ +body[data-theme="dark"] .highlight .cm { color: #ababab; font-style: italic } /* Comment.Multiline */ +body[data-theme="dark"] .highlight .cp { color: #ff3a3a; font-weight: bold } /* Comment.Preproc */ +body[data-theme="dark"] .highlight .cpf { color: #ababab; font-style: italic } /* Comment.PreprocFile */ +body[data-theme="dark"] .highlight .c1 { color: #ababab; font-style: italic } /* Comment.Single */ body[data-theme="dark"] .highlight .cs { color: #e50808; font-weight: bold; background-color: #520000 } /* Comment.Special */ body[data-theme="dark"] .highlight .gd { color: #d22323 } /* Generic.Deleted */ body[data-theme="dark"] .highlight .ge { color: #d0d0d0; font-style: italic } /* Generic.Emph */ @@ -113,36 +114,37 @@ body[data-theme="dark"] .highlight .gp { color: #aaaaaa } /* Generic.Prompt */ body[data-theme="dark"] .highlight .gs { color: #d0d0d0; font-weight: bold } /* Generic.Strong */ body[data-theme="dark"] .highlight .gu { color: #ffffff; text-decoration: underline } /* Generic.Subheading */ body[data-theme="dark"] .highlight .gt { color: #d22323 } /* Generic.Traceback */ -body[data-theme="dark"] .highlight .kc { color: #6ab825; font-weight: bold } /* Keyword.Constant */ -body[data-theme="dark"] .highlight .kd { color: #6ab825; font-weight: bold } /* Keyword.Declaration */ -body[data-theme="dark"] .highlight .kn { color: #6ab825; font-weight: bold } /* Keyword.Namespace */ -body[data-theme="dark"] .highlight .kp { color: #6ab825 } /* Keyword.Pseudo */ -body[data-theme="dark"] .highlight .kr { color: #6ab825; font-weight: bold } /* Keyword.Reserved */ -body[data-theme="dark"] .highlight .kt { color: #6ab825; font-weight: bold } /* Keyword.Type */ +body[data-theme="dark"] .highlight .kc { color: #6ebf26; font-weight: bold } /* Keyword.Constant */ +body[data-theme="dark"] .highlight .kd { color: #6ebf26; font-weight: bold } /* Keyword.Declaration */ +body[data-theme="dark"] .highlight .kn { color: #6ebf26; font-weight: bold } /* Keyword.Namespace */ +body[data-theme="dark"] .highlight .kp { color: #6ebf26 } /* Keyword.Pseudo */ +body[data-theme="dark"] .highlight .kr { color: #6ebf26; font-weight: bold } /* Keyword.Reserved */ +body[data-theme="dark"] .highlight .kt { color: #6ebf26; font-weight: bold } /* Keyword.Type */ body[data-theme="dark"] .highlight .ld { color: #d0d0d0 } /* Literal.Date */ -body[data-theme="dark"] .highlight .m { color: #3677a9 } /* Literal.Number */ +body[data-theme="dark"] .highlight .m { color: #51b2fd } /* Literal.Number */ body[data-theme="dark"] .highlight .s { color: #ed9d13 } /* Literal.String */ body[data-theme="dark"] .highlight .na { color: #bbbbbb } /* Name.Attribute */ -body[data-theme="dark"] .highlight .nb { color: #24909d } /* Name.Builtin */ -body[data-theme="dark"] .highlight .nc { color: #447fcf; text-decoration: underline } /* Name.Class */ +body[data-theme="dark"] .highlight .nb { color: #2fbccd } /* Name.Builtin */ +body[data-theme="dark"] .highlight .nc { color: #71adff; text-decoration: underline } /* Name.Class */ body[data-theme="dark"] .highlight .no { color: #40ffff } /* Name.Constant */ body[data-theme="dark"] .highlight .nd { color: #ffa500 } /* Name.Decorator */ body[data-theme="dark"] .highlight .ni { color: #d0d0d0 } /* Name.Entity */ body[data-theme="dark"] .highlight .ne { color: #bbbbbb } /* Name.Exception */ -body[data-theme="dark"] .highlight .nf { color: #447fcf } /* Name.Function */ +body[data-theme="dark"] .highlight .nf { color: #71adff } /* Name.Function */ body[data-theme="dark"] .highlight .nl { color: #d0d0d0 } /* Name.Label */ -body[data-theme="dark"] .highlight .nn { color: #447fcf; text-decoration: underline } /* Name.Namespace */ +body[data-theme="dark"] .highlight .nn { color: #71adff; text-decoration: underline } /* Name.Namespace */ body[data-theme="dark"] .highlight .nx { color: #d0d0d0 } /* Name.Other */ body[data-theme="dark"] .highlight .py { color: #d0d0d0 } /* Name.Property */ -body[data-theme="dark"] .highlight .nt { color: #6ab825; font-weight: bold } /* Name.Tag */ +body[data-theme="dark"] .highlight .nt { color: #6ebf26; font-weight: bold } /* Name.Tag */ body[data-theme="dark"] .highlight .nv { color: #40ffff } /* Name.Variable */ -body[data-theme="dark"] .highlight .ow { color: #6ab825; font-weight: bold } /* Operator.Word */ +body[data-theme="dark"] .highlight .ow { color: #6ebf26; font-weight: bold } /* Operator.Word */ +body[data-theme="dark"] .highlight .pm { color: #d0d0d0 } /* Punctuation.Marker */ body[data-theme="dark"] .highlight .w { color: #666666 } /* Text.Whitespace */ -body[data-theme="dark"] .highlight .mb { color: #3677a9 } /* Literal.Number.Bin */ -body[data-theme="dark"] .highlight .mf { color: #3677a9 } /* Literal.Number.Float */ -body[data-theme="dark"] .highlight .mh { color: #3677a9 } /* Literal.Number.Hex */ -body[data-theme="dark"] .highlight .mi { color: #3677a9 } /* Literal.Number.Integer */ -body[data-theme="dark"] .highlight .mo { color: #3677a9 } /* Literal.Number.Oct */ +body[data-theme="dark"] .highlight .mb { color: #51b2fd } /* Literal.Number.Bin */ +body[data-theme="dark"] .highlight .mf { color: #51b2fd } /* Literal.Number.Float */ +body[data-theme="dark"] .highlight .mh { color: #51b2fd } /* Literal.Number.Hex */ +body[data-theme="dark"] .highlight .mi { color: #51b2fd } /* Literal.Number.Integer */ +body[data-theme="dark"] .highlight .mo { color: #51b2fd } /* Literal.Number.Oct */ body[data-theme="dark"] .highlight .sa { color: #ed9d13 } /* Literal.String.Affix */ body[data-theme="dark"] .highlight .sb { color: #ed9d13 } /* Literal.String.Backtick */ body[data-theme="dark"] .highlight .sc { color: #ed9d13 } /* Literal.String.Char */ @@ -156,13 +158,13 @@ body[data-theme="dark"] .highlight .sx { color: #ffa500 } /* Literal.String.Othe body[data-theme="dark"] .highlight .sr { color: #ed9d13 } /* Literal.String.Regex */ body[data-theme="dark"] .highlight .s1 { color: #ed9d13 } /* Literal.String.Single */ body[data-theme="dark"] .highlight .ss { color: #ed9d13 } /* Literal.String.Symbol */ -body[data-theme="dark"] .highlight .bp { color: #24909d } /* Name.Builtin.Pseudo */ -body[data-theme="dark"] .highlight .fm { color: #447fcf } /* Name.Function.Magic */ +body[data-theme="dark"] .highlight .bp { color: #2fbccd } /* Name.Builtin.Pseudo */ +body[data-theme="dark"] .highlight .fm { color: #71adff } /* Name.Function.Magic */ body[data-theme="dark"] .highlight .vc { color: #40ffff } /* Name.Variable.Class */ body[data-theme="dark"] .highlight .vg { color: #40ffff } /* Name.Variable.Global */ body[data-theme="dark"] .highlight .vi { color: #40ffff } /* Name.Variable.Instance */ body[data-theme="dark"] .highlight .vm { color: #40ffff } /* Name.Variable.Magic */ -body[data-theme="dark"] .highlight .il { color: #3677a9 } /* Literal.Number.Integer.Long */ +body[data-theme="dark"] .highlight .il { color: #51b2fd } /* Literal.Number.Integer.Long */ @media (prefers-color-scheme: dark) { body:not([data-theme="light"]) .highlight pre { line-height: 125%; } body:not([data-theme="light"]) .highlight td.linenos .normal { color: #aaaaaa; background-color: transparent; padding-left: 5px; padding-right: 5px; } @@ -171,21 +173,21 @@ body:not([data-theme="light"]) .highlight td.linenos .special { color: #000000; body:not([data-theme="light"]) .highlight span.linenos.special { color: #000000; background-color: #ffffc0; padding-left: 5px; padding-right: 5px; } body:not([data-theme="light"]) .highlight .hll { background-color: #404040 } body:not([data-theme="light"]) .highlight { background: #202020; color: #d0d0d0 } -body:not([data-theme="light"]) .highlight .c { color: #999999; font-style: italic } /* Comment */ +body:not([data-theme="light"]) .highlight .c { color: #ababab; font-style: italic } /* Comment */ body:not([data-theme="light"]) .highlight .err { color: #a61717; background-color: #e3d2d2 } /* Error */ body:not([data-theme="light"]) .highlight .esc { color: #d0d0d0 } /* Escape */ body:not([data-theme="light"]) .highlight .g { color: #d0d0d0 } /* Generic */ -body:not([data-theme="light"]) .highlight .k { color: #6ab825; font-weight: bold } /* Keyword */ +body:not([data-theme="light"]) .highlight .k { color: #6ebf26; font-weight: bold } /* Keyword */ body:not([data-theme="light"]) .highlight .l { color: #d0d0d0 } /* Literal */ body:not([data-theme="light"]) .highlight .n { color: #d0d0d0 } /* Name */ body:not([data-theme="light"]) .highlight .o { color: #d0d0d0 } /* Operator */ body:not([data-theme="light"]) .highlight .x { color: #d0d0d0 } /* Other */ body:not([data-theme="light"]) .highlight .p { color: #d0d0d0 } /* Punctuation */ -body:not([data-theme="light"]) .highlight .ch { color: #999999; font-style: italic } /* Comment.Hashbang */ -body:not([data-theme="light"]) .highlight .cm { color: #999999; font-style: italic } /* Comment.Multiline */ -body:not([data-theme="light"]) .highlight .cp { color: #cd2828; font-weight: bold } /* Comment.Preproc */ -body:not([data-theme="light"]) .highlight .cpf { color: #999999; font-style: italic } /* Comment.PreprocFile */ -body:not([data-theme="light"]) .highlight .c1 { color: #999999; font-style: italic } /* Comment.Single */ +body:not([data-theme="light"]) .highlight .ch { color: #ababab; font-style: italic } /* Comment.Hashbang */ +body:not([data-theme="light"]) .highlight .cm { color: #ababab; font-style: italic } /* Comment.Multiline */ +body:not([data-theme="light"]) .highlight .cp { color: #ff3a3a; font-weight: bold } /* Comment.Preproc */ +body:not([data-theme="light"]) .highlight .cpf { color: #ababab; font-style: italic } /* Comment.PreprocFile */ +body:not([data-theme="light"]) .highlight .c1 { color: #ababab; font-style: italic } /* Comment.Single */ body:not([data-theme="light"]) .highlight .cs { color: #e50808; font-weight: bold; background-color: #520000 } /* Comment.Special */ body:not([data-theme="light"]) .highlight .gd { color: #d22323 } /* Generic.Deleted */ body:not([data-theme="light"]) .highlight .ge { color: #d0d0d0; font-style: italic } /* Generic.Emph */ @@ -197,36 +199,37 @@ body:not([data-theme="light"]) .highlight .gp { color: #aaaaaa } /* Generic.Prom body:not([data-theme="light"]) .highlight .gs { color: #d0d0d0; font-weight: bold } /* Generic.Strong */ body:not([data-theme="light"]) .highlight .gu { color: #ffffff; text-decoration: underline } /* Generic.Subheading */ body:not([data-theme="light"]) .highlight .gt { color: #d22323 } /* Generic.Traceback */ -body:not([data-theme="light"]) .highlight .kc { color: #6ab825; font-weight: bold } /* Keyword.Constant */ -body:not([data-theme="light"]) .highlight .kd { color: #6ab825; font-weight: bold } /* Keyword.Declaration */ -body:not([data-theme="light"]) .highlight .kn { color: #6ab825; font-weight: bold } /* Keyword.Namespace */ -body:not([data-theme="light"]) .highlight .kp { color: #6ab825 } /* Keyword.Pseudo */ -body:not([data-theme="light"]) .highlight .kr { color: #6ab825; font-weight: bold } /* Keyword.Reserved */ -body:not([data-theme="light"]) .highlight .kt { color: #6ab825; font-weight: bold } /* Keyword.Type */ +body:not([data-theme="light"]) .highlight .kc { color: #6ebf26; font-weight: bold } /* Keyword.Constant */ +body:not([data-theme="light"]) .highlight .kd { color: #6ebf26; font-weight: bold } /* Keyword.Declaration */ +body:not([data-theme="light"]) .highlight .kn { color: #6ebf26; font-weight: bold } /* Keyword.Namespace */ +body:not([data-theme="light"]) .highlight .kp { color: #6ebf26 } /* Keyword.Pseudo */ +body:not([data-theme="light"]) .highlight .kr { color: #6ebf26; font-weight: bold } /* Keyword.Reserved */ +body:not([data-theme="light"]) .highlight .kt { color: #6ebf26; font-weight: bold } /* Keyword.Type */ body:not([data-theme="light"]) .highlight .ld { color: #d0d0d0 } /* Literal.Date */ -body:not([data-theme="light"]) .highlight .m { color: #3677a9 } /* Literal.Number */ +body:not([data-theme="light"]) .highlight .m { color: #51b2fd } /* Literal.Number */ body:not([data-theme="light"]) .highlight .s { color: #ed9d13 } /* Literal.String */ body:not([data-theme="light"]) .highlight .na { color: #bbbbbb } /* Name.Attribute */ -body:not([data-theme="light"]) .highlight .nb { color: #24909d } /* Name.Builtin */ -body:not([data-theme="light"]) .highlight .nc { color: #447fcf; text-decoration: underline } /* Name.Class */ +body:not([data-theme="light"]) .highlight .nb { color: #2fbccd } /* Name.Builtin */ +body:not([data-theme="light"]) .highlight .nc { color: #71adff; text-decoration: underline } /* Name.Class */ body:not([data-theme="light"]) .highlight .no { color: #40ffff } /* Name.Constant */ body:not([data-theme="light"]) .highlight .nd { color: #ffa500 } /* Name.Decorator */ body:not([data-theme="light"]) .highlight .ni { color: #d0d0d0 } /* Name.Entity */ body:not([data-theme="light"]) .highlight .ne { color: #bbbbbb } /* Name.Exception */ -body:not([data-theme="light"]) .highlight .nf { color: #447fcf } /* Name.Function */ +body:not([data-theme="light"]) .highlight .nf { color: #71adff } /* Name.Function */ body:not([data-theme="light"]) .highlight .nl { color: #d0d0d0 } /* Name.Label */ -body:not([data-theme="light"]) .highlight .nn { color: #447fcf; text-decoration: underline } /* Name.Namespace */ +body:not([data-theme="light"]) .highlight .nn { color: #71adff; text-decoration: underline } /* Name.Namespace */ body:not([data-theme="light"]) .highlight .nx { color: #d0d0d0 } /* Name.Other */ body:not([data-theme="light"]) .highlight .py { color: #d0d0d0 } /* Name.Property */ -body:not([data-theme="light"]) .highlight .nt { color: #6ab825; font-weight: bold } /* Name.Tag */ +body:not([data-theme="light"]) .highlight .nt { color: #6ebf26; font-weight: bold } /* Name.Tag */ body:not([data-theme="light"]) .highlight .nv { color: #40ffff } /* Name.Variable */ -body:not([data-theme="light"]) .highlight .ow { color: #6ab825; font-weight: bold } /* Operator.Word */ +body:not([data-theme="light"]) .highlight .ow { color: #6ebf26; font-weight: bold } /* Operator.Word */ +body:not([data-theme="light"]) .highlight .pm { color: #d0d0d0 } /* Punctuation.Marker */ body:not([data-theme="light"]) .highlight .w { color: #666666 } /* Text.Whitespace */ -body:not([data-theme="light"]) .highlight .mb { color: #3677a9 } /* Literal.Number.Bin */ -body:not([data-theme="light"]) .highlight .mf { color: #3677a9 } /* Literal.Number.Float */ -body:not([data-theme="light"]) .highlight .mh { color: #3677a9 } /* Literal.Number.Hex */ -body:not([data-theme="light"]) .highlight .mi { color: #3677a9 } /* Literal.Number.Integer */ -body:not([data-theme="light"]) .highlight .mo { color: #3677a9 } /* Literal.Number.Oct */ +body:not([data-theme="light"]) .highlight .mb { color: #51b2fd } /* Literal.Number.Bin */ +body:not([data-theme="light"]) .highlight .mf { color: #51b2fd } /* Literal.Number.Float */ +body:not([data-theme="light"]) .highlight .mh { color: #51b2fd } /* Literal.Number.Hex */ +body:not([data-theme="light"]) .highlight .mi { color: #51b2fd } /* Literal.Number.Integer */ +body:not([data-theme="light"]) .highlight .mo { color: #51b2fd } /* Literal.Number.Oct */ body:not([data-theme="light"]) .highlight .sa { color: #ed9d13 } /* Literal.String.Affix */ body:not([data-theme="light"]) .highlight .sb { color: #ed9d13 } /* Literal.String.Backtick */ body:not([data-theme="light"]) .highlight .sc { color: #ed9d13 } /* Literal.String.Char */ @@ -240,11 +243,11 @@ body:not([data-theme="light"]) .highlight .sx { color: #ffa500 } /* Literal.Stri body:not([data-theme="light"]) .highlight .sr { color: #ed9d13 } /* Literal.String.Regex */ body:not([data-theme="light"]) .highlight .s1 { color: #ed9d13 } /* Literal.String.Single */ body:not([data-theme="light"]) .highlight .ss { color: #ed9d13 } /* Literal.String.Symbol */ -body:not([data-theme="light"]) .highlight .bp { color: #24909d } /* Name.Builtin.Pseudo */ -body:not([data-theme="light"]) .highlight .fm { color: #447fcf } /* Name.Function.Magic */ +body:not([data-theme="light"]) .highlight .bp { color: #2fbccd } /* Name.Builtin.Pseudo */ +body:not([data-theme="light"]) .highlight .fm { color: #71adff } /* Name.Function.Magic */ body:not([data-theme="light"]) .highlight .vc { color: #40ffff } /* Name.Variable.Class */ body:not([data-theme="light"]) .highlight .vg { color: #40ffff } /* Name.Variable.Global */ body:not([data-theme="light"]) .highlight .vi { color: #40ffff } /* Name.Variable.Instance */ body:not([data-theme="light"]) .highlight .vm { color: #40ffff } /* Name.Variable.Magic */ -body:not([data-theme="light"]) .highlight .il { color: #3677a9 } /* Literal.Number.Integer.Long */ +body:not([data-theme="light"]) .highlight .il { color: #51b2fd } /* Literal.Number.Integer.Long */ } \ No newline at end of file diff --git a/en/api/0_106_spring_manual_update.html b/en/api/0_106_spring_manual_update.html index a664bc831..c8eddc7b7 100644 --- a/en/api/0_106_spring_manual_update.html +++ b/en/api/0_106_spring_manual_update.html @@ -349,13 +349,13 @@
Added VRMSpringBone.ManualUpdate
You can call it like this:
-VRMSpringBone spring;
+VRMSpringBone spring;
// setup
-spring.m_updateType = VRMSpringBone.SpringBoneUpdateType.Manual;
+spring.m_updateType = VRMSpringBone.SpringBoneUpdateType.Manual;
// each frame
-spring.ManualUpdate(time.deltaTime);
+spring.ManualUpdate(time.deltaTime);
v0.44 RuntimeImport¶Version 0.44~ LoadAsyncの例¶var bytes = File.ReadAllBytes(path);
+var bytes = File.ReadAllBytes(path);
// なんらかの方法でByte列を得る
-var context = new VRMImporterContext();
+var context = new VRMImporterContext();
-context.ParseGlb(bytes);
+context.ParseGlb(bytes);
// metaが必要な場合
-bool createThumbnail=true;
-var meta = context.ReadMeta(createThumbnail);
-var thumbnail = meta.Thumbnail;
+bool createThumbnail=true;
+var meta = context.ReadMeta(createThumbnail);
+var thumbnail = meta.Thumbnail;
// modelを構築
-context.LoadAsync(_ =>
-{
- context.ShowMeshes();
- var go = context.Root;
+context.LoadAsync(_ =>
+{
+ context.ShowMeshes();
+ var go = context.Root;
// load完了
-},
-Debug.LogError);
+},
+Debug.LogError);
LoadAsyncTaskを使う例¶
-#if (NET_4_6 && UNITY_2017_1_OR_NEWER)
-async static Task<GameObject> LoadAsync(Byte[] bytes)
-{
- var context = new VRMImporterContext();
+#if (NET_4_6 && UNITY_2017_1_OR_NEWER)
+async static Task<GameObject> LoadAsync(Byte[] bytes)
+{
+ var context = new VRMImporterContext();
// GLB形式でJSONを取得しParseします
- context.ParseGlb(bytes);
+ context.ParseGlb(bytes);
- try
- {
+ try
+ {
// ParseしたJSONをシーンオブジェクトに変換していく
- await context.LoadAsyncTask();
+ await context.LoadAsyncTask();
// バウンディングボックスとカメラの位置関係で見切れるのを防止する
// SkinnedMeshRenderer.updateWhenOffscreen = true
- context.EnableUpdateWhenOffscreen();
+ context.EnableUpdateWhenOffscreen();
// T-Poseのモデルを表示したくない場合、ShowMeshesする前に準備する
// ロード後に表示する
- context.ShowMeshes();
+ context.ShowMeshes();
- return context.Root;
- }
- catch(Exception ex)
- {
- Debug.LogError(ex);
+ return context.Root;
+ }
+ catch(Exception ex)
+ {
+ Debug.LogError(ex);
// 関連するリソースを破棄する
- context.Destroy(true);
- throw;
- }
-}
-#endif
+ context.Destroy(true);
+ throw;
+ }
+}
+#endif
@@ -415,89 +415,89 @@
ファイルパスからVRMを開く¶
-var path="sample.vrm";
-var go=VRM.VRMImporter.LoadFromPath(path);
-Debug.LogFormat("loaded {0}", go.name);
+var path="sample.vrm";
+var go=VRM.VRMImporter.LoadFromPath(path);
+Debug.LogFormat("loaded {0}", go.name);
ファイルパスから非同期にVRMを開く¶
-var path="sample.vrm";
-VRMImporter.LoadVrmAsync(path, go => {
- Debug.LogFormat("loaded {0}", go.name);
-});
+var path="sample.vrm";
+VRMImporter.LoadVrmAsync(path, go => {
+ Debug.LogFormat("loaded {0}", go.name);
+});
バイト列からVRM開く¶
-var path="sample.vrm";
-var bytes = File.ReadAllBytes(path);
-var go=VRMImporter.LoadFromBytes(bytes);
+var path="sample.vrm";
+var bytes = File.ReadAllBytes(path);
+var go=VRMImporter.LoadFromBytes(bytes);
バイト列から非同期にVRMを開く¶
-VRMImporter.LoadVrmAsync(bytes, go => {
- Debug.LogFormat("loaded {0}", go.name);
-});
+VRMImporter.LoadVrmAsync(bytes, go => {
+ Debug.LogFormat("loaded {0}", go.name);
+});
VRMから情報を取り出す¶
-#if UNITY_STANDALONE_WIN
- var path = FileDialogForWindows.FileDialog("open VRM", ".vrm");
-#else
- var path = Application.dataPath + "/default.vrm";
-#endif
- if (string.IsNullOrEmpty(path))
- {
- return;
- }
+#if UNITY_STANDALONE_WIN
+ var path = FileDialogForWindows.FileDialog("open VRM", ".vrm");
+#else
+ var path = Application.dataPath + "/default.vrm";
+#endif
+ if (string.IsNullOrEmpty(path))
+ {
+ return;
+ }
// Byte列を得る
- var bytes = File.ReadAllBytes(path);
+ var bytes = File.ReadAllBytes(path);
- var context = new VRMImporterContext();
+ var context = new VRMImporterContext();
// GLB形式をParseしてチャンクからJSONを取得しParseします
- context.ParseGlb(bytes);
+ context.ParseGlb(bytes);
// metaを取得
- var meta = context.ReadMeta();
- Debug.LogFormat("meta: title:{0}", meta.Title);
+ var meta = context.ReadMeta();
+ Debug.LogFormat("meta: title:{0}", meta.Title);
// もしくはこちらでパースされたGLTF全体にアクセスできます
- var vrm = context.GLTF;
+ var vrm = context.GLTF;
// ParseしたJSONをもとにシーンを構築します
- if (m_loadAsync)
- {
+ if (m_loadAsync)
+ {
// 非同期に実行する
- var now = Time.time;
- VRMImporter.LoadVrmAsync(context, go=> {
- var delta = Time.time - now;
- Debug.LogFormat("LoadVrmAsync {0:0.0} seconds", delta);
- OnLoaded(go);
- });
- }
- else
- {
+ var now = Time.time;
+ VRMImporter.LoadVrmAsync(context, go=> {
+ var delta = Time.time - now;
+ Debug.LogFormat("LoadVrmAsync {0:0.0} seconds", delta);
+ OnLoaded(go);
+ });
+ }
+ else
+ {
// 同期的に実行する
- VRMImporter.LoadFromBytes(context);
- OnLoaded(context.Root);
- }
+ VRMImporter.LoadFromBytes(context);
+ OnLoaded(context.Root);
+ }
Thumbnailを取得する(v0.37から)¶
ReadMetaに引数を渡すことでThumbnailテクスチャを作成できます。
- var meta = context.ReadMeta(true); // Thumbnailテクスチャを作成する
- Texture2D thumbnail=meta.Thumbnail;
+ var meta = context.ReadMeta(true); // Thumbnailテクスチャを作成する
+ Texture2D thumbnail=meta.Thumbnail;
diff --git a/en/api/0_58_blendshape.html b/en/api/0_58_blendshape.html
index 69026dd5c..db9f461a3 100644
--- a/en/api/0_58_blendshape.html
+++ b/en/api/0_58_blendshape.html
@@ -394,14 +394,14 @@
スクリプトから BlendShape weight を適用する¶
SetValues 関数のみを使用します。
そのフレームで必要な表情の weight 値をすべて集めてから SetValues を 1 回だけ呼んで設定します。
-var proxy = GetComponent<VRMBlendShapeProxy>();
+var proxy = GetComponent<VRMBlendShapeProxy>();
-proxy.SetValues(new Dictionary<BlendShapeKey, float>
-{
+proxy.SetValues(new Dictionary<BlendShapeKey, float>
+{
{BlendShapeKey.CreateFromPreset(BlendShapePreset.A), 1f}, // [0, 1] の範囲で Weight を指定
{BlendShapeKey.CreateFromPreset(BlendShapePreset.Joy), 1f}, // システム定義の表情は enum で指定
{BlendShapeKey.CreateUnknown("USER_DEFINED_FACIAL"), 1f}, // ユーザ定義の表情は string で指定
-});
+});
@@ -421,24 +421,24 @@
で定義されているとします。
このとき両目を閉じたいモチベーションから、両方を有効にする意図で下記のように実行します。
-proxy.ImmediatelySetValue(BlendShapeKey.CreateFromPreset(BlendShapePreset.Blink_L), 1.0f);
-proxy.ImmediatelySetValue(BlendShapeKey.CreateFromPreset(BlendShapePreset.Blink_R), 1.0f);
+proxy.ImmediatelySetValue(BlendShapeKey.CreateFromPreset(BlendShapePreset.Blink_L), 1.0f);
+proxy.ImmediatelySetValue(BlendShapeKey.CreateFromPreset(BlendShapePreset.Blink_R), 1.0f);
すると、左目だけが開いてしまいます。
これは後から ImmediateSetValue した Blink_R が Blink_L と競合して weight を上書きしてしまうからです。
したがって VRM の表情制御においては下記の 2 通りのどちらかの方法で書くことが求められます。
これらの方法はこの競合の問題を解決して表情を設定することができます。
-proxy.SetValues(new Dictionary<BlendShapeKey, float>
-{
- {BlendShapeKey.CreateFromPreset(BlendShapePreset.Blink_L), 1.0f},
- {BlendShapeKey.CreateFromPreset(BlendShapePreset.Blink_R), 1.0f},
-});
+proxy.SetValues(new Dictionary<BlendShapeKey, float>
+{
+ {BlendShapeKey.CreateFromPreset(BlendShapePreset.Blink_L), 1.0f},
+ {BlendShapeKey.CreateFromPreset(BlendShapePreset.Blink_R), 1.0f},
+});
または
proxy.AccumulateValue(BlendShapeKey.CreateFromPreset(BlendShapePreset.Blink_L), 1.0f); // すぐに適用せずにたくわえる
-proxy.AccumulateValue(BlendShapeKey.CreateFromPreset(BlendShapePreset.Blink_R), 1.0f);
+proxy.AccumulateValue(BlendShapeKey.CreateFromPreset(BlendShapePreset.Blink_R), 1.0f);
proxy.Apply(); // 蓄積した値をまとめて適用する
@@ -462,19 +462,19 @@ BlendShape同士が競合することがわかりました。
ImmediatelySetValue¶
簡単なテストプログラムでの利用を想定しています。
例:
-var proxy = GetComponent<VRMBlendShapeProxy>();
+var proxy = GetComponent<VRMBlendShapeProxy>();
-proxy.ImmediatelySetValue(BlendShapeKey.CreateFromPreset(BlendShapePreset.A), 1.0f);
+proxy.ImmediatelySetValue(BlendShapeKey.CreateFromPreset(BlendShapePreset.A), 1.0f);
AccumulateValue + Apply¶
例:
-var proxy = GetComponent<VRMBlendShapeProxy>();
+var proxy = GetComponent<VRMBlendShapeProxy>();
proxy.AccumulateValue(BlendShapeKey.CreateFromPreset(BlendShapePreset.Blink_L), 1.0f); // すぐに適用せずにたくわえる
-proxy.AccumulateValue(BlendShapeKey.CreateFromPreset(BlendShapePreset.Blink_R), 1.0f);
+proxy.AccumulateValue(BlendShapeKey.CreateFromPreset(BlendShapePreset.Blink_R), 1.0f);
proxy.Apply(); // 蓄積した値をまとめて適用する
@@ -484,13 +484,13 @@ BlendShape同士が競合することがわかりました。
SetValues¶
BlendShape合成器が必要に応じ呼び出すことを想定しています。
例:
-var proxy = GetComponent<VRMBlendShapeProxy>();
+var proxy = GetComponent<VRMBlendShapeProxy>();
-proxy.SetValues(new Dictionary<BlendShapeKey, float>
-{
- {BlendShapeKey.CreateFromPreset(BlendShapePreset.Blink_L), 1.0f},
- {BlendShapeKey.CreateFromPreset(BlendShapePreset.Blink_R), 1.0f},
-});
+proxy.SetValues(new Dictionary<BlendShapeKey, float>
+{
+ {BlendShapeKey.CreateFromPreset(BlendShapePreset.Blink_L), 1.0f},
+ {BlendShapeKey.CreateFromPreset(BlendShapePreset.Blink_R), 1.0f},
+});
diff --git a/en/api/0_68_runtime_import.html b/en/api/0_68_runtime_import.html
index d144323fe..e64945444 100644
--- a/en/api/0_68_runtime_import.html
+++ b/en/api/0_68_runtime_import.html
@@ -373,146 +373,146 @@
サンプルコード(同期的ロード)¶
-using UniGLTF;
-using UnityEngine;
-using VRM;
+using UniGLTF;
+using UnityEngine;
+using VRM;
-namespace YourNameSpace
-{
- public sealed class LoadVrmSample : MonoBehaviour
- {
- [SerializeField] private string _vrmFilePath;
- private GameObject _vrmGameObject;
+namespace YourNameSpace
+{
+ public sealed class LoadVrmSample : MonoBehaviour
+ {
+ [SerializeField] private string _vrmFilePath;
+ private GameObject _vrmGameObject;
- private void Start()
- {
- _vrmGameObject = LoadVrm(_vrmFilePath);
- }
+ private void Start()
+ {
+ _vrmGameObject = LoadVrm(_vrmFilePath);
+ }
- private void OnDestroy()
- {
- DestroyVrm(_vrmGameObject);
- }
+ private void OnDestroy()
+ {
+ DestroyVrm(_vrmGameObject);
+ }
- private GameObject LoadVrm(string vrmFilePath)
- {
+ private GameObject LoadVrm(string vrmFilePath)
+ {
// 1. GltfParser を呼び出します。
// GltfParser はファイルから JSON 情報とバイナリデータを読み出します。
- var parser = new GltfParser();
- parser.ParsePath(vrmFilePath);
+ var parser = new GltfParser();
+ parser.ParsePath(vrmFilePath);
// 2. GltfParser のインスタンスを引数にして VRMImporterContext を作成します。
// VRMImporterContext は VRM のロードを実際に行うクラスです。
- using (var context = new VRMImporterContext(parser))
- {
+ using (var context = new VRMImporterContext(parser))
+ {
// 3. Load 関数を呼び出し、VRM の GameObject を生成します。
- context.Load();
+ context.Load();
// 4. (任意) SkinnedMeshRenderer の UpdateWhenOffscreen を有効にできる便利関数です。
// https://docs.unity3d.com/2019.4/Documentation/ScriptReference/SkinnedMeshRenderer-updateWhenOffscreen.html
- context.EnableUpdateWhenOffscreen();
+ context.EnableUpdateWhenOffscreen();
// 5. VRM モデルを表示します。
- context.ShowMeshes();
+ context.ShowMeshes();
// 6. VRM の GameObject が実際に使用している UnityEngine.Object リソースの寿命を VRM の GameObject に紐付けます。
// つまり VRM の GameObject の破棄時に、実際に使用しているリソース (Texture, Material, Mesh, etc) をまとめて破棄することができます。
- context.DisposeOnGameObjectDestroyed();
+ context.DisposeOnGameObjectDestroyed();
// 7. Root の GameObject を return します。
// Root の GameObject とは VRMMeta コンポーネントが付与されている GameObject のことです。
- return context.Root;
- }
+ return context.Root;
+ }
// 8. using スコープを抜けて context が破棄されると、 VRMImporterContext が保持する UnityEngine.Object リソースが破棄されます。
// このとき破棄されるリソースは、 glTF ファイルには含まれているが VRM の GameObject には割り当てられていないテクスチャなどです。
// 手順 6. で VRM の GameObject に紐付けたリソースは、ここでは破棄されません。
- }
+ }
- private void DestroyVrm(GameObject vrmGameObject)
- {
+ private void DestroyVrm(GameObject vrmGameObject)
+ {
// 9. 生成された VRM の GameObject を破棄します。
// GameObject を破棄すれば、紐づくリソース (Texture, Material, Mesh, etc) も破棄されます。
- UnityEngine.Object.Destroy(vrmGameObject);
- }
- }
-}
+ UnityEngine.Object.Destroy(vrmGameObject);
+ }
+ }
+}
サンプルコード(非同期ロード)¶
-using System.IO;
-using System.Threading.Tasks;
-using UniGLTF;
-using UnityEngine;
-using VRM;
+using System.IO;
+using System.Threading.Tasks;
+using UniGLTF;
+using UnityEngine;
+using VRM;
-namespace YourNameSpace
-{
- public sealed class LoadVrmAsyncSample : MonoBehaviour
- {
- [SerializeField] private string _vrmFilePath;
- private GameObject _vrmGameObject;
+namespace YourNameSpace
+{
+ public sealed class LoadVrmAsyncSample : MonoBehaviour
+ {
+ [SerializeField] private string _vrmFilePath;
+ private GameObject _vrmGameObject;
- private async void Start()
- {
+ private async void Start()
+ {
// 簡便のため、このサンプルではキャンセル処理などは考慮しません。
- _vrmGameObject = await LoadVrmAsync(_vrmFilePath);
- }
+ _vrmGameObject = await LoadVrmAsync(_vrmFilePath);
+ }
- private void OnDestroy()
- {
- DestroyVrm(_vrmGameObject);
- }
+ private void OnDestroy()
+ {
+ DestroyVrm(_vrmGameObject);
+ }
- private async Task<GameObject> LoadVrmAsync(string vrmFilePath)
- {
+ private async Task<GameObject> LoadVrmAsync(string vrmFilePath)
+ {
// 1. GltfParser を呼び出します。
// GltfParser はファイルから JSON 情報とバイナリデータを読み出します。
// GltfParser は Unity のメインスレッド以外で実行できます。
- var parser = new GltfParser();
- await Task.Run(() =>
- {
- var file = File.ReadAllBytes(vrmFilePath);
- parser.ParseGlb(file);
- });
+ var parser = new GltfParser();
+ await Task.Run(() =>
+ {
+ var file = File.ReadAllBytes(vrmFilePath);
+ parser.ParseGlb(file);
+ });
// 2. GltfParser のインスタンスを引数にして VRMImporterContext を作成します。
// VRMImporterContext は VRM のロードを実際に行うクラスです。
- using (var context = new VRMImporterContext(parser))
- {
+ using (var context = new VRMImporterContext(parser))
+ {
// 3. Load 関数を呼び出し、VRM の GameObject を生成します。
// Load 処理は数フレームの時間を要します。
- await context.LoadAsync();
+ await context.LoadAsync();
// 4. (任意) SkinnedMeshRenderer の UpdateWhenOffscreen を有効にできる便利関数です。
// https://docs.unity3d.com/2019.4/Documentation/ScriptReference/SkinnedMeshRenderer-updateWhenOffscreen.html
- context.EnableUpdateWhenOffscreen();
+ context.EnableUpdateWhenOffscreen();
// 5. VRM モデルを表示します。
- context.ShowMeshes();
+ context.ShowMeshes();
// 6. VRM の GameObject が実際に使用している UnityEngine.Object リソースの寿命を VRM の GameObject に紐付けます。
// つまり VRM の GameObject の破棄時に、実際に使用しているリソース (Texture, Material, Mesh, etc) をまとめて破棄することができます。
- context.DisposeOnGameObjectDestroyed();
+ context.DisposeOnGameObjectDestroyed();
// 7. Root の GameObject を return します。
// Root の GameObject とは VRMMeta コンポーネントが付与されている GameObject のことです。
- return context.Root;
- }
+ return context.Root;
+ }
// 8. using スコープを抜けて context が破棄されると、 VRMImporterContext が保持する UnityEngine.Object リソースが破棄されます。
// このとき破棄されるリソースは、 glTF ファイルには含まれているが VRM の GameObject には割り当てられていないテクスチャなどです。
// 手順 6. で VRM の GameObject に紐付けたリソースは、ここでは破棄されません。
- }
+ }
- private void DestroyVrm(GameObject vrmGameObject)
- {
+ private void DestroyVrm(GameObject vrmGameObject)
+ {
// 9. 生成された VRM の GameObject を破棄します。
// GameObject を破棄すれば、紐づくリソース (Texture, Material, Mesh, etc) も破棄されます。
- UnityEngine.Object.Destroy(vrmGameObject);
- }
- }
-}
+ UnityEngine.Object.Destroy(vrmGameObject);
+ }
+ }
+}
diff --git a/en/api/0_76_texture_deserializer.html b/en/api/0_76_texture_deserializer.html
index 262c2941f..33d66882b 100644
--- a/en/api/0_76_texture_deserializer.html
+++ b/en/api/0_76_texture_deserializer.html
@@ -370,30 +370,30 @@
Replacement method¶
new UniGLTF.ImporterContext Arguments can be specified.
- public ImporterContext(
- GltfData data,
- IReadOnlyDictionary<SubAssetKey, UnityEngine.Object> externalObjectMap = null,
- ITextureDeserializer textureDeserializer = null, // 👈
- IMaterialDescriptorGenerator materialGenerator = null)
+ public ImporterContext(
+ GltfData data,
+ IReadOnlyDictionary<SubAssetKey, UnityEngine.Object> externalObjectMap = null,
+ ITextureDeserializer textureDeserializer = null, // 👈
+ IMaterialDescriptorGenerator materialGenerator = null)
new VRM.VRMImporterContext Arguments can be specified.
- public VRMImporterContext(
- VRMData data,
- IReadOnlyDictionary<SubAssetKey, Object> externalObjectMap = null,
- ITextureDeserializer textureDeserializer = null, // 👈
- IMaterialDescriptorGenerator materialGenerator = null,
- bool loadAnimation = false)
+ public VRMImporterContext(
+ VRMData data,
+ IReadOnlyDictionary<SubAssetKey, Object> externalObjectMap = null,
+ ITextureDeserializer textureDeserializer = null, // 👈
+ IMaterialDescriptorGenerator materialGenerator = null,
+ bool loadAnimation = false)
new UniVRM10.Vrm10Importer Arguments can be specified.
- public Vrm10Importer(
- Vrm10Data vrm,
- IReadOnlyDictionary<SubAssetKey, UnityEngine.Object> externalObjectMap = null,
- ITextureDeserializer textureDeserializer = null, // 👈
- IMaterialDescriptorGenerator materialGenerator = null,
- bool useControlRig = false
- )
+ public Vrm10Importer(
+ Vrm10Data vrm,
+ IReadOnlyDictionary<SubAssetKey, UnityEngine.Object> externalObjectMap = null,
+ ITextureDeserializer textureDeserializer = null, // 👈
+ IMaterialDescriptorGenerator materialGenerator = null,
+ bool useControlRig = false
+ )
diff --git a/en/api/0_77_runtime_import.html b/en/api/0_77_runtime_import.html
index 409c126f3..848fd7654 100644
--- a/en/api/0_77_runtime_import.html
+++ b/en/api/0_77_runtime_import.html
@@ -355,40 +355,40 @@
を引き継ぎます。
Load の呼び出し後の任意のタイミングで ImporterContext.Dispose で Importer を破棄してください。
任意のタイミングで RuntimeGltfInstance を Destory することで紐づくリソース (Texture, Material, Mesh, etc) も破棄されます。
-using UniGLTF;
-using UnityEngine;
+using UniGLTF;
+using UnityEngine;
-namespace VRM.Samples
-{
- public sealed class LoadVrmSample : MonoBehaviour
- {
- [SerializeField] private string _vrmFilePath;
- private GameObject _vrmGameObject;
+namespace VRM.Samples
+{
+ public sealed class LoadVrmSample : MonoBehaviour
+ {
+ [SerializeField] private string _vrmFilePath;
+ private GameObject _vrmGameObject;
- private void Start()
- {
- _vrmGameObject = LoadVrm(_vrmFilePath);
- }
+ private void Start()
+ {
+ _vrmGameObject = LoadVrm(_vrmFilePath);
+ }
- private void OnDestroy()
- {
- DestroyVrm(_vrmGameObject);
- }
+ private void OnDestroy()
+ {
+ DestroyVrm(_vrmGameObject);
+ }
- private GameObject LoadVrm(string vrmFilePath)
- {
+ private GameObject LoadVrm(string vrmFilePath)
+ {
// 1. GltfParser を呼び出します。
// GltfParser はファイルから JSON 情報とバイナリデータを読み出します。
- var parser = new GltfParser();
- parser.ParsePath(vrmFilePath);
+ var parser = new GltfParser();
+ parser.ParsePath(vrmFilePath);
// 2. GltfParser のインスタンスを引数にして VRMImporterContext を作成します。
// VRMImporterContext は VRM のロードを実際に行うクラスです。
- using (var context = new VRMImporterContext(parser))
- {
+ using (var context = new VRMImporterContext(parser))
+ {
// 3. Load 関数を呼び出し、VRM の GameObject を生成します。
- RuntimeGltfInstance instance = context.Load(); // <- `v0.77` でここが変わります。
+ RuntimeGltfInstance instance = context.Load(); // <- `v0.77` でここが変わります。
// 非同期版 async 関数の中で下記のようにしてください
// RuntimeGltfInstance instance = await context.LoadAsync();
@@ -403,20 +403,20 @@ Load の呼び出し後の任意のタイミングで ImporterContext.Dispose
// 6. Root の GameObject を return します。
// Root の GameObject とは VRMMeta コンポーネントが付与されている GameObject のことです。
return instance.Root; // <- ImporterContext から RuntimeGltfInstance に移動しました。
- }
+ }
// 7. using スコープを抜けて context が破棄されると、 VRMImporterContext が保持する UnityEngine.Object リソースが破棄されます。
// このとき破棄されるリソースは、 glTF ファイルには含まれているが VRM の GameObject には割り当てられていないテクスチャなどです。
// 手順 6. で VRM の GameObject に紐付けたリソースは、ここでは破棄されません。
- }
+ }
- private void DestroyVrm(GameObject vrmGameObject)
- {
+ private void DestroyVrm(GameObject vrmGameObject)
+ {
// 8. 生成された VRM の GameObject を破棄します。
// GameObject を破棄すれば、紐づくリソース (Texture, Material, Mesh, etc) も破棄されます。
- UnityEngine.Object.Destroy(vrmGameObject);
- }
- }
-}
+ UnityEngine.Object.Destroy(vrmGameObject);
+ }
+ }
+}
diff --git a/en/api/0_79_runtime_import.html b/en/api/0_79_runtime_import.html
index be90ee7ca..79f3a090e 100644
--- a/en/api/0_79_runtime_import.html
+++ b/en/api/0_79_runtime_import.html
@@ -343,11 +343,11 @@
v0.79 RuntimeImport GltfData¶
GltfParser と GltfData の分割
-var parser = new GltfParser();
-parser.ParsePath(path);
+var parser = new GltfParser();
+parser.ParsePath(path);
-GltfData data = new GlbFileParser(path).Parse();
+GltfData data = new GlbFileParser(path).Parse();
diff --git a/en/api/0_82_glb_import.html b/en/api/0_82_glb_import.html
index d40cc10d2..1922816cc 100644
--- a/en/api/0_82_glb_import.html
+++ b/en/api/0_82_glb_import.html
@@ -355,10 +355,10 @@
vrm also uses this function.
-GltfData Load(string path)
-{
- return new GlbFileParser(path).Parse();
-}
+GltfData Load(string path)
+{
+ return new GlbFileParser(path).Parse();
+}
@@ -367,40 +367,40 @@
vrm also uses this function.
-GltfData Load(byte[] bytes)
-{
- return new GlbBinaryParser(bytes, "LOAD_NAME").parse();
-}
+GltfData Load(byte[] bytes)
+{
+ return new GlbBinaryParser(bytes, "LOAD_NAME").parse();
+}
Parse from gltf file path¶
-GltfData Load(string path)
-{
- return new GltfFileWithResourceFilesParser(path).Parse();
-}
+GltfData Load(string path)
+{
+ return new GltfFileWithResourceFilesParser(path).Parse();
+}
Parse from zip archive¶
Can parse zip archives of gltf and related files (experimental).
-GltfData Load(string path)
-{
- return new ZipArchivedGltfFileParser(path).Parse();
-}
+GltfData Load(string path)
+{
+ return new ZipArchivedGltfFileParser(path).Parse();
+}
Parse by file path extension¶
Please refer to the sample SimpleViewer.
-GltfData Load(string path)
-{
+GltfData Load(string path)
+{
// ファイル拡張子で自動判定します
- return new AutoGltfFileParser(path).Parse();
-}
+ return new AutoGltfFileParser(path).Parse();
+}
@@ -409,31 +409,31 @@
2. ロードする¶
sync¶
-RuntimeGltfInstance Load(GltfData data)
-{
+RuntimeGltfInstance Load(GltfData data)
+{
// ImporterContext は使用後に Dispose を呼び出してください。
// using で自動的に呼び出すことができます。
- using(var loader = new UniGLTF.ImporterContext(data)
- {
- var instance = loader.Load();
- return instance;
- }
-}
+ using(var loader = new UniGLTF.ImporterContext(data)
+ {
+ var instance = loader.Load();
+ return instance;
+ }
+}
async¶
-async RuntimeGltfInstance Load(GltfData data)
-{
+async RuntimeGltfInstance Load(GltfData data)
+{
// ImporterContext は使用後に Dispose を呼び出してください。
// using で自動的に呼び出すことができます。
- using(var loader = new UniGLTF.ImporterContext(data)
- {
- var instance = await loader.LoadAsync();
- return instance;
- }
-}
+ using(var loader = new UniGLTF.ImporterContext(data)
+ {
+ var instance = await loader.LoadAsync();
+ return instance;
+ }
+}
@@ -445,13 +445,13 @@
3. インスタンスを使用する¶
// SkinnedMeshRenderer に対する指示
-instance.EnableUpdateWhenOffscreen();
+instance.EnableUpdateWhenOffscreen();
// 準備ができたら表示する(デフォルトでは非表示)
-instance.ShowMeshes();
+instance.ShowMeshes();
Discard after use as follows. Associated Assets (Textures, Materials, Meshes, etc.) are also destroyed.
-GameObject.Destroy(instance);
+GameObject.Destroy(instance);
diff --git a/en/api/0_82_runtime_import.html b/en/api/0_82_runtime_import.html
index 76679c7ca..71818a76a 100644
--- a/en/api/0_82_runtime_import.html
+++ b/en/api/0_82_runtime_import.html
@@ -352,46 +352,46 @@
サンプルの Assets\VRM\Samples\SimpleViewer\ViewerUI.cs も参照してください。
1. GltfData を得る¶
-GltfData Load(string path)
-{
- return new GlbFileParser(path).Parse();
-}
+GltfData Load(string path)
+{
+ return new GlbFileParser(path).Parse();
+}
GLB import も参照してください。
2. VRMData を得る¶
-VRMData vrm = new VRMData(data);
+VRMData vrm = new VRMData(data);
3. Load する¶
-async RuntimeGltfInstance Load(VRMData vrm)
-{
+async RuntimeGltfInstance Load(VRMData vrm)
+{
// 使用後に Dispose で VRMImporterContext を破棄してください。
- using(var loader = new VRMImporterContext(vrm))
- {
- var instance = await loader.LoadAsync();
- return instance;
- }
-}
+ using(var loader = new VRMImporterContext(vrm))
+ {
+ var instance = await loader.LoadAsync();
+ return instance;
+ }
+}
URP 向けに materialGenerator を指定する(実験)¶
materialGenerator 引き数(省略可能)を指定することで URP マテリアルを生成するようにカスタムできます。
指定しない場合は built-in 向けのデフォルトが使用されます。
-async RuntimeGltfInstance Load(VRMData vrm)
-{
- var materialGenerator = new VRMUrpMaterialDescriptorGenerator(vrm.VrmExtension);
- using(var loader = new VRM.VRMImporterContext(vrm, materialGenerator: materialGenerator))
- {
- var instance = await loader.LoadAsync();
- return instance;
- }
-}
+async RuntimeGltfInstance Load(VRMData vrm)
+{
+ var materialGenerator = new VRMUrpMaterialDescriptorGenerator(vrm.VrmExtension);
+ using(var loader = new VRM.VRMImporterContext(vrm, materialGenerator: materialGenerator))
+ {
+ var instance = await loader.LoadAsync();
+ return instance;
+ }
+}
@@ -402,16 +402,16 @@
4. Instance¶
// SkinnedMeshRenderer に対する指示
-instance.EnableUpdateWhenOffscreen();
+instance.EnableUpdateWhenOffscreen();
// 準備ができたら表示する(デフォルトでは非表示)
-instance.ShowMeshes();
+instance.ShowMeshes();
使用後に以下のように破棄してください。関連する Asset(Texture, Material, Meshなど)も破棄されます。
// GameObject.Destroy(instance);
// RuntimeGltfInstance ではなくて、その GameObject を Destroy します。
-GameObject.Destroy(instance.gameObject);
+GameObject.Destroy(instance.gameObject);
diff --git a/en/api/0_87_runtime_import.html b/en/api/0_87_runtime_import.html
index b7fccee6f..16ab991de 100644
--- a/en/api/0_87_runtime_import.html
+++ b/en/api/0_87_runtime_import.html
@@ -344,35 +344,35 @@
v0.87 RuntimeImport 非同期ロード¶
awaitCaller 引き数¶
-public virtual async Task<RuntimeGltfInstance> LoadAsync(IAwaitCaller awaitCaller = null, ...)
+public virtual async Task<RuntimeGltfInstance> LoadAsync(IAwaitCaller awaitCaller = null, ...)
awaitCaller によりロード時の挙動をカスタマイズできます。
- 1using System;
- 2using System.Threading.Tasks;
+ 1using System;
+ 2using System.Threading.Tasks;
3
- 4namespace VRMShaders
- 5{
+ 4namespace VRMShaders
+ 5{
6 /// <summary>
7 /// ImporterContext の 非同期実行 LoadAsync を補助する。
8 /// この関数を経由して await すること。
9 /// そうしないと、同期実行 Load 時にデッドロックに陥るかもしれない。
10 /// (SynchronizationContext に Post された 継続が再開されない)
11 /// </summary>
-12 public interface IAwaitCaller
-13 {
+12 public interface IAwaitCaller
+13 {
14 /// <summary>
15 /// フレームレートを維持するために1フレーム待つ
16 /// </summary>
17 /// <returns></returns>
-18 Task NextFrame();
+18 Task NextFrame();
19
20 /// <summary>
21 /// 非同期に実行して、終了を待つ
22 /// </summary>
23 /// <param name="action"></param>
24 /// <returns></returns>
-25 Task Run(Action action);
+25 Task Run(Action action);
26
27 /// <summary>
28 /// 非同期に実行して、終了を待つ
@@ -380,15 +380,15 @@
30 /// <param name="action"></param>
31 /// <typeparam name="T"></typeparam>
32 /// <returns></returns>
-33 Task<T> Run<T>(Func<T> action);
+33 Task<T> Run<T>(Func<T> action);
34
35 /// <summary>
36 /// 指定した時間が経過している場合のみ、NextFrame() を使って1フレーム待つ
37 /// </summary>
38 /// <returns>タイムアウト時はNextFrame()を呼び出す。そうではない場合、Task.CompletedTaskを返す</returns>
-39 Task NextFrameIfTimedOut();
-40 }
-41}
+39 Task NextFrameIfTimedOut();
+40 }
+41}
@@ -403,35 +403,35 @@
Play(Editor Play, build), Editor(not play), UnitTest でデッドロックしないための実装です。
- 1using System;
- 2using System.Threading.Tasks;
+ 1using System;
+ 2using System.Threading.Tasks;
3
- 4namespace VRMShaders
- 5{
+ 4namespace VRMShaders
+ 5{
6 /// <summary>
7 /// 同期実行
8 /// </summary>
- 9 public sealed class ImmediateCaller : IAwaitCaller
-10 {
-11 public Task NextFrame()
-12 {
-13 return Task.FromResult<object>(null);
-14 }
+ 9 public sealed class ImmediateCaller : IAwaitCaller
+10 {
+11 public Task NextFrame()
+12 {
+13 return Task.FromResult<object>(null);
+14 }
15
-16 public Task Run(Action action)
-17 {
-18 action();
-19 return Task.FromResult<object>(null);
-20 }
+16 public Task Run(Action action)
+17 {
+18 action();
+19 return Task.FromResult<object>(null);
+20 }
21
-22 public Task<T> Run<T>(Func<T> action)
-23 {
-24 return Task.FromResult(action());
-25 }
+22 public Task<T> Run<T>(Func<T> action)
+23 {
+24 return Task.FromResult(action());
+25 }
26
-27 public Task NextFrameIfTimedOut() => NextFrame();
-28 }
-29}
+27 public Task NextFrameIfTimedOut() => NextFrame();
+28 }
+29}
@@ -441,67 +441,67 @@
Play(Editor Play, build) 時に非同期実行する実装です
VRM10_Samples/VRM10Viewer に使用例があります。
- 1using System;
- 2using System.Threading.Tasks;
+ 1using System;
+ 2using System.Threading.Tasks;
3
- 4namespace VRMShaders
- 5{
+ 4namespace VRMShaders
+ 5{
6 /// <summary>
7 /// Runtime (Build 後と、Editor Playing) での非同期ロードを実現する AwaitCaller.
8 /// NOTE: 簡便に実装されたものなので、最適化の余地はある.
9 /// </summary>
-10 public sealed class RuntimeOnlyAwaitCaller : IAwaitCaller
-11 {
-12 private readonly NextFrameTaskScheduler _scheduler;
-13 private readonly float _timeOutInSeconds;
-14 private float _lastTimeoutBaseTime;
+10 public sealed class RuntimeOnlyAwaitCaller : IAwaitCaller
+11 {
+12 private readonly NextFrameTaskScheduler _scheduler;
+13 private readonly float _timeOutInSeconds;
+14 private float _lastTimeoutBaseTime;
15
16 /// <summary>
17 /// タイムアウト指定可能なコンストラクタ
18 /// </summary>
19 /// <param name="timeOutInSeconds">NextFrameIfTimedOutがタイムアウトと見なす時間(秒単位)</param>
-20 public RuntimeOnlyAwaitCaller(float timeOutInSeconds = 1f / 1000f)
-21 {
-22 _scheduler = new NextFrameTaskScheduler();
-23 _timeOutInSeconds = timeOutInSeconds;
-24 ResetLastTimeoutBaseTime();
-25 }
+20 public RuntimeOnlyAwaitCaller(float timeOutInSeconds = 1f / 1000f)
+21 {
+22 _scheduler = new NextFrameTaskScheduler();
+23 _timeOutInSeconds = timeOutInSeconds;
+24 ResetLastTimeoutBaseTime();
+25 }
26
-27 public Task NextFrame()
-28 {
-29 ResetLastTimeoutBaseTime();
-30 var tcs = new TaskCompletionSource<object>();
-31 _scheduler.Enqueue(() => tcs.SetResult(default));
-32 return tcs.Task;
-33 }
+27 public Task NextFrame()
+28 {
+29 ResetLastTimeoutBaseTime();
+30 var tcs = new TaskCompletionSource<object>();
+31 _scheduler.Enqueue(() => tcs.SetResult(default));
+32 return tcs.Task;
+33 }
34
-35 public Task Run(Action action)
-36 {
-37 return Task.Run(action);
-38 }
+35 public Task Run(Action action)
+36 {
+37 return Task.Run(action);
+38 }
39
-40 public Task<T> Run<T>(Func<T> action)
-41 {
-42 return Task.Run(action);
-43 }
+40 public Task<T> Run<T>(Func<T> action)
+41 {
+42 return Task.Run(action);
+43 }
44
-45 public Task NextFrameIfTimedOut() => CheckTimeout() ? NextFrame() : Task.CompletedTask;
+45 public Task NextFrameIfTimedOut() => CheckTimeout() ? NextFrame() : Task.CompletedTask;
46
-47 private void ResetLastTimeoutBaseTime() => _lastTimeoutBaseTime = 0f;
+47 private void ResetLastTimeoutBaseTime() => _lastTimeoutBaseTime = 0f;
48
-49 private bool LastTimeoutBaseTimeNeedsReset => _lastTimeoutBaseTime == 0f;
+49 private bool LastTimeoutBaseTimeNeedsReset => _lastTimeoutBaseTime == 0f;
50
-51 private bool CheckTimeout()
-52 {
-53 float t = UnityEngine.Time.realtimeSinceStartup;
-54 if (LastTimeoutBaseTimeNeedsReset)
-55 {
-56 _lastTimeoutBaseTime = t;
-57 }
-58 return (t - _lastTimeoutBaseTime) >= _timeOutInSeconds;
-59 }
-60 }
-61}
+51 private bool CheckTimeout()
+52 {
+53 float t = UnityEngine.Time.realtimeSinceStartup;
+54 if (LastTimeoutBaseTimeNeedsReset)
+55 {
+56 _lastTimeoutBaseTime = t;
+57 }
+58 return (t - _lastTimeoutBaseTime) >= _timeOutInSeconds;
+59 }
+60 }
+61}
diff --git a/en/api/0_95_dispose.html b/en/api/0_95_dispose.html
index 8aee81204..07002a011 100644
--- a/en/api/0_95_dispose.html
+++ b/en/api/0_95_dispose.html
@@ -343,17 +343,17 @@
v0.95 GltfData.Dispose¶
Now that we are using NativeArray within the importer, we had to discard it at the end. Please dispose of it when you are finished using it.
-class GltfData: IDisposable
+class GltfData: IDisposable
Example¶
// must dispose GltfData
-using (GltfData data = new AutoGltfFileParser(path).Parse())
-using (var loader = new UniGLTF.ImporterContext(data, materialGenerator: materialGenerator))
-{
- return await loader.LoadAsync(awaitCaller);
-}
+using (GltfData data = new AutoGltfFileParser(path).Parse())
+using (var loader = new UniGLTF.ImporterContext(data, materialGenerator: materialGenerator))
+{
+ return await loader.LoadAsync(awaitCaller);
+}
diff --git a/en/api/0_95_highlevel.html b/en/api/0_95_highlevel.html
index 21ef57cd9..0833eea25 100644
--- a/en/api/0_95_highlevel.html
+++ b/en/api/0_95_highlevel.html
@@ -345,93 +345,93 @@
As the API became more complex, we added a high-level API that simplifies common usage. GltfUtility and VrmUtility are used internally, so you can just call them with await.
GLTF¶
- 1using System.IO;
- 2using System.Threading.Tasks;
- 3using UnityEngine;
- 4using VRMShaders;
+ 1using System.IO;
+ 2using System.Threading.Tasks;
+ 3using UnityEngine;
+ 4using VRMShaders;
5
- 6namespace UniGLTF
- 7{
- 8 public static class GltfUtility
- 9 {
-10 public static async Task<RuntimeGltfInstance> LoadAsync(string path, IAwaitCaller awaitCaller = null, IMaterialDescriptorGenerator materialGenerator = null)
-11 {
-12 if (!File.Exists(path))
-13 {
-14 throw new FileNotFoundException(path);
-15 }
+ 6namespace UniGLTF
+ 7{
+ 8 public static class GltfUtility
+ 9 {
+10 public static async Task<RuntimeGltfInstance> LoadAsync(string path, IAwaitCaller awaitCaller = null, IMaterialDescriptorGenerator materialGenerator = null)
+11 {
+12 if (!File.Exists(path))
+13 {
+14 throw new FileNotFoundException(path);
+15 }
16
-17 Debug.LogFormat("{0}", path);
-18 using (GltfData data = new AutoGltfFileParser(path).Parse())
-19 using (var loader = new UniGLTF.ImporterContext(data, materialGenerator: materialGenerator))
-20 {
-21 return await loader.LoadAsync(awaitCaller);
-22 }
-23 }
-24 }
-25}
+17 Debug.LogFormat("{0}", path);
+18 using (GltfData data = new AutoGltfFileParser(path).Parse())
+19 using (var loader = new UniGLTF.ImporterContext(data, materialGenerator: materialGenerator))
+20 {
+21 return await loader.LoadAsync(awaitCaller);
+22 }
+23 }
+24 }
+25}
VRM¶
- 1using System;
- 2using System.IO;
- 3using System.Threading.Tasks;
- 4using UniGLTF;
- 5using UnityEngine;
- 6using VRMShaders;
+ 1using System;
+ 2using System.IO;
+ 3using System.Threading.Tasks;
+ 4using UniGLTF;
+ 5using UnityEngine;
+ 6using VRMShaders;
7
- 8namespace VRM
- 9{
-10 public static class VrmUtility
-11 {
-12 public delegate IMaterialDescriptorGenerator MaterialGeneratorCallback(VRM.glTF_VRM_extensions vrm);
-13 public delegate void MetaCallback(VRMMetaObject meta);
-14 public static async Task<RuntimeGltfInstance> LoadAsync(string path,
-15 IAwaitCaller awaitCaller = null,
-16 MaterialGeneratorCallback materialGeneratorCallback = null,
-17 MetaCallback metaCallback = null
-18 )
-19 {
-20 if (!File.Exists(path))
-21 {
-22 throw new FileNotFoundException(path);
-23 }
+ 8namespace VRM
+ 9{
+10 public static class VrmUtility
+11 {
+12 public delegate IMaterialDescriptorGenerator MaterialGeneratorCallback(VRM.glTF_VRM_extensions vrm);
+13 public delegate void MetaCallback(VRMMetaObject meta);
+14 public static async Task<RuntimeGltfInstance> LoadAsync(string path,
+15 IAwaitCaller awaitCaller = null,
+16 MaterialGeneratorCallback materialGeneratorCallback = null,
+17 MetaCallback metaCallback = null
+18 )
+19 {
+20 if (!File.Exists(path))
+21 {
+22 throw new FileNotFoundException(path);
+23 }
24
-25 using (GltfData data = new AutoGltfFileParser(path).Parse())
-26 {
-27 try
-28 {
-29 var vrm = new VRMData(data);
-30 IMaterialDescriptorGenerator materialGen = default;
-31 if (materialGeneratorCallback != null)
-32 {
-33 materialGen = materialGeneratorCallback(vrm.VrmExtension);
-34 }
-35 using (var loader = new VRMImporterContext(vrm, materialGenerator: materialGen))
-36 {
-37 if (metaCallback != null)
-38 {
-39 var meta = await loader.ReadMetaAsync(new ImmediateCaller(), true);
-40 metaCallback(meta);
-41 }
-42 return await loader.LoadAsync(awaitCaller);
-43 }
-44 }
-45 catch (NotVrm0Exception)
-46 {
+25 using (GltfData data = new AutoGltfFileParser(path).Parse())
+26 {
+27 try
+28 {
+29 var vrm = new VRMData(data);
+30 IMaterialDescriptorGenerator materialGen = default;
+31 if (materialGeneratorCallback != null)
+32 {
+33 materialGen = materialGeneratorCallback(vrm.VrmExtension);
+34 }
+35 using (var loader = new VRMImporterContext(vrm, materialGenerator: materialGen))
+36 {
+37 if (metaCallback != null)
+38 {
+39 var meta = await loader.ReadMetaAsync(new ImmediateCaller(), true);
+40 metaCallback(meta);
+41 }
+42 return await loader.LoadAsync(awaitCaller);
+43 }
+44 }
+45 catch (NotVrm0Exception)
+46 {
47 // retry
-48 Debug.LogWarning("file extension is vrm. but not vrm ?");
-49 using (var loader = new UniGLTF.ImporterContext(data))
-50 {
-51 return await loader.LoadAsync(awaitCaller);
-52 }
-53 }
-54 }
-55 }
-56 }
-57}
+48 Debug.LogWarning("file extension is vrm. but not vrm ?");
+49 using (var loader = new UniGLTF.ImporterContext(data))
+50 {
+51 return await loader.LoadAsync(awaitCaller);
+52 }
+53 }
+54 }
+55 }
+56 }
+57}
@@ -439,29 +439,29 @@
Example¶
v0.95.0 Assets/VRM_Samples/SimpleViewer/ViewerUI.cs¶
- 1 async void LoadModelAsync(string path)
- 2 {
- 3 var ext = Path.GetExtension(path).ToLower();
- 4 switch (ext)
- 5 {
- 6 case ".gltf":
- 7 case ".glb":
- 8 case ".zip":
- 9 {
-10 var instance = await GltfUtility.LoadAsync(path,
-11 GetIAwaitCaller(m_useAsync.isOn),
-12 GetGltfMaterialGenerator(m_useUrpMaterial.isOn));
-13 break;
-14 }
+ 1 async void LoadModelAsync(string path)
+ 2 {
+ 3 var ext = Path.GetExtension(path).ToLower();
+ 4 switch (ext)
+ 5 {
+ 6 case ".gltf":
+ 7 case ".glb":
+ 8 case ".zip":
+ 9 {
+10 var instance = await GltfUtility.LoadAsync(path,
+11 GetIAwaitCaller(m_useAsync.isOn),
+12 GetGltfMaterialGenerator(m_useUrpMaterial.isOn));
+13 break;
+14 }
15
-16 case ".vrm":
-17 {
-18 VrmUtility.MaterialGeneratorCallback materialCallback = (VRM.glTF_VRM_extensions vrm) => GetVrmMaterialGenerator(m_useUrpMaterial.isOn, vrm);
-19 VrmUtility.MetaCallback metaCallback = m_texts.UpdateMeta;
-20 var instance = await VrmUtility.LoadAsync(path, GetIAwaitCaller(m_useAsync.isOn), materialCallback, metaCallback);
-21 SetModel(instance);
-22 break;
-23 }
+16 case ".vrm":
+17 {
+18 VrmUtility.MaterialGeneratorCallback materialCallback = (VRM.glTF_VRM_extensions vrm) => GetVrmMaterialGenerator(m_useUrpMaterial.isOn, vrm);
+19 VrmUtility.MetaCallback metaCallback = m_texts.UpdateMeta;
+20 var instance = await VrmUtility.LoadAsync(path, GetIAwaitCaller(m_useAsync.isOn), materialCallback, metaCallback);
+21 SetModel(instance);
+22 break;
+23 }
diff --git a/en/api/fast_spring_bone.html b/en/api/fast_spring_bone.html
index f528acfb0..93fac4bf6 100644
--- a/en/api/fast_spring_bone.html
+++ b/en/api/fast_spring_bone.html
@@ -362,15 +362,15 @@
VRM 0.x での FastSpringBone の導入方法¶
差し替えを行いたいタイミングで FastSpringBoneReplacer.ReplaceAsync を呼び出してください
これを明示的に呼ばなければ、従来のSpringBoneのまま動作します。
-using (var loader = new UniGLTF.ImporterContext(data))
-{
- var instance = await loader.LoadAsync();
- SetModel(instance);
-}
-FastSpringBoneReplacer.ReplaceAsync(instance.Root)
+using (var loader = new UniGLTF.ImporterContext(data))
+{
+ var instance = await loader.LoadAsync();
+ SetModel(instance);
+}
+FastSpringBoneReplacer.ReplaceAsync(instance.Root)
-instance.EnableUpdateWhenOffscreen();
-instance.ShowMeshes();
+instance.EnableUpdateWhenOffscreen();
+instance.ShowMeshes();
diff --git a/en/api/firstperson.html b/en/api/firstperson.html
index d18b44476..e9e12cfdf 100644
--- a/en/api/firstperson.html
+++ b/en/api/firstperson.html
@@ -348,13 +348,13 @@
アプリケーションに追加の描画レイヤーを指定する¶
定数で以下のレイヤーを定義しています。
-public class VRMFirstPerson : MonoBehaviour
-{
- public const int FIRSTPERSON_ONLY_LAYER = 9;
- public const int THIRDPERSON_ONLY_LAYER = 10;
+public class VRMFirstPerson : MonoBehaviour
+{
+ public const int FIRSTPERSON_ONLY_LAYER = 9;
+ public const int THIRDPERSON_ONLY_LAYER = 10;
// 省略
-}
+}
@@ -374,47 +374,47 @@
VRMFirstPerson.Setupの呼び出し
一人称カメラとその他のカメラに対してLayerMask
-using System.Collections;
-using System.Collections.Generic;
-using UnityEngine;
-using VRM;
+using System.Collections;
+using System.Collections.Generic;
+using UnityEngine;
+using VRM;
-public class SetupExample : MonoBehaviour
-{
- [SerializeField]
+public class SetupExample : MonoBehaviour
+{
+ [SerializeField]
Camera m_firstPersonCamera; // HMDのカメラ
- [SerializeField]
+ [SerializeField]
LayerMask m_firstPersonMask; // HMDのカメラにセットするマスク default | VRMFirstPersonOnly など
- [SerializeField]
+ [SerializeField]
LayerMask m_otherMask; // HMDのカメラにセットするマスク default | VRMThirdPersonOnly など
- [SerializeField]
- VRMFirstPerson m_firstPerson;
+ [SerializeField]
+ VRMFirstPerson m_firstPerson;
- void Reset()
- {
- m_firstPerson = GameObject.FindObjectOfType<VRMFirstPerson>();
- }
+ void Reset()
+ {
+ m_firstPerson = GameObject.FindObjectOfType<VRMFirstPerson>();
+ }
- void Start()
- {
- foreach (var camera in GameObject.FindObjectsOfType<Camera>())
- {
- camera.cullingMask = (camera == m_firstPersonCamera)
- ? m_firstPersonMask
- : m_otherMask
- ;
- }
+ void Start()
+ {
+ foreach (var camera in GameObject.FindObjectsOfType<Camera>())
+ {
+ camera.cullingMask = (camera == m_firstPersonCamera)
+ ? m_firstPersonMask
+ : m_otherMask
+ ;
+ }
// VRMFirstPersonの初期化
- if (m_firstPerson != null)
- {
- m_firstPerson.Setup();
- }
- }
-}
+ if (m_firstPerson != null)
+ {
+ m_firstPerson.Setup();
+ }
+ }
+}
diff --git a/en/api/how_to_customize_material_import.html b/en/api/how_to_customize_material_import.html
index e930d4643..ff6755813 100644
--- a/en/api/how_to_customize_material_import.html
+++ b/en/api/how_to_customize_material_import.html
@@ -347,15 +347,15 @@
materialGenerator で URP 用のマテリアルをロードする¶
URP マテリアルを生成するようにカスタムする例です。
https://github.com/vrm-c/UniVRM/issues/1214
-async RuntimeGltfInstance Load(GltfData data)
-{
- IMaterialDescriptorGenerator materialGenerator = new GltfUrpMaterialDescriptorGenerator();
- using(var loader = new UniGLTF.ImporterContext(data, materialGenerator: materialGenerator)
- {
- var instance = await loader.LoadAsync();
- return instance;
- }
-}
+async RuntimeGltfInstance Load(GltfData data)
+{
+ IMaterialDescriptorGenerator materialGenerator = new GltfUrpMaterialDescriptorGenerator();
+ using(var loader = new UniGLTF.ImporterContext(data, materialGenerator: materialGenerator)
+ {
+ var instance = await loader.LoadAsync();
+ return instance;
+ }
+}
diff --git a/en/api/how_to_impl_extension.html b/en/api/how_to_impl_extension.html
index f29f4ff1f..5af2fbf85 100644
--- a/en/api/how_to_impl_extension.html
+++ b/en/api/how_to_impl_extension.html
@@ -367,21 +367,21 @@
UniGLTF の extensions¶
v0.63.0 以前は、GLTF 型 の extensions フィールドに、GLTFExtensions 型を定義して、VRM フィールドを定義するという方法をとっていました。
-class VRM
-{
+class VRM
+{
-}
+}
-class GLTFExtensions
-{
- public VRM VRM;
-}
+class GLTFExtensions
+{
+ public VRM VRM;
+}
-class GLTF
-{
+class GLTF
+{
// すべての拡張の型をコンパイル時に知っている必要がある。動的に拡張できない
- public GLTFExtensions extensions;
-}
+ public GLTFExtensions extensions;
+}
この設計だと GLTF と拡張を別ライブラリとして分離することができませんでした。
@@ -389,16 +389,16 @@
UniGLTF は import/export の具体的な内容を知らずに中間データの入れ物として扱います。
// extensions / extras の入れ物として使う型
// 実行時は、 glTFExtensionImport / glTFExtensionExport を使う
-public abstract class glTFExtension
-{
+public abstract class glTFExtension
+{
-}
+}
-class GLTF
-{
+class GLTF
+{
// UniGLTFは具体的な型を知らない。利用側が処理(serialize/deserialize)する
- public glTFExtension extensions;
-}
+ public glTFExtension extensions;
+}
@@ -414,82 +414,82 @@ UniGLTF は import/
JSONPATH と 型を決める¶
// 型
-class GoodMaterial
-{
+class GoodMaterial
+{
// `materials[*].extensions.CUSTOM_materials_good`
- public const string EXTENSION_NAME = "CUSTOM_materials_good";
+ public const string EXTENSION_NAME = "CUSTOM_materials_good";
- public int GoodValue;
-}
+ public int GoodValue;
+}
import¶
-GoodMaterial DeserializeGoodMaterial(ListTreeNode<JsonValue> json)
-{
+GoodMaterial DeserializeGoodMaterial(ListTreeNode<JsonValue> json)
+{
// デシリアライズ。手で書くかコード生成する(後述)
-}
+}
// ユーティリティ関数例
-bool TryGetExtension<T>(UniGLTF.glTFExtension extension, string key, Func<ListTreeNode<JsonValue>, T> deserializer, out T value)
-{
- if(material.extensions is UniGLTF.glTFExtensionsImport import)
- {
+bool TryGetExtension<T>(UniGLTF.glTFExtension extension, string key, Func<ListTreeNode<JsonValue>, T> deserializer, out T value)
+{
+ if(material.extensions is UniGLTF.glTFExtensionsImport import)
+ {
// null check 完了
- foreach(var kv in import.ObjectItems())
- {
- if(kv.key.GetString()==key)
- {
- value = Deserialize(kv.Value);
- return true;
- }
- }
- }
+ foreach(var kv in import.ObjectItems())
+ {
+ if(kv.key.GetString()==key)
+ {
+ value = Deserialize(kv.Value);
+ return true;
+ }
+ }
+ }
- value = default;
- return false;
-}
+ value = default;
+ return false;
+}
-void ImportMaterial(UniGLTF.glTFMaterial material)
-{
+void ImportMaterial(UniGLTF.glTFMaterial material)
+{
// material の処理に割り込んで
- if(TryGetExtension(material.extension, GoodMaterial.EXTENSION_NAME, DeserializeGoodMaterial, out GoodMaterial good))
- {
+ if(TryGetExtension(material.extension, GoodMaterial.EXTENSION_NAME, DeserializeGoodMaterial, out GoodMaterial good))
+ {
// good material 独自の処理
- }
-}
+ }
+}
export¶
-void SerializeGoodMaterial(UniJSON.JsonFormatter f, GoodMaterial value)
-{
+void SerializeGoodMaterial(UniJSON.JsonFormatter f, GoodMaterial value)
+{
// シリアライズ。手で書くかコード生成する(後述)
-}
+}
// ユーティリティ関数例
-public ArraySegment<byte> SerializeExtension<T>(T value, Func<T, ArraySegment<byte>> serialize)
-{
- var f = new UniJSON.JsonFormatter();
- serialize(f, value);
- return f.GetStoreBytes();
-}
+public ArraySegment<byte> SerializeExtension<T>(T value, Func<T, ArraySegment<byte>> serialize)
+{
+ var f = new UniJSON.JsonFormatter();
+ serialize(f, value);
+ return f.GetStoreBytes();
+}
-void ExportGoodMaterial(UniGLTF.glTFMaterial material, GoodMaterial good)
-{
+void ExportGoodMaterial(UniGLTF.glTFMaterial material, GoodMaterial good)
+{
// material の処理に割り込んで
- if(!(material.extensions is UniGLTF.glTFExtensionsExport export))
- {
+ if(!(material.extensions is UniGLTF.glTFExtensionsExport export))
+ {
// 無かった。新規作成
- export = new UniGLTF.glTFExtensionsExport();
- material.extensions = export;
- }
+ export = new UniGLTF.glTFExtensionsExport();
+ material.extensions = export;
+ }
- var bytes = SerializeExtension(good, SerializeGoodMaterial);
- export.Add(GoodMaterial.EXTENSION_NAME, bytes);
-}
+ var bytes = SerializeExtension(good, SerializeGoodMaterial);
+ export.Add(GoodMaterial.EXTENSION_NAME, bytes);
+}
@@ -620,22 +620,22 @@ C# の型から生成するものと、JsonSchema から C# の型とともに
Assets\UniGLTF\Editor\UniGLTF\Serialization\SerializerGenerator.cs
-using System;
-using System.Collections.Generic;
-using System.IO;
-using System.Reflection;
-using System.Text;
-using UniJSON;
-using UnityEditor;
-using UnityEngine;
+using System;
+using System.Collections.Generic;
+using System.IO;
+using System.Reflection;
+using System.Text;
+using UniJSON;
+using UnityEditor;
+using UnityEngine;
-namespace UniGLTF
-{
- public static class SerializerGenerator
- {
- const BindingFlags FIELD_FLAGS = BindingFlags.Instance | BindingFlags.Public;
+namespace UniGLTF
+{
+ public static class SerializerGenerator
+ {
+ const BindingFlags FIELD_FLAGS = BindingFlags.Instance | BindingFlags.Public;
- const string Begin = @"// Don't edit manually. This is generaged.
+ const string Begin = @"// Don't edit manually. This is generaged.
using System;
using System.Collections.Generic;
using UniJSON;
@@ -645,41 +645,41 @@ C# の型から生成するものと、JsonSchema から C# の型とともに
static public class GltfSerializer
{
-";
+";
- const string End = @"
+ const string End = @"
} // class
} // namespace
-";
+";
- static string OutPath
- {
- get
- {
- return Path.Combine(UnityEngine.Application.dataPath,
- "UniGLTF/UniGLTF/Scripts/IO/GltfSerializer.g.cs");
- }
- }
+ static string OutPath
+ {
+ get
+ {
+ return Path.Combine(UnityEngine.Application.dataPath,
+ "UniGLTF/UniGLTF/Scripts/IO/GltfSerializer.g.cs");
+ }
+ }
- [MenuItem(UniGLTFVersion.MENU + "/GLTF: Generate Serializer")]
- static void GenerateSerializer()
- {
- var info = new ObjectSerialization(typeof(glTF), "gltf", "Serialize_");
- Debug.Log(info);
+ [MenuItem(UniGLTFVersion.MENU + "/GLTF: Generate Serializer")]
+ static void GenerateSerializer()
+ {
+ var info = new ObjectSerialization(typeof(glTF), "gltf", "Serialize_");
+ Debug.Log(info);
- using (var s = File.Open(OutPath, FileMode.Create))
- using (var w = new StreamWriter(s, new UTF8Encoding(false)))
- {
- w.Write(Begin);
- info.GenerateSerializer(w, "Serialize");
- w.Write(End);
- }
+ using (var s = File.Open(OutPath, FileMode.Create))
+ using (var w = new StreamWriter(s, new UTF8Encoding(false)))
+ {
+ w.Write(Begin);
+ info.GenerateSerializer(w, "Serialize");
+ w.Write(End);
+ }
- Debug.LogFormat("write: {0}", OutPath);
- UnityPath.FromFullpath(OutPath).ImportAsset();
- }
- }
-}
+ Debug.LogFormat("write: {0}", OutPath);
+ UnityPath.FromFullpath(OutPath).ImportAsset();
+ }
+ }
+}
@@ -695,22 +695,22 @@ C# の型から生成するものと、JsonSchema から C# の型とともに
Assets\UniGLTF\Editor\UniGLTF\Serialization\DeserializerGenerator.cs
-using System.IO;
-using System.Reflection;
-using System.Text;
-using UnityEditor;
-using UnityEngine;
+using System.IO;
+using System.Reflection;
+using System.Text;
+using UnityEditor;
+using UnityEngine;
-namespace UniGLTF
-{
+namespace UniGLTF
+{
/// <summary>
/// Generate deserializer from ListTreeNode<JsonValue> to glTF using type reflection
/// </summary>
- public static class DeserializerGenerator
- {
- public const BindingFlags FIELD_FLAGS = BindingFlags.Instance | BindingFlags.Public;
+ public static class DeserializerGenerator
+ {
+ public const BindingFlags FIELD_FLAGS = BindingFlags.Instance | BindingFlags.Public;
- const string Begin = @"// Don't edit manually. This is generaged.
+ const string Begin = @"// Don't edit manually. This is generaged.
using UniJSON;
using System;
using System.Collections.Generic;
@@ -721,41 +721,41 @@ C# の型から生成するものと、JsonSchema から C# の型とともに
public static class GltfDeserializer
{
-";
+";
- const string End = @"
+ const string End = @"
} // GltfDeserializer
} // UniGLTF
-";
+";
- static string OutPath
- {
- get
- {
- return Path.Combine(UnityEngine.Application.dataPath,
- "UniGLTF/UniGLTF/Scripts/IO/GltfDeserializer.g.cs");
- }
- }
+ static string OutPath
+ {
+ get
+ {
+ return Path.Combine(UnityEngine.Application.dataPath,
+ "UniGLTF/UniGLTF/Scripts/IO/GltfDeserializer.g.cs");
+ }
+ }
- [MenuItem(UniGLTFVersion.MENU + "/GLTF: Generate Deserializer")]
- static void GenerateSerializer()
- {
- var info = new ObjectSerialization(typeof(glTF), "gltf", "Deserialize_");
- Debug.Log(info);
+ [MenuItem(UniGLTFVersion.MENU + "/GLTF: Generate Deserializer")]
+ static void GenerateSerializer()
+ {
+ var info = new ObjectSerialization(typeof(glTF), "gltf", "Deserialize_");
+ Debug.Log(info);
- using (var s = File.Open(OutPath, FileMode.Create))
- using (var w = new StreamWriter(s, new UTF8Encoding(false)))
- {
- w.Write(Begin);
- info.GenerateDeserializer(w, "Deserialize");
- w.Write(End);
- }
+ using (var s = File.Open(OutPath, FileMode.Create))
+ using (var w = new StreamWriter(s, new UTF8Encoding(false)))
+ {
+ w.Write(Begin);
+ info.GenerateDeserializer(w, "Deserialize");
+ w.Write(End);
+ }
- Debug.LogFormat("write: {0}", OutPath);
- UnityPath.FromFullpath(OutPath).ImportAsset();
- }
- }
-}
+ Debug.LogFormat("write: {0}", OutPath);
+ UnityPath.FromFullpath(OutPath).ImportAsset();
+ }
+ }
+}
@@ -763,18 +763,18 @@ C# の型から生成するものと、JsonSchema から C# の型とともに
キー出力の抑制¶
index に無効な値として -1 を入れる場合に、JSONではキーを出力しないとしたいことがあります。
TODO: int? にするべきだった
-[JsonSchema(Minimum = 0)]
-int index = -1;
+[JsonSchema(Minimum = 0)]
+int index = -1;
のようにすることで、キーの出力を抑制できます。
// 生成コードのキー出力例
- if(value.index>=0){
+ if(value.index>=0){
何も付けないと
// 出力制御無し
- if(true){
+ if(true){
@@ -782,11 +782,11 @@ C# の型から生成するものと、JsonSchema から C# の型とともに
enum のエンコーディング¶
enumの値の名前を文字列で使う、enumの値の数値を使うの2種類がありえます。
enumの場合はデフォルト値が無いので必須です。
-[JsonSchema(EnumSerializationType = EnumSerializationType.AsInt)]
-public glBufferTarget target;
+[JsonSchema(EnumSerializationType = EnumSerializationType.AsInt)]
+public glBufferTarget target;
-[JsonSchema(EnumSerializationType = EnumSerializationType.AsLowerString)]
-public ProjectionType type;
+[JsonSchema(EnumSerializationType = EnumSerializationType.AsLowerString)]
+public ProjectionType type;
diff --git a/en/api/sample/FirstPersonSample.html b/en/api/sample/FirstPersonSample.html
index bdf686a2e..71bc29668 100644
--- a/en/api/sample/FirstPersonSample.html
+++ b/en/api/sample/FirstPersonSample.html
@@ -351,29 +351,29 @@
の描画を例示します。
v0.87.0 Assets/VRM_Samples/FirstPersonSample/VRMRuntimeLoader.cs¶
- 1 void SetupTarget()
- 2 {
- 3 if (m_target != null)
- 4 {
- 5 m_target.Source = m_source;
- 6 m_target.SourceType = UniHumanoid.HumanPoseTransfer.HumanPoseTransferSourceType.HumanPoseTransfer;
+ 1 void SetupTarget()
+ 2 {
+ 3 if (m_target != null)
+ 4 {
+ 5 m_target.Source = m_source;
+ 6 m_target.SourceType = UniHumanoid.HumanPoseTransfer.HumanPoseTransferSourceType.HumanPoseTransfer;
7
- 8 m_blendShape = m_target.GetComponent<VRMBlendShapeProxy>();
+ 8 m_blendShape = m_target.GetComponent<VRMBlendShapeProxy>();
9
-10 m_firstPerson = m_target.GetComponent<VRMFirstPerson>();
+10 m_firstPerson = m_target.GetComponent<VRMFirstPerson>();
11
-12 var animator = m_target.GetComponent<Animator>();
-13 if (animator != null)
-14 {
-15 m_firstPerson.Setup();
+12 var animator = m_target.GetComponent<Animator>();
+13 if (animator != null)
+14 {
+15 m_firstPerson.Setup();
16
-17 if (m_faceCamera != null)
-18 {
-19 m_faceCamera.Target = animator.GetBoneTransform(HumanBodyBones.Head);
-20 }
-21 }
-22 }
-23 }
+17 if (m_faceCamera != null)
+18 {
+19 m_faceCamera.Target = animator.GetBoneTransform(HumanBodyBones.Head);
+20 }
+21 }
+22 }
+23 }
diff --git a/en/api/sample/RuntimeExporterSample.html b/en/api/sample/RuntimeExporterSample.html
index ac4480dc7..1ae63e706 100644
--- a/en/api/sample/RuntimeExporterSample.html
+++ b/en/api/sample/RuntimeExporterSample.html
@@ -345,28 +345,28 @@
VRM を Runtime Export するサンプルです。
v0.87.0 Assets/VRM_Samples/RuntimeExporterSample/VRMRuntimeExporter.cs¶
- 1 static byte[] ExportSimple(GameObject model)
- 2 {
- 3 var vrm = VRMExporter.Export(new UniGLTF.GltfExportSettings(), model, new RuntimeTextureSerializer());
- 4 var bytes = vrm.ToGlbBytes();
- 5 return bytes;
- 6 }
+ 1 static byte[] ExportSimple(GameObject model)
+ 2 {
+ 3 var vrm = VRMExporter.Export(new UniGLTF.GltfExportSettings(), model, new RuntimeTextureSerializer());
+ 4 var bytes = vrm.ToGlbBytes();
+ 5 return bytes;
+ 6 }
7
- 8 static byte[] ExportCustom(GameObject exportRoot, bool forceTPose = false)
- 9 {
+ 8 static byte[] ExportCustom(GameObject exportRoot, bool forceTPose = false)
+ 9 {
10 // normalize
-11 var target = VRMBoneNormalizer.Execute(exportRoot, forceTPose);
+11 var target = VRMBoneNormalizer.Execute(exportRoot, forceTPose);
12
-13 try
-14 {
-15 return ExportSimple(target);
-16 }
-17 finally
-18 {
+13 try
+14 {
+15 return ExportSimple(target);
+16 }
+17 finally
+18 {
19 // cleanup
-20 GameObject.Destroy(target);
-21 }
-22 }
+20 GameObject.Destroy(target);
+21 }
+22 }
diff --git a/en/api/sample/SimpleViewer.html b/en/api/sample/SimpleViewer.html
index a73f97513..827f7132c 100644
--- a/en/api/sample/SimpleViewer.html
+++ b/en/api/sample/SimpleViewer.html
@@ -345,58 +345,58 @@
Runtime ローダーのサンプルです。
c89e Assets/VRM_Samples/SimpleViewer/ViewerUI.cs¶
- 1 async void LoadModelAsync(string path, bool isVrm)
- 2 {
- 3 if (!File.Exists(path))
- 4 {
- 5 return;
- 6 }
+ 1 async void LoadModelAsync(string path, bool isVrm)
+ 2 {
+ 3 if (!File.Exists(path))
+ 4 {
+ 5 return;
+ 6 }
7
- 8 Debug.LogFormat("{0}", path);
+ 8 Debug.LogFormat("{0}", path);
9
-10 GltfData data;
-11 try
-12 {
-13 data = new AutoGltfFileParser(path).Parse();
-14 }
-15 catch (Exception ex)
-16 {
-17 Debug.LogWarningFormat("parse error: {0}", ex);
-18 return;
-19 }
+10 GltfData data;
+11 try
+12 {
+13 data = new AutoGltfFileParser(path).Parse();
+14 }
+15 catch (Exception ex)
+16 {
+17 Debug.LogWarningFormat("parse error: {0}", ex);
+18 return;
+19 }
20
-21 if (isVrm)
-22 {
-23 try
-24 {
-25 var vrm = new VRMData(data);
-26 using (var loader = new VRMImporterContext(vrm, materialGenerator: GetVrmMaterialGenerator(m_useUrpMaterial.isOn, vrm.VrmExtension)))
-27 {
-28 await m_texts.UpdateMetaAsync(loader);
-29 var instance = await loader.LoadAsync(GetIAwaitCaller(m_useAsync.isOn));
-30 SetModel(instance);
-31 }
-32 }
-33 catch (NotVrm0Exception)
-34 {
+21 if (isVrm)
+22 {
+23 try
+24 {
+25 var vrm = new VRMData(data);
+26 using (var loader = new VRMImporterContext(vrm, materialGenerator: GetVrmMaterialGenerator(m_useUrpMaterial.isOn, vrm.VrmExtension)))
+27 {
+28 await m_texts.UpdateMetaAsync(loader);
+29 var instance = await loader.LoadAsync(GetIAwaitCaller(m_useAsync.isOn));
+30 SetModel(instance);
+31 }
+32 }
+33 catch (NotVrm0Exception)
+34 {
35 // retry
-36 Debug.LogWarning("file extension is vrm. but not vrm ?");
-37 using (var loader = new UniGLTF.ImporterContext(data, materialGenerator: GetGltfMaterialGenerator(m_useUrpMaterial.isOn)))
-38 {
-39 var instance = await loader.LoadAsync(GetIAwaitCaller(m_useAsync.isOn));
-40 SetModel(instance);
-41 }
-42 }
-43 }
-44 else
-45 {
-46 using (var loader = new UniGLTF.ImporterContext(data, materialGenerator: GetGltfMaterialGenerator(m_useUrpMaterial.isOn)))
-47 {
-48 var instance = await loader.LoadAsync(GetIAwaitCaller(m_useAsync.isOn));
-49 SetModel(instance);
-50 }
-51 }
-52 }
+36 Debug.LogWarning("file extension is vrm. but not vrm ?");
+37 using (var loader = new UniGLTF.ImporterContext(data, materialGenerator: GetGltfMaterialGenerator(m_useUrpMaterial.isOn)))
+38 {
+39 var instance = await loader.LoadAsync(GetIAwaitCaller(m_useAsync.isOn));
+40 SetModel(instance);
+41 }
+42 }
+43 }
+44 else
+45 {
+46 using (var loader = new UniGLTF.ImporterContext(data, materialGenerator: GetGltfMaterialGenerator(m_useUrpMaterial.isOn)))
+47 {
+48 var instance = await loader.LoadAsync(GetIAwaitCaller(m_useAsync.isOn));
+49 SetModel(instance);
+50 }
+51 }
+52 }
diff --git a/en/implementation/coordinate.html b/en/implementation/coordinate.html
index 02eb6b15a..3b8bfdcfe 100644
--- a/en/implementation/coordinate.html
+++ b/en/implementation/coordinate.html
@@ -400,37 +400,37 @@
Invert Z-axis
Vector3: Position, Normal, etc.¶
-public static Vector3 ReverseZ(this Vector3 v)
-{
- return new Vector3(v.x, v.y, -v.z);
-}
+public static Vector3 ReverseZ(this Vector3 v)
+{
+ return new Vector3(v.x, v.y, -v.z);
+}
Quaternion: Rotation¶
-public static Quaternion ReverseZ(this Quaternion q)
-{
- float angle;
- Vector3 axis;
- q.ToAngleAxis(out angle, out axis);
- return Quaternion.AngleAxis(-angle, ReverseZ(axis));
-}
+public static Quaternion ReverseZ(this Quaternion q)
+{
+ float angle;
+ Vector3 axis;
+ q.ToAngleAxis(out angle, out axis);
+ return Quaternion.AngleAxis(-angle, ReverseZ(axis));
+}
Matrix: BindMatrices¶
If the scale value is in it, it does not work.
-public static Matrix4x4 ReverseZ(this Matrix4x4 m)
-{
-#if UNITY_2017_1_OR_NEWER
- m.SetTRS(m.GetColumn(3).ReverseZ(), m.rotation.ReverseZ(), Vector3.one);
-#else
- m.SetTRS(m.ExtractPosition().ReverseZ(), m.ExtractRotation().ReverseZ(), Vector3.one);
-#endif
- return m;
-}
+public static Matrix4x4 ReverseZ(this Matrix4x4 m)
+{
+#if UNITY_2017_1_OR_NEWER
+ m.SetTRS(m.GetColumn(3).ReverseZ(), m.rotation.ReverseZ(), Vector3.one);
+#else
+ m.SetTRS(m.ExtractPosition().ReverseZ(), m.ExtractRotation().ReverseZ(), Vector3.one);
+#endif
+ return m;
+}
diff --git a/en/implementation/scripted_importer.html b/en/implementation/scripted_importer.html
index 1525b1bdb..0e067366c 100644
--- a/en/implementation/scripted_importer.html
+++ b/en/implementation/scripted_importer.html
@@ -361,13 +361,13 @@
Import 設定を作れる¶
ScriptedImporter を継承したクラスの public member や [SerializeField] に情報を保存できます。
// 例
-[ScriptedImporter(1, "cube")]
-public class CubeImporter : ScriptedImporter
-{
- public float m_Scale = 1; // これを Asset の Inspector で変更して Apply すると、新しい設定で再importできる
+[ScriptedImporter(1, "cube")]
+public class CubeImporter : ScriptedImporter
+{
+ public float m_Scale = 1; // これを Asset の Inspector で変更して Apply すると、新しい設定で再importできる
// 省略
-}
+}
diff --git a/en/implementation/texture_manipulation.html b/en/implementation/texture_manipulation.html
index 107a7d806..9f4b2b4c1 100644
--- a/en/implementation/texture_manipulation.html
+++ b/en/implementation/texture_manipulation.html
@@ -347,7 +347,7 @@
Runtime¶
new する場合は、
-var texture = new Texture2D(width, height, format, mipChain, linear = true);
+var texture = new Texture2D(width, height, format, mipChain, linear = true);
とする。
@@ -356,12 +356,12 @@
Editor(Asset)¶
AssetFolder の png/jpg からloadする場合は、
事前に設定が必用。
-var textureImporter = AssetImporter.GetAtPath(assetPath) as TextureImporter;
-textureImporter.sRGBTexture = false; // Linear
-textureImporter.SaveAndReimport();
+var textureImporter = AssetImporter.GetAtPath(assetPath) as TextureImporter;
+textureImporter.sRGBTexture = false; // Linear
+textureImporter.SaveAndReimport();
// linear でロードされます
-var texture =AssetDatabase.LoadAssetAtPath<Texture2D>(assetPath);
+var texture =AssetDatabase.LoadAssetAtPath<Texture2D>(assetPath);
@@ -374,17 +374,17 @@
Runtime¶
new する場合は、
-var texture = new Texture2D(width, height, format, mipChain, linear = true);
+var texture = new Texture2D(width, height, format, mipChain, linear = true);
とする。
また、 DXT5nm という仕様で格納する必要があるので変換します。
y と w の2要素だけを使います。
-half4 normal;
-normal.x = 1.0;
-normal.y = col.y;
-normal.z = 1.0;
-normal.w = col.x;
+half4 normal;
+normal.x = 1.0;
+normal.y = col.y;
+normal.z = 1.0;
+normal.w = col.x;
@@ -392,12 +392,12 @@ y と w の2要素だけを使います。
Editor(Asset)¶
AssetFolder の png/jpg からloadする場合は、
ロードする前に設定が必用。
-var textureImporter = AssetImporter.GetAtPath(assetPath) as TextureImporter;
-textureImporter.textureType = TextureImporterType.NormalMap; // normalMap
-textureImporter.SaveAndReimport();
+var textureImporter = AssetImporter.GetAtPath(assetPath) as TextureImporter;
+textureImporter.textureType = TextureImporterType.NormalMap; // normalMap
+textureImporter.SaveAndReimport();
// DXT5nm でロードされます。
-var texture =AssetDatabase.LoadAssetAtPath<Texture2D>(assetPath);
+var texture =AssetDatabase.LoadAssetAtPath<Texture2D>(assetPath);
diff --git a/en/release/055/v0.41.html b/en/release/055/v0.41.html
index 728b48bac..f5e9a5c6a 100644
--- a/en/release/055/v0.41.html
+++ b/en/release/055/v0.41.html
@@ -373,11 +373,11 @@
[Importer] Change Task’s version check from UNITY_2018_1_OR_NEWER to UNITY_2017_1_OR_NEWER
[Exporter] Organized interface
-GameObject m_model;
-string path;
-var vrm = VRMExporter.Export(m_model);
-var bytes = vrm.ToGlbBytes();
-File.WriteAllBytes(path, bytes);
+GameObject m_model;
+string path;
+var vrm = VRMExporter.Export(m_model);
+var bytes = vrm.ToGlbBytes();
+File.WriteAllBytes(path, bytes);
diff --git a/en/release/055/v0.42.html b/en/release/055/v0.42.html
index 22415f0f1..b25a2c5ea 100644
--- a/en/release/055/v0.42.html
+++ b/en/release/055/v0.42.html
@@ -355,11 +355,11 @@ If you are using UniVRM to import VRM data, please update UniVRM to the latest v
UV Bugs Fix:¶
In v0.41 and the earlier versions, converting UV between Unity and GLTF was incorrect.
Before
-var converted_uv = new Vec2(uv.x, -uv.y); // value becomes negative
+var converted_uv = new Vec2(uv.x, -uv.y); // value becomes negative
After
-var converted_uv = new Vec2(uv.x, 1.0f-uv.y);
+var converted_uv = new Vec2(uv.x, 1.0f-uv.y);
This change influences both import and export.
@@ -421,12 +421,12 @@ It influences the use of normal map.
/bufferViews/*/byteStridewill not output¶
It seems necessary for outputting OpenGL’s interleaved vbo format:
// Example of interleaved format
-struct Vertex
-{
- public Vector3 Position;
- public Vector3 Normal;
-}
-Vertex[] Vertices;
+struct Vertex
+{
+ public Vector3 Position;
+ public Vector3 Normal;
+}
+Vertex[] Vertices;
Since UniGLTF outputs separate arrays for each vertex attribute, ByteStride was unnecessary.
diff --git a/en/release/055/v0.44.html b/en/release/055/v0.44.html
index a868083a4..d9bd46889 100644
--- a/en/release/055/v0.44.html
+++ b/en/release/055/v0.44.html
@@ -407,24 +407,24 @@
NormalMap asset import¶
-textureImporter.textureType = TextureImporterType.NormalMap;
+textureImporter.textureType = TextureImporterType.NormalMap;
NormalMap runtime import¶
pack
-fixed4 frag(v2f i) : SV_Target
-{
- half4 col = tex2D(_MainTex, i.uv);
- half4 normal;
- normal.x = 1.0;
- normal.y = col.y;
- normal.z = 1.0;
- normal.w = col.x;
+fixed4 frag(v2f i) : SV_Target
+{
+ half4 col = tex2D(_MainTex, i.uv);
+ half4 normal;
+ normal.x = 1.0;
+ normal.y = col.y;
+ normal.z = 1.0;
+ normal.w = col.x;
- return normal;
-}
+ return normal;
+}
diff --git a/en/release/055/v0.46.html b/en/release/055/v0.46.html
index 0226731b2..2ede75ed9 100644
--- a/en/release/055/v0.46.html
+++ b/en/release/055/v0.46.html
@@ -377,7 +377,7 @@
Unity2018.3対応¶
-#if NET_4_6 || NET_STANDARD_2_0
+#if NET_4_6 || NET_STANDARD_2_0
@@ -412,7 +412,7 @@
AccumulateValue¶
値を貯めて、後で Apply したときに反映する。
SetValues の最後にも Apply されます。
-void BlendShapeProxy.AccumulateValue(key, value)
+void BlendShapeProxy.AccumulateValue(key, value)
// [Obsolete] SetValue(key, value, false)
@@ -421,7 +421,7 @@
ImmediatelySetValue¶
即反映する。
-void BlendShapeProxy.ImmediatelySetValue(key, value)
+