Compare commits

...

18 Commits
1.12.5 ... main

Author SHA1 Message Date
nadena-dev-ci
74c5a793d9
New Crowdin updates (#1565)
* New translations en-us.json (Chinese Simplified)

* New translations en-us.json (Chinese Simplified)

* New translations en-us.json (Chinese Traditional)

* New translations en-us.json (Chinese Traditional)
2025-05-11 05:28:51 -07:00
Kazuki Y.
20496a9f59
Docs/add installation alcom prerelease (#1579)
* 📝ALCOMを使用したテスト版のインストール手順について記載

* 📝  alcomでのプレリリース版を選択する画像を追加
📝 インストール手順の構造を更新
2025-05-11 05:28:17 -07:00
dependabot[bot]
3f08117960
chore(deps): bump softprops/action-gh-release in /.github/workflows (#1560)
Bumps [softprops/action-gh-release](https://github.com/softprops/action-gh-release) from 2.2.1 to 2.2.2.
- [Release notes](https://github.com/softprops/action-gh-release/releases)
- [Changelog](https://github.com/softprops/action-gh-release/blob/master/CHANGELOG.md)
- [Commits](c95fe14893...da05d55257)

---
updated-dependencies:
- dependency-name: softprops/action-gh-release
  dependency-version: 2.2.2
  dependency-type: direct:production
  update-type: version-update:semver-patch
...

Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
2025-04-21 17:57:19 -07:00
nadena.dev release bot
14c74ae62e Release 1.13.0-alpha.2 2025-04-14 03:24:52 +00:00
bd_
186554b3e9 chore(changelog): update changelog for 1.12.5 release 2025-04-13 20:19:52 -07:00
Kazuki Y.
e678ce8a2a
docs: ALCOMでのインストール方法を追加 / インストール後のチュートリアル記載を章立てに変更 (#1556)
* docs: Add Installation for ALCOM

* fix: incorrect images
VSCodeでGitHubのリポジトリを直接開けて画像を入れると壊れるらしい.
2025-04-14 01:32:10 +00:00
二酸化カメレオン
ce77fc773c
fix: typo (#1554) 2025-04-14 01:30:32 +00:00
bd_
78dca536fb
fix: transform lookthrough logic was broken and could result in deleted curves (#1558)
Closes: #1550
2025-04-13 18:28:56 -07:00
bd_
7086b35b3f
fix: play audio absolute paths in a relative controller break (#1555)
In MA 1.11.x, while we corrected relative play audio paths where possible,
we would leave them unchanged if no corresponding object was found. This
meant that we maintained compatibility with older assets that uses absolute
addressing for their Play Audio paths. This change restores that behavior.
2025-04-12 18:55:07 -07:00
nadena.dev release bot
59c256704b Release 1.13.0-alpha.1 2025-04-10 03:29:38 +00:00
bd_
c4f3728d5e chore: update changelog for stable release 2025-04-09 20:24:51 -07:00
bd_
dcda15569a
fix: merge blend tree does not correct parameter type conflicts (#1552) 2025-04-09 20:05:48 -07:00
bd_
8cba3560ce
fix: reactive object could generate inconsistent WD results (#1553) 2025-04-09 20:00:40 -07:00
bd_
17051419ec
change: force blend tree-only layers to WD ON (#1551)
Closes: #1545
2025-04-09 19:14:44 -07:00
dependabot[bot]
1a1cae4e04
chore(deps): bump actions/create-github-app-token in /.github/workflows (#1546)
Bumps [actions/create-github-app-token](https://github.com/actions/create-github-app-token) from 1 to 2.
- [Release notes](https://github.com/actions/create-github-app-token/releases)
- [Commits](https://github.com/actions/create-github-app-token/compare/v1...v2)

---
updated-dependencies:
- dependency-name: actions/create-github-app-token
  dependency-version: '2'
  dependency-type: direct:production
  update-type: version-update:semver-major
...

Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
2025-04-09 19:07:03 -07:00
dependabot[bot]
e5e4c41b38
chore(deps): bump estree-util-value-to-estree in /docs~ (#1548)
Bumps [estree-util-value-to-estree](https://github.com/remcohaszing/estree-util-value-to-estree) from 3.1.2 to 3.3.3.
- [Release notes](https://github.com/remcohaszing/estree-util-value-to-estree/releases)
- [Commits](https://github.com/remcohaszing/estree-util-value-to-estree/compare/v3.1.2...v3.3.3)

---
updated-dependencies:
- dependency-name: estree-util-value-to-estree
  dependency-version: 3.3.3
  dependency-type: indirect
...

Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
2025-04-09 19:06:56 -07:00
nadena.dev release bot
c7c9e23acb Release 1.13.0-alpha.0 2025-04-08 01:34:44 +00:00
bd_
5be1f13840
feat: platform support declarations (#1547) 2025-04-07 18:29:26 -07:00
66 changed files with 2394 additions and 101 deletions

View File

@ -4,7 +4,7 @@
"version": "3.7.4"
},
"nadena.dev.ndmf": {
"version": "1.7.4"
"version": "1.8.0-alpha.4"
}
},
"locked": {
@ -19,7 +19,7 @@
"dependencies": {}
},
"nadena.dev.ndmf": {
"version": "1.7.4"
"version": "1.8.0-alpha.4"
}
}
}

View File

@ -56,7 +56,7 @@ jobs:
run: echo "$GITHUB_CONTEXT"
# https://github.com/orgs/community/discussions/13836#discussioncomment-8535364
- uses: actions/create-github-app-token@v1
- uses: actions/create-github-app-token@v2
id: app-token
with:
app-id: ${{ vars.RELEASER_APP_ID }}
@ -218,7 +218,7 @@ jobs:
cat .github/release-note.md
- name: Make Release
uses: softprops/action-gh-release@c95fe1489396fe8a9eb87c0abf8aa5b2ef267fda
uses: softprops/action-gh-release@da05d552573ad5aba039eaac05058a918a7bf631
if: ${{ github.event.inputs.publish == 'true' }}
with:
draft: true

View File

@ -19,6 +19,31 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0
### Deprecated
## [1.13.0-alpha.2] - [2025-04-14]
### Fixed
- [#1558] Merge AnimatorでベースアバターのArmature内のTransformをアニメーションさせると壊れる問題を修正
## [1.13.0-alpha.1] - [2025-04-10]
### Fixed
- [#1552] Merge Blend Treeにて、メインアバターFXレイヤーと同じ名前のintやboolパラメーターがBlend Treeに含まれている場合、
パラメーター型が修正されない問題を修正
- [#1553] リアクティブコンポーネントが生成するステートに、WD設定が正しくない問題を修正
- [#1555] VRC Animator Play Audioが、Audio Sourceまでの絶対パスで設定されている場合に、相対パスのMerge Animator
コンポーネントとマージされた場合、指定されたオブジェクトが存在しないことを検出し、参照を絶対パスとして扱うように修正
- 対象のパスにオブジェクトがある場合は、相対パスとして扱われます。安定性向上のためMerge Animatorコンポーネントと同じ
 指定方法を使用することをお勧めします。
### Changed
- [#1551] Merge Animatorは、遷移のない単一のstateを持つブレンドツリーのレイヤーに対して常にWDをONに設定します。
- 一部、以前の挙動に依存したアセットとの互換性を向上させるための変更です。
## [1.13.0-alpha.0] - [2025-04-08]
### Added
- (実験的機能) VRC以外のプラットフォームのサポートを有効化
## [1.12.3] - [2025-04-05]
### Fixed

View File

@ -19,6 +19,33 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0
### Deprecated
## [1.13.0-alpha.2] - [2025-04-14]
### Fixed
- [#1558] Fixed an issue where Merge Animators animating transforms in the base avatar's armature would break.
## [1.13.0-alpha.1] - [2025-04-10]
### Fixed
- [#1552] Merge Blend Tree failed to correct parameter types when the main avatar FX layer contained an int or bool
parameter with the same name as one used in the blend tree.
- [#1553] Reactive components might generate states with incorrect write default settings
- [#1555] Fixed compatibility regression from 1.11.x: VRC Animator Play Audio, when configured with an absolute path
but merged with a relative-path merge animator component, will now detect that the indicated object does not
exist, and treat the reference as an absolute path.
- Note that if there is an object in the target path, then it will be treated as a relative path. Using
addressing for Play Audio behaviors consistent with Merge Animator settings is therefore recommended as it will be
more robust.
### Changed
- [#1551] Merge Animator will always set WD ON for single-state blendtree layers with no any state transitions.
- This fixes compatibility issues with assets which relied on the prior behavior.
## [1.13.0-alpha.0] - [2025-04-08]
### Added
- (Experimental feature) Enabled support for non-VRC platforms
## [1.12.3] - [2025-04-05]
### Fixed

View File

@ -9,6 +9,7 @@ Modular Avatarの主な変更点をこのファイルで記録しています。
## [Unreleased]
### Added
- (実験的機能) VRC以外のプラットフォームのサポートを有効化
### Fixed
@ -20,6 +21,31 @@ Modular Avatarの主な変更点をこのファイルで記録しています。
### Deprecated
## [1.12.5] - [2025-04-14]
### Fixed
- [#1555] VRC Animator Play Audioが、Audio Sourceまでの絶対パスで設定されている場合に、相対パスのMerge Animator
コンポーネントとマージされた場合、指定されたオブジェクトが存在しないことを検出し、参照を絶対パスとして扱うように修正
- 対象のパスにオブジェクトがある場合は、相対パスとして扱われます。安定性向上のためMerge Animatorコンポーネントと同じ
 指定方法を使用することをお勧めします。
- [#1558] Merge AnimatorでベースアバターのArmature内のTransformをアニメーションさせると壊れる問題を修正
- NDMFの依存バージョンを更新
- VRChat Avatar Descriptor内のレイヤーが重複している場合、すべてのアニメーターコンテンツが無視される問題を修正
- 起動時に発生する `NullReferenceException` を修正
- AnimationIndex内の `NullReferenceException` を修正
- アニメーションカーブのパスが複数回書き換えられると削除される問題を修正
## [1.12.4] - [2025-04-10]
### Fixed
- [#1552] Merge Blend Treeにて、メインアバターFXレイヤーと同じ名前のintやboolパラメーターがBlend Treeに含まれている場合、
パラメーター型が修正されない問題を修正
- [#1553] リアクティブコンポーネントが生成するステートに、WD設定が正しくない問題を修正
### Changed
- [#1551] Merge Animatorは、遷移のない単一のstateを持つブレンドツリーのレイヤーに対して常にWDをONに設定します。
- 一部、以前の挙動に依存したアセットとの互換性を向上させるための変更です。
## [1.12.3] - [2025-04-05]
### Fixed

View File

@ -11,6 +11,7 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0
## [Unreleased]
### Added
- (Experimental feature) Enabled support for non-VRC platforms
### Fixed
@ -22,6 +23,34 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0
### Deprecated
## [1.12.5] - [2025-04-14]
### Fixed
- [#1555] Fixed compatibility regression from 1.11.x: VRC Animator Play Audio, when configured with an absolute path
but merged with a relative-path merge animator component, will now detect that the indicated object does not
exist, and treat the reference as an absolute path.
- Note that if there is an object in the target path, then it will be treated as a relative path. Using
addressing for Play Audio behaviors consistent with Merge Animator settings is therefore recommended as it will be
more robust.
- [#1558] Fixed an issue where Merge Animators animating transforms in the base avatar's armature would break.
- Update NDMF dependency
- Fixed an issue where duplicate layer entries in the VRChat Avatar Descriptor would cause all animator contents
to be ignored.
- Fixed a benign `NullReferenceException` at initialization
- Fixed a NullReferenceException in AnimationIndex
- Fixed an issue where animation curve paths being rewritten multiple times might be deleted
## [1.12.4] - [2025-04-10]
### Fixed
- [#1552] Merge Blend Tree failed to correct parameter types when the main avatar FX layer contained an int or bool
parameter with the same name as one used in the blend tree.
- [#1553] Reactive components might generate states with incorrect write default settings
### Changed
- [#1551] Merge Animator will always set WD ON for single-state blendtree layers with no any state transitions.
- This fixes compatibility issues with assets which relied on the prior behavior.
## [1.12.3] - [2025-04-05]
### Fixed
@ -31,6 +60,7 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0
- [#1542] Merge Animator now will match WD settings for layers with a single state containing an animation clip,
but not if it contains a blend tree. This fixes some compatibility issues introduced in 1.12 (where the behavior
was changed to not match WD settings for single-state animation clips).
- [#1551] Merge Animator will always set WD ON for single-state blendtree layers with no any state transitions.
## [1.12.2] - [2025-04-03]

View File

@ -0,0 +1,46 @@
#if MA_VRCSDK3_AVATARS
using System.Linq;
using nadena.dev.modular_avatar.core;
using nadena.dev.ndmf;
using nadena.dev.ndmf.animator;
using VRC.SDK3.Avatars.Components;
namespace nadena.dev.modular_avatar.animation
{
[RunsOnPlatforms(WellKnownPlatforms.VRChatAvatar30)]
public class FixupAbsolutePlayAudioPass : Pass<FixupAbsolutePlayAudioPass>
{
protected override void Execute(BuildContext context)
{
// Older versions of modular avatar did not adjust Animator Play Audio paths when they were absolute paths.
// Replicate this behavior here.
// Note that this runs before any object movement.
var asc = context.Extension<AnimatorServicesContext>();
foreach (var mama in context.AvatarRootTransform.GetComponentsInChildren<ModularAvatarMergeAnimator>(true))
{
if (!mama._wasRelative) continue;
var pathPrefix = asc.ObjectPathRemapper.GetVirtualPathForObject(mama.gameObject) + "/";
foreach (var state in asc.ControllerContext.Controllers[mama].AllReachableNodes()
.OfType<VirtualState>())
{
foreach (var behavior in state.Behaviours.OfType<VRCAnimatorPlayAudio>())
{
if (asc.ObjectPathRemapper.GetObjectForPath(behavior.SourcePath) != null) continue;
if (behavior.SourcePath.StartsWith(pathPrefix))
{
behavior.SourcePath = behavior.SourcePath.Substring(pathPrefix.Length);
}
}
}
}
}
}
}
#endif

View File

@ -0,0 +1,3 @@
fileFormatVersion: 2
guid: a763cbc4bac94063b6b084ea3f4d8206
timeCreated: 1744422528

View File

@ -23,6 +23,7 @@ namespace nadena.dev.modular_avatar.animation
internal HashSet<VirtualLayer> mmdAffectedOriginalLayers = new();
}
[RunsOnPlatforms(WellKnownPlatforms.VRChatAvatar30)]
internal class MMDRelayEarlyPass : Pass<MMDRelayEarlyPass>
{
protected override void Execute(BuildContext context)
@ -46,6 +47,7 @@ namespace nadena.dev.modular_avatar.animation
/// layer to relay this to layers which should be affected. Finally, any layer which _shouldn't_ be affected is
/// pushed out of the first three layers by injecting dummy layers.
/// </summary>
[RunsOnPlatforms(WellKnownPlatforms.VRChatAvatar30)]
internal class MMDRelayPass : Pass<MMDRelayPass>
{
private const string MMDRelayParam = "__MA/Internal/MMDNotActive";

View File

@ -13,6 +13,7 @@ using UnityEngine;
namespace nadena.dev.modular_avatar.core.editor
{
[RunsOnPlatforms(WellKnownPlatforms.VRChatAvatar30)]
internal class ApplyAnimatorDefaultValuesPass : Pass<ApplyAnimatorDefaultValuesPass>
{
protected override void Execute(ndmf.BuildContext context)

View File

@ -76,8 +76,11 @@
"merge_animator.match_avatar_write_defaults.tooltip": "使用与 Avatar 一样的 Write Defaults 设置。\n如果 Avatar 将 WD 混用Animator 的 WD 设置将维持不变。",
"merge_animator.relative_path_root": "相对路径根对象",
"merge_animator.relative_path_root.tooltip": "解析相对路径时使用的根对象。\n如果未指定则使用当前对象。",
"merge_animator.layer_priority": "Animator layer 的合并优先级",
"merge_animator.layer_priority": "Animator Layer 的合并优先级",
"merge_animator.layer_priority.tooltip": "控制动画层合并后在 Animator 里的位置,\n由小到大。负值将合并于原有动画层之前\n0 或正值将合并于之后。",
"merge_animator.merge_mode": "合并模式",
"merge_animator.merge_mode.Append": "追加到 Animator Controller",
"merge_animator.merge_mode.Replace": "替换现有 Animator Controller",
"merge_armature.lockmode": "位置同步模式",
"merge_armature.lockmode.not_locked.title": "不同步",
"merge_armature.lockmode.not_locked.body": "当前对象的骨骼不会和 Avatar 的骨骼位置同步。",
@ -93,6 +96,7 @@
"merge_armature.reset_pos.execute": "执行!",
"merge_armature.reset_pos.heuristic_scale": "根据 Avatar 调整服装的整体比例",
"merge_armature.reset_pos.heuristic_scale.tooltip": "以臂展作为参考,调整服装的整体比例。\n推荐用于不适配当前 Avatar 的服装。",
"merge_blend_tree.motion": "要合并的动画(或 BlendTree",
"merge_blend_tree.path_mode": "路径模式",
"merge_blend_tree.path_mode.tooltip": "在动画中路径的工作模式。\n使用相对路径可以让你在当前对象上录制动画。",
"merge_blend_tree.relative_path_root": "相对路径根对象",
@ -153,6 +157,8 @@
"error.replace_object.replacing_replacement": "[MA-0009] 不能在多个 Replace Object 组件中指定相同的目标对象",
"error.replace_object.parent_of_target": "[MA-0010] 目标对象不能是此对象的父级",
"error.singleton": "[MA-0011] 一个 Avatar 中只允许存在一个 {0} 组件",
"error.merge_animator.multiple_replacements": "[MA-0012] 多个 Merge Animator 正在尝试替换相同的 Layer",
"error.merge_animator.multiple_replacements:hint": "由于 Merge Animator 的“替换”模式会将整个 Animator Controller 替换为另一个 Animator Controller因此无法确定你要保留哪一个。请尝试只保留一个使用“替换”模式的 Merge Animator或将它们设置为“追加”模式。",
"validation.blendshape_sync.no_local_renderer": "[MA-1000] 在此部件上找不到 Renderer",
"validation.blendshape_sync.no_local_renderer:hint": "Blendshape Sync 作用于所在对象上的 Skinned Mesh Renderer。你是否将它附加到了正确的对象上",
"validation.blendshape_sync.no_local_mesh": "[MA-1001] 在此部件的 Renderer 上找不到网格Mesh",
@ -292,5 +298,6 @@
"sync-param-sequence.parameters": "共用参数的 Asset",
"sync-param-sequence.parameters.tooltip": "用于存储共用参数的 Assets。请勿使用已经在 Avatar descriptor 中设置的相同参数 。",
"sync-param-sequence.create-asset": "新增",
"sync-param-sequence.create-asset.tooltip": "创建一个新的 expression parameters"
"sync-param-sequence.create-asset.tooltip": "创建一个新的 Expression Parameters",
"platform.vrchat.settings.mmd_world_support": "MMD 世界支持"
}

View File

@ -3,10 +3,10 @@
"test0.test_b": "test_b",
"boneproxy.foldout.advanced": "進階設定",
"boneproxy.target": "目標",
"menuinstall.help.hint_set_menu": " Prefab 的選單預設會安裝到 Avatar 的頂部選單中。如果不需要可以選擇其他選單或取消勾選此元件。",
"menuinstall.help.hint_bad_menu": "選擇的選單不屬於此 Avatar。",
"menuinstall.installto": "安裝",
"menuinstall.installto.tooltip": "當前 Prefab 的選單將會安裝此選單",
"menuinstall.help.hint_set_menu": "預設會將此 Prefab 安裝到 Avatar 的頂層選單中。若不需要,請選擇其他選單或取消啟用此元件。",
"menuinstall.help.hint_bad_menu": "選取的選單資源不屬於此 Avatar。",
"menuinstall.installto": "安裝",
"menuinstall.installto.tooltip": "當前 Prefab 的選單將會安裝此選單",
"menuinstall.selectmenu": "選擇選單",
"menuinstall.showcontents": "顯示選單內容",
"menuinstall.showcontents.notselected": "未選擇選單",
@ -28,7 +28,7 @@
"params.synced": "同步",
"params.default": "預設值",
"params.fieldname": "字段名",
"params.remapto": "字段名映射到",
"params.remapto": "重新命名為",
"params.remapto.tooltip": "輸入新的名稱以防止參數名稱衝突",
"params.devmode": "顯示 Prefab 開發者選項",
"params.__comment1__": "=== Unity 2022 only strings ===",
@ -40,20 +40,20 @@
"merge_parameter.ui.defaultValue": "預設值",
"merge_parameter.ui.defaultValue.tooltip": "首次使用或重置 Avatar 時,參數將被設定為此值",
"merge_parameter.ui.saved": "保存",
"merge_parameter.ui.saved.tooltip": "如果為打勾,更換 Avatar 或房間時,參數的值將被保存。",
"merge_parameter.ui.saved.tooltip": "若啟用,更換 Avatar 或房間時,參數的值將被保存。",
"merge_parameter.ui.internalParameter": "自動重命名",
"merge_parameter.ui.internalParameter.tooltip": "如果為打勾,參數將會自動重命名以防止名稱和其他參數衝突",
"merge_parameter.ui.internalParameter.tooltip": "若啟用,參數將會自動重命名以防止名稱和其他參數衝突",
"merge_parameter.ui.isPrefix": "是 PhysBone 前綴",
"merge_parameter.ui.syncType": "參數類型",
"merge_parameter.ui.synced": "同步",
"merge_parameter.ui.synced.tooltip": "如果為打勾,參數將會在網路上同步",
"merge_parameter.ui.unregistered_foldout": "未註冊參數",
"merge_parameter.ui.synced.tooltip": "若啟用,參數將會在網路上同步",
"merge_parameter.ui.unregistered_foldout": "未註冊參數",
"merge_parameter.ui.add_button": "添加",
"merge_parameter.ui.details": "參數設定",
"merge_parameter.ui.overrideAnimatorDefaults": "覆 Animator 預設值",
"merge_parameter.ui.overrideAnimatorDefaults": "覆 Animator 預設值",
"merge_parameter.ui.importFromAsset": "從 Assets 匯入",
"merge_armature.merge_target": "合併目標",
"merge_armature.merge_target.tooltip": "當前物件要合併到的骨架(或其子級)",
"merge_armature.merge_target.tooltip": "要將此物件合併進去的骨架(或其子級)",
"merge_armature.prefix": "骨骼前綴",
"merge_armature.prefix.tooltip": "當前物件裡要合併的骨骼的前綴",
"merge_armature.suffix": "骨骼後綴",
@ -61,9 +61,9 @@
"merge_armature.locked": "鎖定位置",
"merge_armature.locked.tooltip": "將當前物件的骨架與合併目標的骨架鎖定(反之亦然),常用於創建動畫。",
"merge_armature.adjust_names": "根據合併目標調整骨骼名稱",
"merge_armature.adjust_names.tooltip": "根據合併目標調整骨骼名稱,常用於與非 Avatar 對應的服裝。",
"merge_armature.mangle_names": "避免名衝突",
"merge_armature.mangle_names.tooltip": "通過重新命名新添加的骨骼來避免與其他資源發生命名衝突。",
"merge_armature.adjust_names.tooltip": "根據合併目標調整骨骼名稱,常用於服裝移植。",
"merge_armature.mangle_names": "避免衝突",
"merge_armature.mangle_names.tooltip": "重新命名新骨骼以避免與其他資源命名衝突。",
"path_mode.Relative": "相對路徑(基於當前物件)",
"path_mode.Absolute": "絕對路徑(基於 Avatar 的根)",
"merge_animator.animator": "要合併的 Animator",
@ -78,6 +78,9 @@
"merge_animator.relative_path_root.tooltip": "解析相對路徑時使用的根物件。\n如果未指定則使用當前物件。",
"merge_animator.layer_priority": "動畫層優先級",
"merge_animator.layer_priority.tooltip": "控制動畫層合併後在 Animator 裡的位置,\n由小到大。負值將合併於原有動畫層之前\n0 或正值將合併於之後。",
"merge_animator.merge_mode": "合併模式",
"merge_animator.merge_mode.Append": "追加至 Animator",
"merge_animator.merge_mode.Replace": "替換現有 Animator",
"merge_armature.lockmode": "位置同步模式",
"merge_armature.lockmode.not_locked.title": "不同步",
"merge_armature.lockmode.not_locked.body": "當前物件的骨骼不會和 Avatar 的骨骼位置同步。",
@ -93,15 +96,16 @@
"merge_armature.reset_pos.execute": "執行",
"merge_armature.reset_pos.heuristic_scale": "根據 Avatar 調整服裝的整體比例",
"merge_armature.reset_pos.heuristic_scale.tooltip": "以臂展作為參考,調整服裝的整體比例。\n推薦用於非 Avatar 對應的服裝。",
"merge_blend_tree.motion": "要合併的動畫或 Blend Tree",
"merge_blend_tree.path_mode": "路徑模式",
"merge_blend_tree.path_mode.tooltip": "在動畫中路徑的工作模式。\n使用相對路徑可以讓你在當前物件上錄制動畫。",
"merge_blend_tree.relative_path_root": "相對路徑根物件",
"merge_blend_tree.relative_path_root.tooltip": "解析相對路徑時使用的根物件。\n如果未指定則使用當前物件。",
"worldfixed.quest": "此元件未生效,因為它與 Android 環境不相容。",
"worldfixed.quest": "此元件與 Android 環境不相容,將不會生效。",
"worldfixed.normal": "當前物件將會固定於世界,除非你使用約束將它綁在 Avatar 內。",
"fpvisible.normal": "當前物件將在第一人稱視角中可見。",
"fpvisible.NotUnderHead": "此元件在未放置於 Head 骨骼下時不會生效。\n如果是透過 Bone Proxy 等方式將其放於 Head 骨骼下,則可忽略此警告。",
"fpvisible.quest": "此元件未生效,因為它與 Android 環境不相容。",
"fpvisible.NotUnderHead": "此元件未放置於 Head 骨骼下時將無效。\n如果是透過 Bone Proxy 等方式將其放於 Head 骨骼下,則可忽略此警告。",
"fpvisible.quest": "此元件與 Android 環境不相容,將不會生效。",
"fpvisible.InPhysBoneChain": "當前物件由 Physics Bone 控制,可能無法在第一人稱視角中可見;請指定 Physics Bone 鏈的起點。",
"blendshape.mesh": "網格",
"blendshape.source": "源 blendshape",
@ -130,7 +134,7 @@
"mesh_settings.inherit_mode.SetOrInherit": "父級設定優先,否則指定",
"pb_blocker.help": "當前物件不會受到附加在父物件的 PhysBones 影響。",
"hint.bad_vrcsdk": "檢測到不相容的 VRCSDK 版本。\n\n請嘗試升級 VRCSDK如果這不起作用請嘗試新版本的 Modular Avatar。",
"error.stack_trace": "Stack trace報告錯誤時請提供此資訊!)",
"error.stack_trace": "Stack trace回報錯誤時請附上此資訊!)",
"error.merge_armature.circular_dependency": "[MA-0001] 在 Merge armature 中存在循環引用",
"error.merge_armature.circular_dependency:description": "你的 Merge Armature 元件正在將自身或其子級作為合併目標。",
"error.merge_armature.circular_dependency:hint": "通常應在 Merge Armature 的合併目標欄位指定 Avatar 本身的 Armture。不要指定服裝本身",
@ -153,6 +157,8 @@
"error.replace_object.replacing_replacement": "[MA-0009] 不能在多個 Replace Object 元件中指定相同的目標物件",
"error.replace_object.parent_of_target": "[MA-0010] 目標物件不能是此物件的父級",
"error.singleton": "[MA-0011] 在一個 Avatar 中只允許存在單個 {0} 元件",
"error.merge_animator.multiple_replacements": "[MA-0012] 多個 Merge Animators 嘗試替換同個動畫層",
"error.merge_animator.multiple_replacements:hint": "由於 Merge Animator 的「替換」模式會將整個 Animator 替換為另一個 Animator因此無法確定你要保留哪一個。請嘗試只保留其中一個使用「替換」模式的 Merge Animator或將它們設為「追加」模式。",
"validation.blendshape_sync.no_local_renderer": "[MA-1000] 在此物件上找不到 Renderer",
"validation.blendshape_sync.no_local_renderer:hint": "Blendshape Sync 作用於所在物件上的 Skinned Mesh Renderer。你是否將它附加到正確的物件上",
"validation.blendshape_sync.no_local_mesh": "[MA-1001] 在此物件的 Renderer 上找不到網格Mesh",
@ -202,11 +208,11 @@
"menuitem.prop.source_override": "源物件",
"menuitem.prop.source_override.tooltip": "如果指定,這個物件將被用作子選單內容的來源。\n否則將使用此選單項的子級。",
"menuitem.prop.is_default": "預設啟用",
"menuitem.prop.is_default.tooltip": "如果打勾,初次使用或重置 Avatar 時會啟用此選單項",
"menuitem.prop.is_default.tooltip": "若啟用,初次使用或重置 Avatar 時會啟用此選單項",
"menuitem.prop.is_saved": "保存",
"menuitem.prop.is_saved.tooltip": "如果打勾,當您更換 Avatar 或房間時,此選單項的值將被保存。",
"menuitem.prop.is_saved.tooltip": "若啟用,當您更換 Avatar 或房間時,此選單項的值將被保存。",
"menuitem.prop.is_synced": "同步",
"menuitem.prop.is_synced.tooltip": "如果打勾,此選單項的值將和網路上的其他玩家同步。",
"menuitem.prop.is_synced.tooltip": "若啟用,此選單項的值將和網路上的其他玩家同步。",
"menuitem.param.rotation": "參數: 旋轉 (Rotation)",
"menuitem.param.rotation.tooltip": "基於此選單項的旋轉設定的參數。",
"menuitem.param.horizontal": "參數: 水平 (Horizontal)",
@ -226,9 +232,9 @@
"control_group.foldout.actions": "Actions",
"control_group.foldout.menu_items": "相關選單項",
"control_group.is_saved": "保存",
"control_group.is_saved.tooltip": "如果打勾,當您更換 Avatar 或世界時,此選單項的值將被保存。",
"control_group.is_saved.tooltip": "若啟用,當您更換 Avatar 或世界時,此選單項的值將被保存。",
"control_group.is_synced": "同步",
"control_group.is_synced.tooltip": "如果打勾,此選單項的值將和網路上的其他玩家同步。",
"control_group.is_synced.tooltip": "若啟用,此選單項的值將和網路上的其他玩家同步。",
"control_group.default_value": "初始設定",
"control_group.default_value.unset": "(未選擇)",
"animation_gen.duplicate_binding": "來自不同控制群組的控制項嘗試動畫相同的參數。參數:{0}",
@ -291,5 +297,6 @@
"sync-param-sequence.parameters": "共用的參數資源",
"sync-param-sequence.parameters.tooltip": "用來儲存共用參數的資源檔。請勿使用已在 Avatar Descriptor 中設定的相同參數。",
"sync-param-sequence.create-asset": "新增",
"sync-param-sequence.create-asset.tooltip": "創建一個新的 Expression Parameters"
"sync-param-sequence.create-asset.tooltip": "創建一個新的 Expression Parameters",
"platform.vrchat.settings.mmd_world_support": "MMD 世界支援"
}

View File

@ -114,19 +114,27 @@ namespace nadena.dev.modular_avatar.core.editor
// We'll now continue processing the rest as normal.
}
var writeDefaults = AnalyzeLayerWriteDefaults(controller);
foreach (var component in sorted)
{
MergeSingle(context, controller, component, writeDefaults);
}
}
internal static bool? AnalyzeLayerWriteDefaults(VirtualAnimatorController controller)
{
bool? writeDefaults = null;
var wdStateCounter = controller.Layers.SelectMany(l => l.StateMachine.AllStates())
var wdStateCounter = controller.Layers
.Where(l => !IsWriteDefaultsSafeLayer(l))
.SelectMany(l => l.StateMachine.AllStates())
.Select(s => s.WriteDefaultValues)
.GroupBy(b => b)
.ToDictionary(g => g.Key, g => g.Count());
if (wdStateCounter.Count == 1) writeDefaults = wdStateCounter.First().Key;
foreach (var component in sorted)
{
MergeSingle(context, controller, component, writeDefaults);
}
return writeDefaults;
}
private void MergeSingle(BuildContext context, VirtualAnimatorController targetController,
@ -141,7 +149,7 @@ namespace nadena.dev.modular_avatar.core.editor
{
initialWriteDefaults = null;
}
var vac = context.PluginBuildContext.Extension<VirtualControllerContext>();
if (!vac.Controllers.TryGetValue(merge, out var clonedController)) return;
@ -160,6 +168,15 @@ namespace nadena.dev.modular_avatar.core.editor
}
}
if (l.StateMachine?.DefaultState?.Motion is VirtualBlendTree
&& l.StateMachine.States.Count == 1
&& l.StateMachine.StateMachines.Count == 0
&& l.StateMachine.AnyStateTransitions.Count == 0)
{
// Force WD on for single state blendtree layers
l.StateMachine.DefaultState.WriteDefaultValues = true;
}
targetController.AddLayer(new LayerPriority(merge.layerPriority), l);
}
@ -199,7 +216,7 @@ namespace nadena.dev.modular_avatar.core.editor
Object.DestroyImmediate(merge);
}
private bool IsWriteDefaultsSafeLayer(VirtualLayer virtualLayer)
private static bool IsWriteDefaultsSafeLayer(VirtualLayer virtualLayer)
{
if (virtualLayer.BlendingMode == AnimatorLayerBlendingMode.Additive) return true;
var sm = virtualLayer.StateMachine;

View File

@ -164,9 +164,12 @@ namespace nadena.dev.modular_avatar.core.editor
{
var newPath = GetReplacementPath(binding.path);
var newBinding = EditorCurveBinding.FloatCurve(newPath, binding.type, binding.propertyName);
clip.SetFloatCurve(newBinding, clip.GetFloatCurve(binding));
clip.SetFloatCurve(binding, null);
if (newPath != binding.path)
{
var newBinding = EditorCurveBinding.FloatCurve(newPath, binding.type, binding.propertyName);
clip.SetFloatCurve(newBinding, clip.GetFloatCurve(binding));
clip.SetFloatCurve(binding, null);
}
}
}
}

View File

@ -16,6 +16,7 @@ using Object = UnityEngine.Object;
namespace nadena.dev.modular_avatar.core.editor
{
[RunsOnPlatforms(WellKnownPlatforms.VRChatAvatar30)]
internal class MergeBlendTreePass : Pass<MergeBlendTreePass>
{
internal const string ALWAYS_ONE = "__ModularAvatarInternal/One";
@ -64,14 +65,31 @@ namespace nadena.dev.modular_avatar.core.editor
foreach (var name in _parameterNames)
{
if (fx.Parameters.ContainsKey(name)) continue;
fx.Parameters = fx.Parameters.SetItem(name, new AnimatorControllerParameter()
if (fx.Parameters.TryGetValue(name, out var existingParameter))
{
name = name,
type = AnimatorControllerParameterType.Float,
defaultFloat = 0.0f
});
switch (existingParameter.type)
{
case AnimatorControllerParameterType.Bool:
existingParameter.defaultFloat = existingParameter.defaultBool ? 1 : 0;
break;
case AnimatorControllerParameterType.Int:
existingParameter.defaultFloat = existingParameter.defaultInt;
break;
}
existingParameter.type = AnimatorControllerParameterType.Float;
}
else
{
existingParameter = new AnimatorControllerParameter
{
name = name,
type = AnimatorControllerParameterType.Float,
defaultFloat = 0.0f
};
}
fx.Parameters = fx.Parameters.SetItem(name, existingParameter);
}
}

View File

@ -22,13 +22,14 @@
* SOFTWARE.
*/
using System;
using System.Collections.Generic;
using System.Linq;
using JetBrains.Annotations;
using nadena.dev.modular_avatar.animation;
using nadena.dev.modular_avatar.editor.ErrorReporting;
using nadena.dev.ndmf.animator;
using UnityEngine;
using Object = UnityEngine.Object;
namespace nadena.dev.modular_avatar.core.editor
{
@ -158,7 +159,7 @@ namespace nadena.dev.modular_avatar.core.editor
// Remap any animation clips that reference this bone into its parent
_pathRemapper.ReplaceObject(sourceBone.gameObject, sourceBone.transform.parent.gameObject);
UnityEngine.Object.DestroyImmediate(sourceBone.gameObject);
Object.DestroyImmediate(sourceBone.gameObject);
}
}
}
@ -185,7 +186,7 @@ namespace nadena.dev.modular_avatar.core.editor
public Mesh Retarget()
{
var avatarTransform = RuntimeUtil.FindAvatarTransformInParents(renderer.transform);
if (avatarTransform == null) throw new System.Exception("Could not find avatar in parents of " + renderer.name);
if (avatarTransform == null) throw new Exception("Could not find avatar in parents of " + renderer.name);
var avPos = avatarTransform.position;
var avRot = avatarTransform.rotation;

View File

@ -14,6 +14,7 @@ using VRC.Dynamics;
namespace nadena.dev.modular_avatar.core.editor
{
[RunsOnPlatforms(WellKnownPlatforms.VRChatAvatar30)]
internal class ConstraintConverterPass : Pass<ConstraintConverterPass>
{
#if MA_VRCSDK3_AVATARS_3_7_0_OR_NEWER

View File

@ -5,6 +5,7 @@ using nadena.dev.ndmf;
namespace nadena.dev.modular_avatar.core.editor
{
[RunsOnPlatforms(WellKnownPlatforms.VRChatAvatar30)]
internal class PruneParametersPass : Pass<PruneParametersPass>
{
protected override void Execute(ndmf.BuildContext context)

View File

@ -19,6 +19,7 @@ using Object = UnityEngine.Object;
namespace nadena.dev.modular_avatar.core.editor.plugin
{
[RunsOnAllPlatforms]
class PluginDefinition : Plugin<PluginDefinition>
{
public override string QualifiedName => "nadena.dev.modular-avatar";
@ -58,9 +59,11 @@ namespace nadena.dev.modular_avatar.core.editor.plugin
#if MA_VRCSDK3_AVATARS
seq.Run(ReactiveObjectPrepass.Instance);
#endif
seq.WithRequiredExtension(typeof(AnimatorServicesContext), _s2 =>
{
#if MA_VRCSDK3_AVATARS
seq.Run(FixupAbsolutePlayAudioPass.Instance);
seq.Run(MMDRelayEarlyPass.Instance);
seq.Run(RenameParametersPluginPass.Instance);
seq.Run(ParameterAssignerPass.Instance);
@ -70,7 +73,8 @@ namespace nadena.dev.modular_avatar.core.editor.plugin
seq.WithRequiredExtension(typeof(ReadablePropertyExtension), _s3 =>
{
seq.Run("Shape Changer", ctx => new ReactiveObjectPass(ctx).Execute())
// TODO - refactor out VRChat-specific bits
seq.Run("Reactive Components", ctx => new ReactiveObjectPass(ctx).Execute())
.PreviewingWith(new ShapeChangerPreview(), new ObjectSwitcherPreview(),
new MaterialSetterPreview());
});
@ -82,26 +86,27 @@ namespace nadena.dev.modular_avatar.core.editor.plugin
seq.Run(MenuInstallPluginPass.Instance);
#endif
seq.Run(MergeArmaturePluginPass.Instance);
seq.Run(BoneProxyPluginPass.Instance);
#if MA_VRCSDK3_AVATARS
seq.Run(VisibleHeadAccessoryPluginPass.Instance);
#endif
seq.Run("World Fixed Object",
ctx => new WorldFixedObjectProcessor().Process(ctx)
);
seq.OnPlatforms(new[] { WellKnownPlatforms.VRChatAvatar30 }, _seq =>
{
seq.Run("World Fixed Object",
ctx => new WorldFixedObjectProcessor().Process(ctx)
);
});
seq.Run(WorldScaleObjectPass.Instance);
seq.Run(ReplaceObjectPluginPass.Instance);
#if MA_VRCSDK3_AVATARS
seq.Run(BlendshapeSyncAnimationPluginPass.Instance);
seq.Run(ConstraintConverterPass.Instance);
#endif
seq.Run(ConstraintConverterPass.Instance);
seq.Run("Prune empty animator layers",
ctx => { ctx.Extension<AnimatorServicesContext>().RemoveEmptyLayers(); });
seq.Run("Harmonize animator parameter types",
@ -111,10 +116,13 @@ namespace nadena.dev.modular_avatar.core.editor.plugin
});
#if MA_VRCSDK3_AVATARS
seq.Run(PhysbonesBlockerPluginPass.Instance);
seq.Run("Fixup Expressions Menu", ctx =>
seq.OnPlatforms(new[] { WellKnownPlatforms.VRChatAvatar30 }, _seq =>
{
var maContext = ctx.Extension<ModularAvatarContext>().BuildContext;
FixupExpressionsMenuPass.FixupExpressionsMenu(maContext);
seq.Run("Fixup Expressions Menu", ctx =>
{
var maContext = ctx.Extension<ModularAvatarContext>().BuildContext;
FixupExpressionsMenuPass.FixupExpressionsMenu(maContext);
});
});
seq.Run(SyncParameterSequencePass.Instance);
#endif
@ -212,6 +220,7 @@ namespace nadena.dev.modular_avatar.core.editor.plugin
}
}
[RunsOnPlatforms(WellKnownPlatforms.VRChatAvatar30)]
class MergeAnimatorPluginPass : MAPass<MergeAnimatorPluginPass>
{
protected override void Execute(ndmf.BuildContext context)
@ -220,6 +229,7 @@ namespace nadena.dev.modular_avatar.core.editor.plugin
}
}
[RunsOnPlatforms(WellKnownPlatforms.VRChatAvatar30)]
class MenuInstallPluginPass : MAPass<MenuInstallPluginPass>
{
protected override void Execute(ndmf.BuildContext context)
@ -246,6 +256,7 @@ namespace nadena.dev.modular_avatar.core.editor.plugin
}
#if MA_VRCSDK3_AVATARS
[RunsOnPlatforms(WellKnownPlatforms.VRChatAvatar30)]
class VisibleHeadAccessoryPluginPass : MAPass<VisibleHeadAccessoryPluginPass>
{
protected override void Execute(ndmf.BuildContext context)
@ -264,6 +275,7 @@ namespace nadena.dev.modular_avatar.core.editor.plugin
}
#if MA_VRCSDK3_AVATARS
[RunsOnPlatforms(WellKnownPlatforms.VRChatAvatar30)] // TODO - support other platforms
class BlendshapeSyncAnimationPluginPass : MAPass<BlendshapeSyncAnimationPluginPass>
{
protected override void Execute(ndmf.BuildContext context)
@ -271,7 +283,7 @@ namespace nadena.dev.modular_avatar.core.editor.plugin
new BlendshapeSyncAnimationProcessor(context).OnPreprocessAvatar();
}
}
class PhysbonesBlockerPluginPass : MAPass<PhysbonesBlockerPluginPass>
{
protected override void Execute(ndmf.BuildContext context)

View File

@ -40,13 +40,11 @@ namespace nadena.dev.modular_avatar.core.editor
// Having a WD OFF layer after WD ON layers can break WD. We match the behavior of the existing states,
// and if mixed, use WD ON to maximize compatibility.
var asc = context.Extension<AnimatorServicesContext>();
_writeDefaults = asc.ControllerContext.Controllers[VRCAvatarDescriptor.AnimLayerType.FX]?.Layers.Any(
l => l.StateMachine.StateMachines.Any(
sm => sm.StateMachine.AllStates().Any(
s => s.WriteDefaultValues && s.Motion is not VirtualBlendTree
)
)
) ?? true;
var fxLayer = asc.ControllerContext.Controllers[VRCAvatarDescriptor.AnimLayerType.FX];
if (fxLayer != null)
{
_writeDefaults = MergeAnimatorProcessor.AnalyzeLayerWriteDefaults(fxLayer) ?? true;
}
var analysis = new ReactiveObjectAnalyzer(context).Analyze(context.AvatarRootObject);

View File

@ -9,6 +9,7 @@ namespace nadena.dev.modular_avatar.core.editor
/// Reserve an animator layer for reactive object use. We do this here so that we can take advantage of MergeAnimator's
/// layer reference correction logic; this can go away once we have a more unified animation services API.
/// </summary>
[RunsOnPlatforms(WellKnownPlatforms.VRChatAvatar30)]
internal class ReactiveObjectPrepass : Pass<ReactiveObjectPrepass>
{
internal const string TAG_PATH = "__MA/ShapeChanger/PrepassPlaceholder";

View File

@ -12,6 +12,7 @@ using Object = UnityEngine.Object;
namespace nadena.dev.modular_avatar.core.editor
{
[RunsOnPlatforms(WellKnownPlatforms.VRChatAvatar30)]
public class SyncParameterSequencePass : Pass<SyncParameterSequencePass>
{
private static Platform? CurrentPlatform

View File

@ -4,6 +4,7 @@ using nadena.dev.ndmf;
namespace nadena.dev.modular_avatar.core.editor
{
[RunsOnPlatforms(WellKnownPlatforms.VRChatAvatar30)]
internal class VRChatSettingsPass : Pass<VRChatSettingsPass>
{
protected override void Execute(ndmf.BuildContext context)

View File

@ -12,6 +12,7 @@ using UnityEngine.Animations;
namespace nadena.dev.modular_avatar.core.editor
{
[RunsOnPlatforms(WellKnownPlatforms.VRChatAvatar30)]
internal class WorldScaleObjectPass : Pass<WorldScaleObjectPass>
{
protected override void Execute(ndmf.BuildContext context)

View File

@ -58,6 +58,8 @@ namespace nadena.dev.modular_avatar.core
public AvatarObjectReference relativePathRoot = new AvatarObjectReference();
public int layerPriority = 0;
public MergeAnimatorMode mergeAnimatorMode = MergeAnimatorMode.Append;
internal bool _wasRelative;
public override void ResolveReferences()
{
@ -88,7 +90,11 @@ namespace nadena.dev.modular_avatar.core
string IVirtualizeAnimatorController.GetMotionBasePath(object ndmfBuildContext, bool clearPath)
{
var path = GetMotionBasePathCallback(this, ndmfBuildContext);
if (clearPath) pathMode = MergeAnimatorPathMode.Absolute;
if (clearPath)
{
_wasRelative = _wasRelative || pathMode == MergeAnimatorPathMode.Relative;
pathMode = MergeAnimatorPathMode.Absolute;
}
return path;
}

View File

@ -141,6 +141,49 @@ namespace modular_avatar_tests
Assert.AreEqual(new[] {MergeBlendTreePass.BlendTreeLayerName, MMDRelayPass.ControlLayerName, MMDRelayPass.DummyLayerName, "m2", "Eyes", "FaceMood", "m1", "m3"}, layerNames);
}
[Test]
public void BoolParameterConvertedToFloat()
{
// Create an animator controller with a bool parameter
var controller = new AnimatorController();
controller.AddParameter("testBool", AnimatorControllerParameterType.Bool);
// Create the root object and set the FX layer to the created controller
var root = CreateRoot("root");
var vrcDesc = root.GetComponent<VRCAvatarDescriptor>();
var baseLayers = vrcDesc.baseAnimationLayers;
for (int i = 0; i < baseLayers.Length; i++)
{
if (baseLayers[i].type == VRCAvatarDescriptor.AnimLayerType.FX)
{
baseLayers[i].animatorController = controller;
baseLayers[i].isDefault = false;
}
}
vrcDesc.customizeAnimationLayers = true;
// Add a Merge Blend Tree component using the same parameter
var child = CreateChild(root, "child");
var mergeComponent = child.AddComponent<ModularAvatarMergeBlendTree>();
var blendTree = new BlendTree
{
blendParameter = "testBool",
blendType = BlendTreeType.Simple1D
};
blendTree.AddChild(AnimationTestUtil.AnimationWithPath("a"));
mergeComponent.BlendTree = blendTree;
// Process the avatar
AvatarProcessor.ProcessAvatar(root);
// Verify that the parameter is converted to a float
var fxController = FindController(root, VRCAvatarDescriptor.AnimLayerType.FX).animatorController as AnimatorController;
Assert.IsTrue(fxController!.parameters.Any(p =>
p.name == "testBool" && p.type == AnimatorControllerParameterType.Float));
}
ModularAvatarMergeAnimator TestMerge(GameObject root, string mergeName, Motion motion = null)
{

View File

@ -0,0 +1,103 @@
%YAML 1.1
%TAG !u! tag:unity3d.com,2011:
--- !u!1107 &-6982002469074649382
AnimatorStateMachine:
serializedVersion: 6
m_ObjectHideFlags: 1
m_CorrespondingSourceObject: {fileID: 0}
m_PrefabInstance: {fileID: 0}
m_PrefabAsset: {fileID: 0}
m_Name: absolute
m_ChildStates:
- serializedVersion: 1
m_State: {fileID: 5394444500086494115}
m_Position: {x: 330, y: 60, z: 0}
m_ChildStateMachines: []
m_AnyStateTransitions: []
m_EntryTransitions: []
m_StateMachineTransitions: {}
m_StateMachineBehaviours: []
m_AnyStatePosition: {x: 50, y: 20, z: 0}
m_EntryPosition: {x: 50, y: 120, z: 0}
m_ExitPosition: {x: 800, y: 120, z: 0}
m_ParentStateMachinePosition: {x: 800, y: 20, z: 0}
m_DefaultState: {fileID: 5394444500086494115}
--- !u!91 &9100000
AnimatorController:
m_ObjectHideFlags: 0
m_CorrespondingSourceObject: {fileID: 0}
m_PrefabInstance: {fileID: 0}
m_PrefabAsset: {fileID: 0}
m_Name: AbsoluteReference
serializedVersion: 5
m_AnimatorParameters: []
m_AnimatorLayers:
- serializedVersion: 5
m_Name: absolute
m_StateMachine: {fileID: -6982002469074649382}
m_Mask: {fileID: 0}
m_Motions: []
m_Behaviours: []
m_BlendingMode: 0
m_SyncedLayerIndex: -1
m_DefaultWeight: 0
m_IKPass: 0
m_SyncedLayerAffectsTiming: 0
m_Controller: {fileID: 9100000}
--- !u!114 &2414404072947734855
MonoBehaviour:
m_ObjectHideFlags: 1
m_CorrespondingSourceObject: {fileID: 0}
m_PrefabInstance: {fileID: 0}
m_PrefabAsset: {fileID: 0}
m_GameObject: {fileID: 0}
m_Enabled: 1
m_EditorHideFlags: 0
m_Script: {fileID: 1859411423, guid: 67cc4cb7839cd3741b63733d5adf0442, type: 3}
m_Name:
m_EditorClassIdentifier:
Source: {fileID: 0}
SourcePath: Bone Proxy/Audio Source
PlaybackOrder: 0
ParameterName:
Volume: {x: 1, y: 1}
VolumeApplySettings: 1
Pitch: {x: 1, y: 1}
PitchApplySettings: 1
Clips: []
ClipsApplySettings: 1
Loop: 0
LoopApplySettings: 1
DelayInSeconds: 0
PlayOnEnter: 1
StopOnEnter: 1
PlayOnExit: 0
StopOnExit: 0
playbackIndex: 0
--- !u!1102 &5394444500086494115
AnimatorState:
serializedVersion: 6
m_ObjectHideFlags: 1
m_CorrespondingSourceObject: {fileID: 0}
m_PrefabInstance: {fileID: 0}
m_PrefabAsset: {fileID: 0}
m_Name: New State
m_Speed: 1
m_CycleOffset: 0
m_Transitions: []
m_StateMachineBehaviours:
- {fileID: 2414404072947734855}
m_Position: {x: 50, y: 50, z: 0}
m_IKOnFeet: 0
m_WriteDefaultValues: 1
m_Mirror: 0
m_SpeedParameterActive: 0
m_MirrorParameterActive: 0
m_CycleOffsetParameterActive: 0
m_TimeParameterActive: 0
m_Motion: {fileID: 0}
m_Tag:
m_SpeedParameter:
m_MirrorParameter:
m_CycleOffsetParameter:
m_TimeParameter:

View File

@ -0,0 +1,8 @@
fileFormatVersion: 2
guid: 025d88351bb99eb4f8b38dbe071eaf2a
NativeFormatImporter:
externalObjects: {}
mainObjectFileID: 9100000
userData:
assetBundleName:
assetBundleVariant:

View File

@ -26,6 +26,11 @@ namespace modular_avatar_tests
var subState = layer.stateMachine.stateMachines[0].stateMachine.states[0].state;
var playAudio2 = (VRCAnimatorPlayAudio) subState.behaviours[0];
Assert.AreEqual("New Parent/Bone Proxy/Audio Source", playAudio2.SourcePath);
var absLayer = findFxLayer(prefab, "absolute");
state = absLayer.stateMachine.states[0].state;
playAudio = (VRCAnimatorPlayAudio) state.behaviours[0];
Assert.AreEqual("New Parent/Bone Proxy/Audio Source", playAudio.SourcePath);
}
}
}

View File

@ -335,6 +335,7 @@ GameObject:
m_Component:
- component: {fileID: 2374223349072045661}
- component: {fileID: 2173147159387031478}
- component: {fileID: 4651177154340700720}
m_Layer: 0
m_Name: Bone Proxy
m_TagString: Untagged
@ -373,6 +374,28 @@ MonoBehaviour:
boneReference: 55
subPath: New Parent
attachmentMode: 1
--- !u!114 &4651177154340700720
MonoBehaviour:
m_ObjectHideFlags: 0
m_CorrespondingSourceObject: {fileID: 0}
m_PrefabInstance: {fileID: 0}
m_PrefabAsset: {fileID: 0}
m_GameObject: {fileID: 6739982813768973813}
m_Enabled: 1
m_EditorHideFlags: 0
m_Script: {fileID: 11500000, guid: 1bb122659f724ebf85fe095ac02dc339, type: 3}
m_Name:
m_EditorClassIdentifier:
animator: {fileID: 9100000, guid: 025d88351bb99eb4f8b38dbe071eaf2a, type: 2}
layerType: 5
deleteAttachedAnimator: 1
pathMode: 0
matchAvatarWriteDefaults: 0
relativePathRoot:
referencePath:
targetObject: {fileID: 0}
layerPriority: 0
mergeAnimatorMode: 0
--- !u!1 &7552762365415873619
GameObject:
m_ObjectHideFlags: 0

View File

@ -1,5 +1,8 @@
#if MA_VRCSDK3_AVATARS
using System;
using System.Collections.Generic;
using System.Linq;
using modular_avatar_tests;
using nadena.dev.modular_avatar.animation;
using nadena.dev.modular_avatar.core;
@ -7,9 +10,11 @@ using nadena.dev.modular_avatar.core.editor;
using nadena.dev.ndmf;
using nadena.dev.ndmf.animator;
using NUnit.Framework;
using UnityEditor;
using UnityEditor.Animations;
using UnityEngine;
using VRC.SDK3.Avatars.Components;
using AvatarProcessor = nadena.dev.ndmf.AvatarProcessor;
using BuildContext = nadena.dev.ndmf.BuildContext;
namespace UnitTests.MergeAnimatorTests

View File

@ -322,7 +322,7 @@ AnimatorStateMachine:
m_CorrespondingSourceObject: {fileID: 0}
m_PrefabInstance: {fileID: 0}
m_PrefabAsset: {fileID: 0}
m_Name: X_BlendTree
m_Name: 1_BlendTree_InitialOff
m_ChildStates:
- serializedVersion: 1
m_State: {fileID: 5140747817625705091}
@ -359,6 +359,32 @@ AnimatorStateTransition:
m_InterruptionSource: 0
m_OrderedInterruption: 1
m_CanTransitionToSelf: 1
--- !u!1102 &-398412080201691195
AnimatorState:
serializedVersion: 6
m_ObjectHideFlags: 1
m_CorrespondingSourceObject: {fileID: 0}
m_PrefabInstance: {fileID: 0}
m_PrefabAsset: {fileID: 0}
m_Name: blendtree
m_Speed: 1
m_CycleOffset: 0
m_Transitions: []
m_StateMachineBehaviours: []
m_Position: {x: 50, y: 50, z: 0}
m_IKOnFeet: 0
m_WriteDefaultValues: 1
m_Mirror: 0
m_SpeedParameterActive: 0
m_MirrorParameterActive: 0
m_CycleOffsetParameterActive: 0
m_TimeParameterActive: 0
m_Motion: {fileID: 20600000, guid: f2beba729514fc94eb1a78f8340a8738, type: 2}
m_Tag:
m_SpeedParameter:
m_MirrorParameter:
m_CycleOffsetParameter:
m_TimeParameter:
--- !u!91 &9100000
AnimatorController:
m_ObjectHideFlags: 0
@ -412,7 +438,7 @@ AnimatorController:
m_SyncedLayerAffectsTiming: 0
m_Controller: {fileID: 9100000}
- serializedVersion: 5
m_Name: X_BlendTree
m_Name: 1_BlendTree_InitialOff
m_StateMachine: {fileID: -540454885725092262}
m_Mask: {fileID: 0}
m_Motions: []
@ -423,6 +449,18 @@ AnimatorController:
m_IKPass: 0
m_SyncedLayerAffectsTiming: 0
m_Controller: {fileID: 9100000}
- serializedVersion: 5
m_Name: 1_BlendTree_InitialOn
m_StateMachine: {fileID: 8678878570627476277}
m_Mask: {fileID: 0}
m_Motions: []
m_Behaviours: []
m_BlendingMode: 0
m_SyncedLayerIndex: -1
m_DefaultWeight: 0
m_IKPass: 0
m_SyncedLayerAffectsTiming: 0
m_Controller: {fileID: 9100000}
- serializedVersion: 5
m_Name: M_BlendTree_with_transitions
m_StateMachine: {fileID: -8503209154062428420}
@ -743,6 +781,28 @@ AnimatorStateMachine:
m_ExitPosition: {x: 800, y: 120, z: 0}
m_ParentStateMachinePosition: {x: 800, y: 20, z: 0}
m_DefaultState: {fileID: 2924615304351484976}
--- !u!1107 &8678878570627476277
AnimatorStateMachine:
serializedVersion: 6
m_ObjectHideFlags: 1
m_CorrespondingSourceObject: {fileID: 0}
m_PrefabInstance: {fileID: 0}
m_PrefabAsset: {fileID: 0}
m_Name: 1_BlendTree_InitialOn
m_ChildStates:
- serializedVersion: 1
m_State: {fileID: -398412080201691195}
m_Position: {x: 410, y: 80, z: 0}
m_ChildStateMachines: []
m_AnyStateTransitions: []
m_EntryTransitions: []
m_StateMachineTransitions: {}
m_StateMachineBehaviours: []
m_AnyStatePosition: {x: 50, y: 20, z: 0}
m_EntryPosition: {x: 50, y: 120, z: 0}
m_ExitPosition: {x: 800, y: 120, z: 0}
m_ParentStateMachinePosition: {x: 800, y: 20, z: 0}
m_DefaultState: {fileID: -398412080201691195}
--- !u!1101 &9087045955160975718
AnimatorStateTransition:
m_ObjectHideFlags: 1

View File

@ -164,7 +164,7 @@ AnimatorState:
m_StateMachineBehaviours: []
m_Position: {x: 50, y: 50, z: 0}
m_IKOnFeet: 0
m_WriteDefaultValues: 1
m_WriteDefaultValues: 0
m_Mirror: 0
m_SpeedParameterActive: 0
m_MirrorParameterActive: 0
@ -343,7 +343,7 @@ AnimatorController:
m_SyncedLayerAffectsTiming: 0
m_Controller: {fileID: 9100000}
- serializedVersion: 5
m_Name: X_BlendTree
m_Name: 1_BlendTree_InitialOff
m_StateMachine: {fileID: 8798472560561482739}
m_Mask: {fileID: 0}
m_Motions: []
@ -354,6 +354,18 @@ AnimatorController:
m_IKPass: 0
m_SyncedLayerAffectsTiming: 0
m_Controller: {fileID: 9100000}
- serializedVersion: 5
m_Name: 1_BlendTree_InitialOn
m_StateMachine: {fileID: 723720481014261193}
m_Mask: {fileID: 0}
m_Motions: []
m_Behaviours: []
m_BlendingMode: 0
m_SyncedLayerIndex: -1
m_DefaultWeight: 0
m_IKPass: 0
m_SyncedLayerAffectsTiming: 0
m_Controller: {fileID: 9100000}
- serializedVersion: 5
m_Name: M_BlendTree_with_transitions
m_StateMachine: {fileID: 6073696076277274403}
@ -402,6 +414,28 @@ AnimatorController:
m_IKPass: 0
m_SyncedLayerAffectsTiming: 0
m_Controller: {fileID: 9100000}
--- !u!1107 &723720481014261193
AnimatorStateMachine:
serializedVersion: 6
m_ObjectHideFlags: 1
m_CorrespondingSourceObject: {fileID: 0}
m_PrefabInstance: {fileID: 0}
m_PrefabAsset: {fileID: 0}
m_Name: 1_BlendTree_InitialOn
m_ChildStates:
- serializedVersion: 1
m_State: {fileID: 4331185042199677927}
m_Position: {x: 618.3097, y: -44.39499, z: 0}
m_ChildStateMachines: []
m_AnyStateTransitions: []
m_EntryTransitions: []
m_StateMachineTransitions: {}
m_StateMachineBehaviours: []
m_AnyStatePosition: {x: 50, y: 20, z: 0}
m_EntryPosition: {x: 50, y: 120, z: 0}
m_ExitPosition: {x: 800, y: 120, z: 0}
m_ParentStateMachinePosition: {x: 800, y: 20, z: 0}
m_DefaultState: {fileID: 4331185042199677927}
--- !u!206 &1172723464858944439
BlendTree:
m_ObjectHideFlags: 1
@ -491,6 +525,32 @@ AnimatorStateMachine:
m_ExitPosition: {x: 800, y: 120, z: 0}
m_ParentStateMachinePosition: {x: 800, y: 20, z: 0}
m_DefaultState: {fileID: -3889880041459077057}
--- !u!1102 &4331185042199677927
AnimatorState:
serializedVersion: 6
m_ObjectHideFlags: 1
m_CorrespondingSourceObject: {fileID: 0}
m_PrefabInstance: {fileID: 0}
m_PrefabAsset: {fileID: 0}
m_Name: blendtree
m_Speed: 1
m_CycleOffset: 0
m_Transitions: []
m_StateMachineBehaviours: []
m_Position: {x: 50, y: 50, z: 0}
m_IKOnFeet: 0
m_WriteDefaultValues: 1
m_Mirror: 0
m_SpeedParameterActive: 0
m_MirrorParameterActive: 0
m_CycleOffsetParameterActive: 0
m_TimeParameterActive: 0
m_Motion: {fileID: 20600000, guid: f2beba729514fc94eb1a78f8340a8738, type: 2}
m_Tag:
m_SpeedParameter:
m_MirrorParameter:
m_CycleOffsetParameter:
m_TimeParameter:
--- !u!1102 &5369915444104545634
AnimatorState:
serializedVersion: 6
@ -689,7 +749,7 @@ AnimatorStateMachine:
m_CorrespondingSourceObject: {fileID: 0}
m_PrefabInstance: {fileID: 0}
m_PrefabAsset: {fileID: 0}
m_Name: X_BlendTree
m_Name: 1_BlendTree_InitialOff
m_ChildStates:
- serializedVersion: 1
m_State: {fileID: -4604261159886404567}

View File

@ -63,6 +63,7 @@ namespace UnitTests.MergeAnimatorTests.WriteDefaults
break;
}
case 'X': expectedState = mergeAnimatorInitialState; break;
case '1': expectedState = true; break;
default: continue;
}

View File

@ -1,4 +1,5 @@
using System.Linq;
using System.Collections.Generic;
using System.Linq;
using modular_avatar_tests;
using nadena.dev.modular_avatar.core.editor;
using NUnit.Framework;
@ -7,6 +8,8 @@ using UnityEngine;
using ModularAvatarMergeArmature = nadena.dev.modular_avatar.core.ModularAvatarMergeArmature;
#if MA_VRCSDK3_AVATARS
using System;
using nadena.dev.modular_avatar.core;
using VRC.SDK3.Avatars.Components;
using VRC.SDK3.Dynamics.PhysBone.Components;
#endif
@ -100,6 +103,36 @@ public class MergeArmatureTests : TestBase
}
}
[Test]
public void RetainsTransformLookthroughTest()
{
var root = CreatePrefab("TransformLookthrough/RetainsTransformLookthroughCurves.prefab");
AvatarProcessor.ProcessAvatar(root);
var testLayer = findFxLayer(root, "test");
var motion = (AnimationClip)testLayer.stateMachine.defaultState.motion;
var subArmature = root.transform.GetChild(0).GetChild(0).GetChild(0);
var armaturePath = RuntimeUtil.AvatarRootPath(subArmature.gameObject);
var hipsPath = "Armature/Hips";
var curves = AnimationUtility.GetCurveBindings(motion)
.Select(ecb => (ecb.path, ecb.type, ecb.propertyName))
.ToHashSet();
var expectedCurves = new HashSet<(string, Type, string)>()
{
(armaturePath, typeof(GameObject), "m_IsActive"),
(hipsPath, typeof(Transform), "m_LocalScale.x"),
(hipsPath, typeof(Transform), "m_LocalScale.y"),
(hipsPath, typeof(Transform), "m_LocalScale.z"),
// It's not clear if we should be animating the root Armature object here, but this matches the pre-1.12
// behavior and is therefore probably best from a compatibility perspective
("Armature", typeof(GameObject), "m_IsActive")
};
Assert.That(expectedCurves, Is.EquivalentTo(curves));
}
#endif
private static GameObject LoadShapell()

View File

@ -0,0 +1,8 @@
fileFormatVersion: 2
guid: faccb10b1d8ed17468b90c521387216e
folderAsset: yes
DefaultImporter:
externalObjects: {}
userData:
assetBundleName:
assetBundleVariant:

View File

@ -0,0 +1,613 @@
%YAML 1.1
%TAG !u! tag:unity3d.com,2011:
--- !u!1 &1843281456015346592
GameObject:
m_ObjectHideFlags: 0
m_CorrespondingSourceObject: {fileID: 0}
m_PrefabInstance: {fileID: 0}
m_PrefabAsset: {fileID: 0}
serializedVersion: 6
m_Component:
- component: {fileID: 6463641812474994547}
m_Layer: 0
m_Name: Hips
m_TagString: Untagged
m_Icon: {fileID: 0}
m_NavMeshLayer: 0
m_StaticEditorFlags: 0
m_IsActive: 1
--- !u!4 &6463641812474994547
Transform:
m_ObjectHideFlags: 0
m_CorrespondingSourceObject: {fileID: 0}
m_PrefabInstance: {fileID: 0}
m_PrefabAsset: {fileID: 0}
m_GameObject: {fileID: 1843281456015346592}
serializedVersion: 2
m_LocalRotation: {x: 0, y: 0, z: 0, w: 1}
m_LocalPosition: {x: 0, y: 0, z: 0}
m_LocalScale: {x: 1, y: 1, z: 1}
m_ConstrainProportionsScale: 0
m_Children: []
m_Father: {fileID: 3374381971321939395}
m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0}
--- !u!1 &3758816284294005516
GameObject:
m_ObjectHideFlags: 0
m_CorrespondingSourceObject: {fileID: 0}
m_PrefabInstance: {fileID: 0}
m_PrefabAsset: {fileID: 0}
serializedVersion: 6
m_Component:
- component: {fileID: 1946172178019366251}
- component: {fileID: 2719738530465120336}
m_Layer: 0
m_Name: Hips
m_TagString: Untagged
m_Icon: {fileID: 0}
m_NavMeshLayer: 0
m_StaticEditorFlags: 0
m_IsActive: 1
--- !u!4 &1946172178019366251
Transform:
m_ObjectHideFlags: 0
m_CorrespondingSourceObject: {fileID: 0}
m_PrefabInstance: {fileID: 0}
m_PrefabAsset: {fileID: 0}
m_GameObject: {fileID: 3758816284294005516}
serializedVersion: 2
m_LocalRotation: {x: 0, y: 0, z: 0, w: 1}
m_LocalPosition: {x: 0, y: 0, z: 0}
m_LocalScale: {x: 1, y: 1, z: 1}
m_ConstrainProportionsScale: 0
m_Children: []
m_Father: {fileID: 8614448739494005333}
m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0}
--- !u!108 &2719738530465120336
Light:
m_ObjectHideFlags: 0
m_CorrespondingSourceObject: {fileID: 0}
m_PrefabInstance: {fileID: 0}
m_PrefabAsset: {fileID: 0}
m_GameObject: {fileID: 3758816284294005516}
m_Enabled: 1
serializedVersion: 10
m_Type: 2
m_Shape: 0
m_Color: {r: 1, g: 1, b: 1, a: 1}
m_Intensity: 1
m_Range: 10
m_SpotAngle: 30
m_InnerSpotAngle: 21.80208
m_CookieSize: 10
m_Shadows:
m_Type: 0
m_Resolution: -1
m_CustomResolution: -1
m_Strength: 1
m_Bias: 0.05
m_NormalBias: 0.4
m_NearPlane: 0.2
m_CullingMatrixOverride:
e00: 1
e01: 0
e02: 0
e03: 0
e10: 0
e11: 1
e12: 0
e13: 0
e20: 0
e21: 0
e22: 1
e23: 0
e30: 0
e31: 0
e32: 0
e33: 1
m_UseCullingMatrixOverride: 0
m_Cookie: {fileID: 0}
m_DrawHalo: 0
m_Flare: {fileID: 0}
m_RenderMode: 0
m_CullingMask:
serializedVersion: 2
m_Bits: 4294967295
m_RenderingLayerMask: 1
m_Lightmapping: 4
m_LightShadowCasterMode: 0
m_AreaSize: {x: 1, y: 1}
m_BounceIntensity: 1
m_ColorTemperature: 6570
m_UseColorTemperature: 0
m_BoundingSphereOverride: {x: 0, y: 0, z: 0, w: 0}
m_UseBoundingSphereOverride: 0
m_UseViewFrustumForShadowCasterCull: 1
m_ShadowRadius: 0
m_ShadowAngle: 0
--- !u!1 &4031479947288985074
GameObject:
m_ObjectHideFlags: 0
m_CorrespondingSourceObject: {fileID: 0}
m_PrefabInstance: {fileID: 0}
m_PrefabAsset: {fileID: 0}
serializedVersion: 6
m_Component:
- component: {fileID: 4831129360975791387}
- component: {fileID: 1311080927487844401}
- component: {fileID: 2689763916510653291}
m_Layer: 0
m_Name: Merge
m_TagString: Untagged
m_Icon: {fileID: 0}
m_NavMeshLayer: 0
m_StaticEditorFlags: 0
m_IsActive: 1
--- !u!4 &4831129360975791387
Transform:
m_ObjectHideFlags: 0
m_CorrespondingSourceObject: {fileID: 0}
m_PrefabInstance: {fileID: 0}
m_PrefabAsset: {fileID: 0}
m_GameObject: {fileID: 4031479947288985074}
serializedVersion: 2
m_LocalRotation: {x: 0, y: 0, z: 0, w: 1}
m_LocalPosition: {x: 0, y: 0, z: 0}
m_LocalScale: {x: 1, y: 1, z: 1}
m_ConstrainProportionsScale: 0
m_Children:
- {fileID: 8614448739494005333}
m_Father: {fileID: 7077471747533883274}
m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0}
--- !u!114 &1311080927487844401
MonoBehaviour:
m_ObjectHideFlags: 0
m_CorrespondingSourceObject: {fileID: 0}
m_PrefabInstance: {fileID: 0}
m_PrefabAsset: {fileID: 0}
m_GameObject: {fileID: 4031479947288985074}
m_Enabled: 1
m_EditorHideFlags: 0
m_Script: {fileID: 11500000, guid: 1bb122659f724ebf85fe095ac02dc339, type: 3}
m_Name:
m_EditorClassIdentifier:
animator: {fileID: 9100000, guid: 19d8bfd755e0f6b4581b4da4cfd2cc70, type: 2}
layerType: 5
deleteAttachedAnimator: 1
pathMode: 0
matchAvatarWriteDefaults: 0
relativePathRoot:
referencePath:
targetObject: {fileID: 0}
layerPriority: 0
mergeAnimatorMode: 0
--- !u!95 &2689763916510653291
Animator:
serializedVersion: 5
m_ObjectHideFlags: 0
m_CorrespondingSourceObject: {fileID: 0}
m_PrefabInstance: {fileID: 0}
m_PrefabAsset: {fileID: 0}
m_GameObject: {fileID: 4031479947288985074}
m_Enabled: 1
m_Avatar: {fileID: 0}
m_Controller: {fileID: 9100000, guid: 19d8bfd755e0f6b4581b4da4cfd2cc70, type: 2}
m_CullingMode: 0
m_UpdateMode: 0
m_ApplyRootMotion: 0
m_LinearVelocityBlending: 0
m_StabilizeFeet: 0
m_WarningMessage:
m_HasTransformHierarchy: 1
m_AllowConstantClipSamplingOptimization: 1
m_KeepAnimatorStateOnDisable: 0
m_WriteDefaultValuesOnDisable: 0
--- !u!1 &7548675428724350735
GameObject:
m_ObjectHideFlags: 0
m_CorrespondingSourceObject: {fileID: 0}
m_PrefabInstance: {fileID: 0}
m_PrefabAsset: {fileID: 0}
serializedVersion: 6
m_Component:
- component: {fileID: 8614448739494005333}
- component: {fileID: 5161307179301238676}
m_Layer: 0
m_Name: Armature.1
m_TagString: Untagged
m_Icon: {fileID: 0}
m_NavMeshLayer: 0
m_StaticEditorFlags: 0
m_IsActive: 1
--- !u!4 &8614448739494005333
Transform:
m_ObjectHideFlags: 0
m_CorrespondingSourceObject: {fileID: 0}
m_PrefabInstance: {fileID: 0}
m_PrefabAsset: {fileID: 0}
m_GameObject: {fileID: 7548675428724350735}
serializedVersion: 2
m_LocalRotation: {x: 0, y: 0, z: 0, w: 1}
m_LocalPosition: {x: 0, y: 0, z: 0}
m_LocalScale: {x: 1, y: 1, z: 1}
m_ConstrainProportionsScale: 0
m_Children:
- {fileID: 1946172178019366251}
m_Father: {fileID: 4831129360975791387}
m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0}
--- !u!114 &5161307179301238676
MonoBehaviour:
m_ObjectHideFlags: 0
m_CorrespondingSourceObject: {fileID: 0}
m_PrefabInstance: {fileID: 0}
m_PrefabAsset: {fileID: 0}
m_GameObject: {fileID: 7548675428724350735}
m_Enabled: 1
m_EditorHideFlags: 0
m_Script: {fileID: 11500000, guid: 2df373bf91cf30b4bbd495e11cb1a2ec, type: 3}
m_Name:
m_EditorClassIdentifier:
mergeTarget:
referencePath: Armature
targetObject: {fileID: 8076956779391437068}
prefix:
suffix:
legacyLocked: 0
LockMode: 2
mangleNames: 1
--- !u!1 &8076956779391437068
GameObject:
m_ObjectHideFlags: 0
m_CorrespondingSourceObject: {fileID: 0}
m_PrefabInstance: {fileID: 0}
m_PrefabAsset: {fileID: 0}
serializedVersion: 6
m_Component:
- component: {fileID: 3374381971321939395}
m_Layer: 0
m_Name: Armature
m_TagString: Untagged
m_Icon: {fileID: 0}
m_NavMeshLayer: 0
m_StaticEditorFlags: 0
m_IsActive: 1
--- !u!4 &3374381971321939395
Transform:
m_ObjectHideFlags: 0
m_CorrespondingSourceObject: {fileID: 0}
m_PrefabInstance: {fileID: 0}
m_PrefabAsset: {fileID: 0}
m_GameObject: {fileID: 8076956779391437068}
serializedVersion: 2
m_LocalRotation: {x: 0, y: 0, z: 0, w: 1}
m_LocalPosition: {x: 0, y: 0, z: 0}
m_LocalScale: {x: 1, y: 1, z: 1}
m_ConstrainProportionsScale: 0
m_Children:
- {fileID: 6463641812474994547}
m_Father: {fileID: 7077471747533883274}
m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0}
--- !u!1 &9053292826705437702
GameObject:
m_ObjectHideFlags: 0
m_CorrespondingSourceObject: {fileID: 0}
m_PrefabInstance: {fileID: 0}
m_PrefabAsset: {fileID: 0}
serializedVersion: 6
m_Component:
- component: {fileID: 7077471747533883274}
- component: {fileID: 635084532505951628}
- component: {fileID: 6421879640933021628}
- component: {fileID: 5677554079973629394}
m_Layer: 0
m_Name: RetainsTransformLookthroughCurves
m_TagString: Untagged
m_Icon: {fileID: 0}
m_NavMeshLayer: 0
m_StaticEditorFlags: 0
m_IsActive: 1
--- !u!4 &7077471747533883274
Transform:
m_ObjectHideFlags: 0
m_CorrespondingSourceObject: {fileID: 0}
m_PrefabInstance: {fileID: 0}
m_PrefabAsset: {fileID: 0}
m_GameObject: {fileID: 9053292826705437702}
serializedVersion: 2
m_LocalRotation: {x: 0, y: 0, z: 0, w: 1}
m_LocalPosition: {x: -0.12184324, y: 0.7495848, z: -0.22149613}
m_LocalScale: {x: 1, y: 1, z: 1}
m_ConstrainProportionsScale: 0
m_Children:
- {fileID: 3374381971321939395}
- {fileID: 4831129360975791387}
m_Father: {fileID: 0}
m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0}
--- !u!95 &635084532505951628
Animator:
serializedVersion: 5
m_ObjectHideFlags: 0
m_CorrespondingSourceObject: {fileID: 0}
m_PrefabInstance: {fileID: 0}
m_PrefabAsset: {fileID: 0}
m_GameObject: {fileID: 9053292826705437702}
m_Enabled: 1
m_Avatar: {fileID: 0}
m_Controller: {fileID: 0}
m_CullingMode: 0
m_UpdateMode: 0
m_ApplyRootMotion: 0
m_LinearVelocityBlending: 0
m_StabilizeFeet: 0
m_WarningMessage:
m_HasTransformHierarchy: 1
m_AllowConstantClipSamplingOptimization: 1
m_KeepAnimatorStateOnDisable: 0
m_WriteDefaultValuesOnDisable: 0
--- !u!114 &6421879640933021628
MonoBehaviour:
m_ObjectHideFlags: 0
m_CorrespondingSourceObject: {fileID: 0}
m_PrefabInstance: {fileID: 0}
m_PrefabAsset: {fileID: 0}
m_GameObject: {fileID: 9053292826705437702}
m_Enabled: 1
m_EditorHideFlags: 0
m_Script: {fileID: 542108242, guid: 67cc4cb7839cd3741b63733d5adf0442, type: 3}
m_Name:
m_EditorClassIdentifier:
Name:
ViewPosition: {x: 0, y: 1.6, z: 0.2}
Animations: 0
ScaleIPD: 1
lipSync: 0
lipSyncJawBone: {fileID: 0}
lipSyncJawClosed: {x: 0, y: 0, z: 0, w: 1}
lipSyncJawOpen: {x: 0, y: 0, z: 0, w: 1}
VisemeSkinnedMesh: {fileID: 0}
MouthOpenBlendShapeName: Facial_Blends.Jaw_Down
VisemeBlendShapes: []
unityVersion:
portraitCameraPositionOffset: {x: 0, y: 0, z: 0}
portraitCameraRotationOffset: {x: 0, y: 1, z: 0, w: -0.00000004371139}
networkIDs: []
customExpressions: 0
expressionsMenu: {fileID: 0}
expressionParameters: {fileID: 0}
enableEyeLook: 0
customEyeLookSettings:
eyeMovement:
confidence: 0.5
excitement: 0.5
leftEye: {fileID: 0}
rightEye: {fileID: 0}
eyesLookingStraight:
linked: 1
left: {x: 0, y: 0, z: 0, w: 0}
right: {x: 0, y: 0, z: 0, w: 0}
eyesLookingUp:
linked: 1
left: {x: 0, y: 0, z: 0, w: 0}
right: {x: 0, y: 0, z: 0, w: 0}
eyesLookingDown:
linked: 1
left: {x: 0, y: 0, z: 0, w: 0}
right: {x: 0, y: 0, z: 0, w: 0}
eyesLookingLeft:
linked: 1
left: {x: 0, y: 0, z: 0, w: 0}
right: {x: 0, y: 0, z: 0, w: 0}
eyesLookingRight:
linked: 1
left: {x: 0, y: 0, z: 0, w: 0}
right: {x: 0, y: 0, z: 0, w: 0}
eyelidType: 0
upperLeftEyelid: {fileID: 0}
upperRightEyelid: {fileID: 0}
lowerLeftEyelid: {fileID: 0}
lowerRightEyelid: {fileID: 0}
eyelidsDefault:
upper:
linked: 1
left: {x: 0, y: 0, z: 0, w: 0}
right: {x: 0, y: 0, z: 0, w: 0}
lower:
linked: 1
left: {x: 0, y: 0, z: 0, w: 0}
right: {x: 0, y: 0, z: 0, w: 0}
eyelidsClosed:
upper:
linked: 1
left: {x: 0, y: 0, z: 0, w: 0}
right: {x: 0, y: 0, z: 0, w: 0}
lower:
linked: 1
left: {x: 0, y: 0, z: 0, w: 0}
right: {x: 0, y: 0, z: 0, w: 0}
eyelidsLookingUp:
upper:
linked: 1
left: {x: 0, y: 0, z: 0, w: 0}
right: {x: 0, y: 0, z: 0, w: 0}
lower:
linked: 1
left: {x: 0, y: 0, z: 0, w: 0}
right: {x: 0, y: 0, z: 0, w: 0}
eyelidsLookingDown:
upper:
linked: 1
left: {x: 0, y: 0, z: 0, w: 0}
right: {x: 0, y: 0, z: 0, w: 0}
lower:
linked: 1
left: {x: 0, y: 0, z: 0, w: 0}
right: {x: 0, y: 0, z: 0, w: 0}
eyelidsSkinnedMesh: {fileID: 0}
eyelidsBlendshapes:
customizeAnimationLayers: 0
baseAnimationLayers:
- isEnabled: 0
type: 0
animatorController: {fileID: 0}
mask: {fileID: 0}
isDefault: 1
- isEnabled: 0
type: 4
animatorController: {fileID: 0}
mask: {fileID: 0}
isDefault: 1
- isEnabled: 0
type: 5
animatorController: {fileID: 0}
mask: {fileID: 0}
isDefault: 1
specialAnimationLayers:
- isEnabled: 0
type: 6
animatorController: {fileID: 0}
mask: {fileID: 0}
isDefault: 1
- isEnabled: 0
type: 7
animatorController: {fileID: 0}
mask: {fileID: 0}
isDefault: 1
- isEnabled: 0
type: 8
animatorController: {fileID: 0}
mask: {fileID: 0}
isDefault: 1
AnimationPreset: {fileID: 0}
animationHashSet: []
autoFootsteps: 1
autoLocomotion: 1
collider_head:
isMirrored: 1
state: 0
transform: {fileID: 0}
radius: 0
height: 0
position: {x: 0, y: 0, z: 0}
rotation: {x: 0, y: 0, z: 0, w: 1}
collider_torso:
isMirrored: 1
state: 0
transform: {fileID: 0}
radius: 0
height: 0
position: {x: 0, y: 0, z: 0}
rotation: {x: 0, y: 0, z: 0, w: 1}
collider_footR:
isMirrored: 1
state: 0
transform: {fileID: 0}
radius: 0
height: 0
position: {x: 0, y: 0, z: 0}
rotation: {x: 0, y: 0, z: 0, w: 1}
collider_footL:
isMirrored: 1
state: 0
transform: {fileID: 0}
radius: 0
height: 0
position: {x: 0, y: 0, z: 0}
rotation: {x: 0, y: 0, z: 0, w: 1}
collider_handR:
isMirrored: 1
state: 0
transform: {fileID: 0}
radius: 0
height: 0
position: {x: 0, y: 0, z: 0}
rotation: {x: 0, y: 0, z: 0, w: 1}
collider_handL:
isMirrored: 1
state: 0
transform: {fileID: 0}
radius: 0
height: 0
position: {x: 0, y: 0, z: 0}
rotation: {x: 0, y: 0, z: 0, w: 1}
collider_fingerIndexL:
isMirrored: 1
state: 0
transform: {fileID: 0}
radius: 0
height: 0
position: {x: 0, y: 0, z: 0}
rotation: {x: 0, y: 0, z: 0, w: 1}
collider_fingerMiddleL:
isMirrored: 1
state: 0
transform: {fileID: 0}
radius: 0
height: 0
position: {x: 0, y: 0, z: 0}
rotation: {x: 0, y: 0, z: 0, w: 1}
collider_fingerRingL:
isMirrored: 1
state: 0
transform: {fileID: 0}
radius: 0
height: 0
position: {x: 0, y: 0, z: 0}
rotation: {x: 0, y: 0, z: 0, w: 1}
collider_fingerLittleL:
isMirrored: 1
state: 0
transform: {fileID: 0}
radius: 0
height: 0
position: {x: 0, y: 0, z: 0}
rotation: {x: 0, y: 0, z: 0, w: 1}
collider_fingerIndexR:
isMirrored: 1
state: 0
transform: {fileID: 0}
radius: 0
height: 0
position: {x: 0, y: 0, z: 0}
rotation: {x: 0, y: 0, z: 0, w: 1}
collider_fingerMiddleR:
isMirrored: 1
state: 0
transform: {fileID: 0}
radius: 0
height: 0
position: {x: 0, y: 0, z: 0}
rotation: {x: 0, y: 0, z: 0, w: 1}
collider_fingerRingR:
isMirrored: 1
state: 0
transform: {fileID: 0}
radius: 0
height: 0
position: {x: 0, y: 0, z: 0}
rotation: {x: 0, y: 0, z: 0, w: 1}
collider_fingerLittleR:
isMirrored: 1
state: 0
transform: {fileID: 0}
radius: 0
height: 0
position: {x: 0, y: 0, z: 0}
rotation: {x: 0, y: 0, z: 0, w: 1}
--- !u!114 &5677554079973629394
MonoBehaviour:
m_ObjectHideFlags: 0
m_CorrespondingSourceObject: {fileID: 0}
m_PrefabInstance: {fileID: 0}
m_PrefabAsset: {fileID: 0}
m_GameObject: {fileID: 9053292826705437702}
m_Enabled: 1
m_EditorHideFlags: 0
m_Script: {fileID: -1427037861, guid: 4ecd63eff847044b68db9453ce219299, type: 3}
m_Name:
m_EditorClassIdentifier:
launchedFromSDKPipeline: 0
completedSDKPipeline: 0
blueprintId:
contentType: 0
assetBundleUnityVersion:
fallbackStatus: 0

View File

@ -0,0 +1,7 @@
fileFormatVersion: 2
guid: 5d7fbba0f7a314c4ba0cb0dcd455dd5b
PrefabImporter:
externalObjects: {}
userData:
assetBundleName:
assetBundleVariant:

View File

@ -0,0 +1,72 @@
%YAML 1.1
%TAG !u! tag:unity3d.com,2011:
--- !u!1102 &-1268133539673746559
AnimatorState:
serializedVersion: 6
m_ObjectHideFlags: 1
m_CorrespondingSourceObject: {fileID: 0}
m_PrefabInstance: {fileID: 0}
m_PrefabAsset: {fileID: 0}
m_Name: test
m_Speed: 1
m_CycleOffset: 0
m_Transitions: []
m_StateMachineBehaviours: []
m_Position: {x: 50, y: 50, z: 0}
m_IKOnFeet: 0
m_WriteDefaultValues: 1
m_Mirror: 0
m_SpeedParameterActive: 0
m_MirrorParameterActive: 0
m_CycleOffsetParameterActive: 0
m_TimeParameterActive: 0
m_Motion: {fileID: 7400000, guid: 72c58dde7ac8c6741b333a51e1aff2c4, type: 2}
m_Tag:
m_SpeedParameter:
m_MirrorParameter:
m_CycleOffsetParameter:
m_TimeParameter:
--- !u!91 &9100000
AnimatorController:
m_ObjectHideFlags: 0
m_CorrespondingSourceObject: {fileID: 0}
m_PrefabInstance: {fileID: 0}
m_PrefabAsset: {fileID: 0}
m_Name: ac
serializedVersion: 5
m_AnimatorParameters: []
m_AnimatorLayers:
- serializedVersion: 5
m_Name: test
m_StateMachine: {fileID: 5303123724936942604}
m_Mask: {fileID: 0}
m_Motions: []
m_Behaviours: []
m_BlendingMode: 0
m_SyncedLayerIndex: -1
m_DefaultWeight: 0
m_IKPass: 0
m_SyncedLayerAffectsTiming: 0
m_Controller: {fileID: 9100000}
--- !u!1107 &5303123724936942604
AnimatorStateMachine:
serializedVersion: 6
m_ObjectHideFlags: 1
m_CorrespondingSourceObject: {fileID: 0}
m_PrefabInstance: {fileID: 0}
m_PrefabAsset: {fileID: 0}
m_Name: test
m_ChildStates:
- serializedVersion: 1
m_State: {fileID: -1268133539673746559}
m_Position: {x: 440, y: 110, z: 0}
m_ChildStateMachines: []
m_AnyStateTransitions: []
m_EntryTransitions: []
m_StateMachineTransitions: {}
m_StateMachineBehaviours: []
m_AnyStatePosition: {x: 50, y: 20, z: 0}
m_EntryPosition: {x: 50, y: 120, z: 0}
m_ExitPosition: {x: 800, y: 120, z: 0}
m_ParentStateMachinePosition: {x: 800, y: 20, z: 0}
m_DefaultState: {fileID: -1268133539673746559}

View File

@ -0,0 +1,8 @@
fileFormatVersion: 2
guid: 19d8bfd755e0f6b4581b4da4cfd2cc70
NativeFormatImporter:
externalObjects: {}
mainObjectFileID: 9100000
userData:
assetBundleName:
assetBundleVariant:

View File

@ -0,0 +1,192 @@
%YAML 1.1
%TAG !u! tag:unity3d.com,2011:
--- !u!74 &7400000
AnimationClip:
m_ObjectHideFlags: 0
m_CorrespondingSourceObject: {fileID: 0}
m_PrefabInstance: {fileID: 0}
m_PrefabAsset: {fileID: 0}
m_Name: test
serializedVersion: 7
m_Legacy: 0
m_Compressed: 0
m_UseHighQualityCurve: 1
m_RotationCurves: []
m_CompressedRotationCurves: []
m_EulerCurves: []
m_PositionCurves: []
m_ScaleCurves:
- curve:
serializedVersion: 2
m_Curve:
- serializedVersion: 3
time: 0
value: {x: 0.5, y: 0.5, z: 0.5}
inSlope: {x: 0, y: 0, z: 0}
outSlope: {x: 0, y: 0, z: 0}
tangentMode: 0
weightedMode: 0
inWeight: {x: 0, y: 0.33333334, z: 0.33333334}
outWeight: {x: 0, y: 0.33333334, z: 0.33333334}
m_PreInfinity: 2
m_PostInfinity: 2
m_RotationOrder: 4
path: Armature.1/Hips
m_FloatCurves:
- serializedVersion: 2
curve:
serializedVersion: 2
m_Curve:
- serializedVersion: 3
time: 0
value: 0
inSlope: Infinity
outSlope: Infinity
tangentMode: 103
weightedMode: 0
inWeight: 0
outWeight: 0
m_PreInfinity: 2
m_PostInfinity: 2
m_RotationOrder: 4
attribute: m_IsActive
path: Armature.1
classID: 1
script: {fileID: 0}
flags: 0
m_PPtrCurves: []
m_SampleRate: 60
m_WrapMode: 0
m_Bounds:
m_Center: {x: 0, y: 0, z: 0}
m_Extent: {x: 0, y: 0, z: 0}
m_ClipBindingConstant:
genericBindings:
- serializedVersion: 2
path: 1593464098
attribute: 2086281974
script: {fileID: 0}
typeID: 1
customType: 0
isPPtrCurve: 0
isIntCurve: 0
isSerializeReferenceCurve: 0
- serializedVersion: 2
path: 2711589869
attribute: 3
script: {fileID: 0}
typeID: 4
customType: 0
isPPtrCurve: 0
isIntCurve: 0
isSerializeReferenceCurve: 0
pptrCurveMapping: []
m_AnimationClipSettings:
serializedVersion: 2
m_AdditiveReferencePoseClip: {fileID: 0}
m_AdditiveReferencePoseTime: 0
m_StartTime: 0
m_StopTime: 0
m_OrientationOffsetY: 0
m_Level: 0
m_CycleOffset: 0
m_HasAdditiveReferencePose: 0
m_LoopTime: 0
m_LoopBlend: 0
m_LoopBlendOrientation: 0
m_LoopBlendPositionY: 0
m_LoopBlendPositionXZ: 0
m_KeepOriginalOrientation: 0
m_KeepOriginalPositionY: 1
m_KeepOriginalPositionXZ: 0
m_HeightFromFeet: 0
m_Mirror: 0
m_EditorCurves:
- serializedVersion: 2
curve:
serializedVersion: 2
m_Curve:
- serializedVersion: 3
time: 0
value: 0
inSlope: Infinity
outSlope: Infinity
tangentMode: 103
weightedMode: 0
inWeight: 0
outWeight: 0
m_PreInfinity: 2
m_PostInfinity: 2
m_RotationOrder: 4
attribute: m_IsActive
path: Armature.1
classID: 1
script: {fileID: 0}
flags: 0
- serializedVersion: 2
curve:
serializedVersion: 2
m_Curve:
- serializedVersion: 3
time: 0
value: 0.5
inSlope: 0
outSlope: 0
tangentMode: 136
weightedMode: 0
inWeight: 0
outWeight: 0
m_PreInfinity: 2
m_PostInfinity: 2
m_RotationOrder: 4
attribute: m_LocalScale.x
path: Armature.1/Hips
classID: 4
script: {fileID: 0}
flags: 0
- serializedVersion: 2
curve:
serializedVersion: 2
m_Curve:
- serializedVersion: 3
time: 0
value: 0.5
inSlope: 0
outSlope: 0
tangentMode: 136
weightedMode: 0
inWeight: 0
outWeight: 0
m_PreInfinity: 2
m_PostInfinity: 2
m_RotationOrder: 4
attribute: m_LocalScale.y
path: Armature.1/Hips
classID: 4
script: {fileID: 0}
flags: 0
- serializedVersion: 2
curve:
serializedVersion: 2
m_Curve:
- serializedVersion: 3
time: 0
value: 0.5
inSlope: 0
outSlope: 0
tangentMode: 136
weightedMode: 0
inWeight: 0
outWeight: 0
m_PreInfinity: 2
m_PostInfinity: 2
m_RotationOrder: 4
attribute: m_LocalScale.z
path: Armature.1/Hips
classID: 4
script: {fileID: 0}
flags: 0
m_EulerEditorCurves: []
m_HasGenericRootTransform: 0
m_HasMotionFloatCurves: 0
m_Events: []

View File

@ -0,0 +1,8 @@
fileFormatVersion: 2
guid: 72c58dde7ac8c6741b333a51e1aff2c4
NativeFormatImporter:
externalObjects: {}
mainObjectFileID: 7400000
userData:
assetBundleName:
assetBundleVariant:

View File

@ -0,0 +1,8 @@
fileFormatVersion: 2
guid: 517a3e1b449bea941819c9902ce3de1b
folderAsset: yes
DefaultImporter:
externalObjects: {}
userData:
assetBundleName:
assetBundleVariant:

View File

@ -0,0 +1,36 @@
using System.Collections;
using System.Collections.Generic;
using modular_avatar_tests;
using nadena.dev.modular_avatar.core.editor;
using NUnit.Framework;
using UnityEditor.Animations;
using UnityEngine;
using VRC.SDK3.Avatars.Components;
public class ReactiveComponentWriteDefaultsTest : TestBase
{
[Test]
public void RCObjectWriteDefaults([Values("rc_wd_on.controller", "rc_wd_off.controller")] string controllerPath)
{
var root = CreatePrefab("rc_wd.prefab");
var avDesc = root.GetComponent<VRCAvatarDescriptor>();
var controller = LoadAsset<AnimatorController>(controllerPath);
var baseLayers = avDesc.baseAnimationLayers;
for (int i = 0; i < baseLayers.Length; i++)
{
baseLayers[i].animatorController = controller;
baseLayers[i].isDefault = false;
}
avDesc.baseAnimationLayers = baseLayers;
avDesc.customizeAnimationLayers = true;
AvatarProcessor.ProcessAvatar(root);
var fx = findFxLayer(root, "RC MA Responsive: GameObject");
Assert.AreEqual(
controllerPath.StartsWith("rc_wd_on"),
fx.stateMachine.defaultState.writeDefaultValues
);
}
}

View File

@ -0,0 +1,11 @@
fileFormatVersion: 2
guid: 8efec892da3ae3a45b810abf5cebad02
MonoImporter:
externalObjects: {}
serializedVersion: 2
defaultReferences: []
executionOrder: 0
icon: {instanceID: 0}
userData:
assetBundleName:
assetBundleVariant:

View File

@ -0,0 +1,469 @@
%YAML 1.1
%TAG !u! tag:unity3d.com,2011:
--- !u!1 &477583020495738404
GameObject:
m_ObjectHideFlags: 0
m_CorrespondingSourceObject: {fileID: 0}
m_PrefabInstance: {fileID: 0}
m_PrefabAsset: {fileID: 0}
serializedVersion: 6
m_Component:
- component: {fileID: 9179158997175056572}
- component: {fileID: 29650048224569744}
- component: {fileID: 2852631459141447588}
- component: {fileID: 8587532856046952446}
m_Layer: 0
m_Name: GameObject OFF
m_TagString: Untagged
m_Icon: {fileID: 0}
m_NavMeshLayer: 0
m_StaticEditorFlags: 0
m_IsActive: 1
--- !u!4 &9179158997175056572
Transform:
m_ObjectHideFlags: 0
m_CorrespondingSourceObject: {fileID: 0}
m_PrefabInstance: {fileID: 0}
m_PrefabAsset: {fileID: 0}
m_GameObject: {fileID: 477583020495738404}
serializedVersion: 2
m_LocalRotation: {x: 0, y: 0, z: 0, w: 1}
m_LocalPosition: {x: 0, y: 0, z: 0}
m_LocalScale: {x: 1, y: 1, z: 1}
m_ConstrainProportionsScale: 0
m_Children: []
m_Father: {fileID: 1878023628084695976}
m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0}
--- !u!114 &29650048224569744
MonoBehaviour:
m_ObjectHideFlags: 0
m_CorrespondingSourceObject: {fileID: 0}
m_PrefabInstance: {fileID: 0}
m_PrefabAsset: {fileID: 0}
m_GameObject: {fileID: 477583020495738404}
m_Enabled: 1
m_EditorHideFlags: 0
m_Script: {fileID: 11500000, guid: a162bb8ec7e24a5abcf457887f1df3fa, type: 3}
m_Name:
m_EditorClassIdentifier:
m_inverted: 0
m_objects:
- Object:
referencePath: GameObject
targetObject: {fileID: 6320927576634437802}
Active: 0
--- !u!114 &2852631459141447588
MonoBehaviour:
m_ObjectHideFlags: 0
m_CorrespondingSourceObject: {fileID: 0}
m_PrefabInstance: {fileID: 0}
m_PrefabAsset: {fileID: 0}
m_GameObject: {fileID: 477583020495738404}
m_Enabled: 1
m_EditorHideFlags: 0
m_Script: {fileID: 11500000, guid: 3b29d45007c5493d926d2cd45a489529, type: 3}
m_Name:
m_EditorClassIdentifier:
Control:
name: GameObject OFF
icon: {fileID: 0}
type: 102
parameter:
name:
value: 1
style: 0
subMenu: {fileID: 0}
subParameters: []
labels: []
MenuSource: 1
menuSource_otherObjectChildren: {fileID: 0}
isSynced: 1
isSaved: 1
isDefault: 0
automaticValue: 1
label:
--- !u!114 &8587532856046952446
MonoBehaviour:
m_ObjectHideFlags: 0
m_CorrespondingSourceObject: {fileID: 0}
m_PrefabInstance: {fileID: 0}
m_PrefabAsset: {fileID: 0}
m_GameObject: {fileID: 477583020495738404}
m_Enabled: 1
m_EditorHideFlags: 0
m_Script: {fileID: 11500000, guid: 7ef83cb0c23d4d7c9d41021e544a1978, type: 3}
m_Name:
m_EditorClassIdentifier:
menuToAppend: {fileID: 0}
installTargetMenu: {fileID: 0}
--- !u!1 &5779388316383907521
GameObject:
m_ObjectHideFlags: 0
m_CorrespondingSourceObject: {fileID: 0}
m_PrefabInstance: {fileID: 0}
m_PrefabAsset: {fileID: 0}
serializedVersion: 6
m_Component:
- component: {fileID: 1878023628084695976}
- component: {fileID: 7755083891606286594}
- component: {fileID: 586879300047358754}
- component: {fileID: 4246695544239537830}
- component: {fileID: 333680745927230906}
m_Layer: 0
m_Name: rc_wd
m_TagString: Untagged
m_Icon: {fileID: 0}
m_NavMeshLayer: 0
m_StaticEditorFlags: 0
m_IsActive: 1
--- !u!4 &1878023628084695976
Transform:
m_ObjectHideFlags: 0
m_CorrespondingSourceObject: {fileID: 0}
m_PrefabInstance: {fileID: 0}
m_PrefabAsset: {fileID: 0}
m_GameObject: {fileID: 5779388316383907521}
serializedVersion: 2
m_LocalRotation: {x: 0, y: 0, z: 0, w: 1}
m_LocalPosition: {x: -0.22364601, y: 0.92672217, z: -1.631131}
m_LocalScale: {x: 1, y: 1, z: 1}
m_ConstrainProportionsScale: 0
m_Children:
- {fileID: 7508355110127128095}
- {fileID: 9179158997175056572}
m_Father: {fileID: 0}
m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0}
--- !u!95 &7755083891606286594
Animator:
serializedVersion: 5
m_ObjectHideFlags: 0
m_CorrespondingSourceObject: {fileID: 0}
m_PrefabInstance: {fileID: 0}
m_PrefabAsset: {fileID: 0}
m_GameObject: {fileID: 5779388316383907521}
m_Enabled: 1
m_Avatar: {fileID: 0}
m_Controller: {fileID: 0}
m_CullingMode: 0
m_UpdateMode: 0
m_ApplyRootMotion: 0
m_LinearVelocityBlending: 0
m_StabilizeFeet: 0
m_WarningMessage:
m_HasTransformHierarchy: 1
m_AllowConstantClipSamplingOptimization: 1
m_KeepAnimatorStateOnDisable: 0
m_WriteDefaultValuesOnDisable: 0
--- !u!114 &586879300047358754
MonoBehaviour:
m_ObjectHideFlags: 0
m_CorrespondingSourceObject: {fileID: 0}
m_PrefabInstance: {fileID: 0}
m_PrefabAsset: {fileID: 0}
m_GameObject: {fileID: 5779388316383907521}
m_Enabled: 1
m_EditorHideFlags: 0
m_Script: {fileID: 542108242, guid: 67cc4cb7839cd3741b63733d5adf0442, type: 3}
m_Name:
m_EditorClassIdentifier:
Name:
ViewPosition: {x: 0, y: 1.6, z: 0.2}
Animations: 0
ScaleIPD: 1
lipSync: 0
lipSyncJawBone: {fileID: 0}
lipSyncJawClosed: {x: 0, y: 0, z: 0, w: 1}
lipSyncJawOpen: {x: 0, y: 0, z: 0, w: 1}
VisemeSkinnedMesh: {fileID: 0}
MouthOpenBlendShapeName: Facial_Blends.Jaw_Down
VisemeBlendShapes: []
unityVersion:
portraitCameraPositionOffset: {x: 0, y: 0, z: 0}
portraitCameraRotationOffset: {x: 0, y: 1, z: 0, w: -0.00000004371139}
networkIDs: []
customExpressions: 0
expressionsMenu: {fileID: 0}
expressionParameters: {fileID: 0}
enableEyeLook: 0
customEyeLookSettings:
eyeMovement:
confidence: 0.5
excitement: 0.5
leftEye: {fileID: 0}
rightEye: {fileID: 0}
eyesLookingStraight:
linked: 1
left: {x: 0, y: 0, z: 0, w: 0}
right: {x: 0, y: 0, z: 0, w: 0}
eyesLookingUp:
linked: 1
left: {x: 0, y: 0, z: 0, w: 0}
right: {x: 0, y: 0, z: 0, w: 0}
eyesLookingDown:
linked: 1
left: {x: 0, y: 0, z: 0, w: 0}
right: {x: 0, y: 0, z: 0, w: 0}
eyesLookingLeft:
linked: 1
left: {x: 0, y: 0, z: 0, w: 0}
right: {x: 0, y: 0, z: 0, w: 0}
eyesLookingRight:
linked: 1
left: {x: 0, y: 0, z: 0, w: 0}
right: {x: 0, y: 0, z: 0, w: 0}
eyelidType: 0
upperLeftEyelid: {fileID: 0}
upperRightEyelid: {fileID: 0}
lowerLeftEyelid: {fileID: 0}
lowerRightEyelid: {fileID: 0}
eyelidsDefault:
upper:
linked: 1
left: {x: 0, y: 0, z: 0, w: 0}
right: {x: 0, y: 0, z: 0, w: 0}
lower:
linked: 1
left: {x: 0, y: 0, z: 0, w: 0}
right: {x: 0, y: 0, z: 0, w: 0}
eyelidsClosed:
upper:
linked: 1
left: {x: 0, y: 0, z: 0, w: 0}
right: {x: 0, y: 0, z: 0, w: 0}
lower:
linked: 1
left: {x: 0, y: 0, z: 0, w: 0}
right: {x: 0, y: 0, z: 0, w: 0}
eyelidsLookingUp:
upper:
linked: 1
left: {x: 0, y: 0, z: 0, w: 0}
right: {x: 0, y: 0, z: 0, w: 0}
lower:
linked: 1
left: {x: 0, y: 0, z: 0, w: 0}
right: {x: 0, y: 0, z: 0, w: 0}
eyelidsLookingDown:
upper:
linked: 1
left: {x: 0, y: 0, z: 0, w: 0}
right: {x: 0, y: 0, z: 0, w: 0}
lower:
linked: 1
left: {x: 0, y: 0, z: 0, w: 0}
right: {x: 0, y: 0, z: 0, w: 0}
eyelidsSkinnedMesh: {fileID: 0}
eyelidsBlendshapes:
customizeAnimationLayers: 1
baseAnimationLayers:
- isEnabled: 0
type: 0
animatorController: {fileID: 9100000, guid: bbe8f5d0b8aa75b46a8da9da84fca5f0,
type: 2}
mask: {fileID: 0}
isDefault: 0
- isEnabled: 0
type: 4
animatorController: {fileID: 9100000, guid: bbe8f5d0b8aa75b46a8da9da84fca5f0,
type: 2}
mask: {fileID: 0}
isDefault: 0
- isEnabled: 0
type: 5
animatorController: {fileID: 9100000, guid: bbe8f5d0b8aa75b46a8da9da84fca5f0,
type: 2}
mask: {fileID: 0}
isDefault: 0
specialAnimationLayers:
- isEnabled: 0
type: 6
animatorController: {fileID: 0}
mask: {fileID: 0}
isDefault: 1
- isEnabled: 0
type: 7
animatorController: {fileID: 0}
mask: {fileID: 0}
isDefault: 1
- isEnabled: 0
type: 8
animatorController: {fileID: 0}
mask: {fileID: 0}
isDefault: 1
AnimationPreset: {fileID: 0}
animationHashSet: []
autoFootsteps: 1
autoLocomotion: 1
collider_head:
isMirrored: 1
state: 0
transform: {fileID: 0}
radius: 0
height: 0
position: {x: 0, y: 0, z: 0}
rotation: {x: 0, y: 0, z: 0, w: 1}
collider_torso:
isMirrored: 1
state: 0
transform: {fileID: 0}
radius: 0
height: 0
position: {x: 0, y: 0, z: 0}
rotation: {x: 0, y: 0, z: 0, w: 1}
collider_footR:
isMirrored: 1
state: 0
transform: {fileID: 0}
radius: 0
height: 0
position: {x: 0, y: 0, z: 0}
rotation: {x: 0, y: 0, z: 0, w: 1}
collider_footL:
isMirrored: 1
state: 0
transform: {fileID: 0}
radius: 0
height: 0
position: {x: 0, y: 0, z: 0}
rotation: {x: 0, y: 0, z: 0, w: 1}
collider_handR:
isMirrored: 1
state: 0
transform: {fileID: 0}
radius: 0
height: 0
position: {x: 0, y: 0, z: 0}
rotation: {x: 0, y: 0, z: 0, w: 1}
collider_handL:
isMirrored: 1
state: 0
transform: {fileID: 0}
radius: 0
height: 0
position: {x: 0, y: 0, z: 0}
rotation: {x: 0, y: 0, z: 0, w: 1}
collider_fingerIndexL:
isMirrored: 1
state: 0
transform: {fileID: 0}
radius: 0
height: 0
position: {x: 0, y: 0, z: 0}
rotation: {x: 0, y: 0, z: 0, w: 1}
collider_fingerMiddleL:
isMirrored: 1
state: 0
transform: {fileID: 0}
radius: 0
height: 0
position: {x: 0, y: 0, z: 0}
rotation: {x: 0, y: 0, z: 0, w: 1}
collider_fingerRingL:
isMirrored: 1
state: 0
transform: {fileID: 0}
radius: 0
height: 0
position: {x: 0, y: 0, z: 0}
rotation: {x: 0, y: 0, z: 0, w: 1}
collider_fingerLittleL:
isMirrored: 1
state: 0
transform: {fileID: 0}
radius: 0
height: 0
position: {x: 0, y: 0, z: 0}
rotation: {x: 0, y: 0, z: 0, w: 1}
collider_fingerIndexR:
isMirrored: 1
state: 0
transform: {fileID: 0}
radius: 0
height: 0
position: {x: 0, y: 0, z: 0}
rotation: {x: 0, y: 0, z: 0, w: 1}
collider_fingerMiddleR:
isMirrored: 1
state: 0
transform: {fileID: 0}
radius: 0
height: 0
position: {x: 0, y: 0, z: 0}
rotation: {x: 0, y: 0, z: 0, w: 1}
collider_fingerRingR:
isMirrored: 1
state: 0
transform: {fileID: 0}
radius: 0
height: 0
position: {x: 0, y: 0, z: 0}
rotation: {x: 0, y: 0, z: 0, w: 1}
collider_fingerLittleR:
isMirrored: 1
state: 0
transform: {fileID: 0}
radius: 0
height: 0
position: {x: 0, y: 0, z: 0}
rotation: {x: 0, y: 0, z: 0, w: 1}
--- !u!114 &4246695544239537830
MonoBehaviour:
m_ObjectHideFlags: 0
m_CorrespondingSourceObject: {fileID: 0}
m_PrefabInstance: {fileID: 0}
m_PrefabAsset: {fileID: 0}
m_GameObject: {fileID: 5779388316383907521}
m_Enabled: 1
m_EditorHideFlags: 0
m_Script: {fileID: -1427037861, guid: 4ecd63eff847044b68db9453ce219299, type: 3}
m_Name:
m_EditorClassIdentifier:
launchedFromSDKPipeline: 0
completedSDKPipeline: 0
blueprintId:
contentType: 0
assetBundleUnityVersion:
fallbackStatus: 0
--- !u!114 &333680745927230906
MonoBehaviour:
m_ObjectHideFlags: 0
m_CorrespondingSourceObject: {fileID: 0}
m_PrefabInstance: {fileID: 0}
m_PrefabAsset: {fileID: 0}
m_GameObject: {fileID: 5779388316383907521}
m_Enabled: 1
m_EditorHideFlags: 0
m_Script: {fileID: 11500000, guid: 52fa21b17bc14dc294959f976e3e184f, type: 3}
m_Name:
m_EditorClassIdentifier:
--- !u!1 &6320927576634437802
GameObject:
m_ObjectHideFlags: 0
m_CorrespondingSourceObject: {fileID: 0}
m_PrefabInstance: {fileID: 0}
m_PrefabAsset: {fileID: 0}
serializedVersion: 6
m_Component:
- component: {fileID: 7508355110127128095}
m_Layer: 0
m_Name: GameObject
m_TagString: Untagged
m_Icon: {fileID: 0}
m_NavMeshLayer: 0
m_StaticEditorFlags: 0
m_IsActive: 1
--- !u!4 &7508355110127128095
Transform:
m_ObjectHideFlags: 0
m_CorrespondingSourceObject: {fileID: 0}
m_PrefabInstance: {fileID: 0}
m_PrefabAsset: {fileID: 0}
m_GameObject: {fileID: 6320927576634437802}
serializedVersion: 2
m_LocalRotation: {x: 0, y: 0, z: 0, w: 1}
m_LocalPosition: {x: 0, y: 0, z: 0}
m_LocalScale: {x: 1, y: 1, z: 1}
m_ConstrainProportionsScale: 0
m_Children: []
m_Father: {fileID: 1878023628084695976}
m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0}

View File

@ -0,0 +1,7 @@
fileFormatVersion: 2
guid: 7b345973f37afde43945770cff0f468d
PrefabImporter:
externalObjects: {}
userData:
assetBundleName:
assetBundleVariant:

View File

@ -0,0 +1,72 @@
%YAML 1.1
%TAG !u! tag:unity3d.com,2011:
--- !u!1102 &-5675820832765795809
AnimatorState:
serializedVersion: 6
m_ObjectHideFlags: 1
m_CorrespondingSourceObject: {fileID: 0}
m_PrefabInstance: {fileID: 0}
m_PrefabAsset: {fileID: 0}
m_Name: New State
m_Speed: 1
m_CycleOffset: 0
m_Transitions: []
m_StateMachineBehaviours: []
m_Position: {x: 50, y: 50, z: 0}
m_IKOnFeet: 0
m_WriteDefaultValues: 0
m_Mirror: 0
m_SpeedParameterActive: 0
m_MirrorParameterActive: 0
m_CycleOffsetParameterActive: 0
m_TimeParameterActive: 0
m_Motion: {fileID: 0}
m_Tag:
m_SpeedParameter:
m_MirrorParameter:
m_CycleOffsetParameter:
m_TimeParameter:
--- !u!1107 &-1329585102462520777
AnimatorStateMachine:
serializedVersion: 6
m_ObjectHideFlags: 1
m_CorrespondingSourceObject: {fileID: 0}
m_PrefabInstance: {fileID: 0}
m_PrefabAsset: {fileID: 0}
m_Name: Base Layer
m_ChildStates:
- serializedVersion: 1
m_State: {fileID: -5675820832765795809}
m_Position: {x: 370, y: 110, z: 0}
m_ChildStateMachines: []
m_AnyStateTransitions: []
m_EntryTransitions: []
m_StateMachineTransitions: {}
m_StateMachineBehaviours: []
m_AnyStatePosition: {x: 50, y: 20, z: 0}
m_EntryPosition: {x: 50, y: 120, z: 0}
m_ExitPosition: {x: 800, y: 120, z: 0}
m_ParentStateMachinePosition: {x: 800, y: 20, z: 0}
m_DefaultState: {fileID: -5675820832765795809}
--- !u!91 &9100000
AnimatorController:
m_ObjectHideFlags: 0
m_CorrespondingSourceObject: {fileID: 0}
m_PrefabInstance: {fileID: 0}
m_PrefabAsset: {fileID: 0}
m_Name: rc_wd_off
serializedVersion: 5
m_AnimatorParameters: []
m_AnimatorLayers:
- serializedVersion: 5
m_Name: Base Layer
m_StateMachine: {fileID: -1329585102462520777}
m_Mask: {fileID: 0}
m_Motions: []
m_Behaviours: []
m_BlendingMode: 0
m_SyncedLayerIndex: -1
m_DefaultWeight: 0
m_IKPass: 0
m_SyncedLayerAffectsTiming: 0
m_Controller: {fileID: 9100000}

View File

@ -0,0 +1,8 @@
fileFormatVersion: 2
guid: bbe8f5d0b8aa75b46a8da9da84fca5f0
NativeFormatImporter:
externalObjects: {}
mainObjectFileID: 9100000
userData:
assetBundleName:
assetBundleVariant:

View File

@ -0,0 +1,72 @@
%YAML 1.1
%TAG !u! tag:unity3d.com,2011:
--- !u!1102 &-5675820832765795809
AnimatorState:
serializedVersion: 6
m_ObjectHideFlags: 1
m_CorrespondingSourceObject: {fileID: 0}
m_PrefabInstance: {fileID: 0}
m_PrefabAsset: {fileID: 0}
m_Name: New State
m_Speed: 1
m_CycleOffset: 0
m_Transitions: []
m_StateMachineBehaviours: []
m_Position: {x: 50, y: 50, z: 0}
m_IKOnFeet: 0
m_WriteDefaultValues: 1
m_Mirror: 0
m_SpeedParameterActive: 0
m_MirrorParameterActive: 0
m_CycleOffsetParameterActive: 0
m_TimeParameterActive: 0
m_Motion: {fileID: 0}
m_Tag:
m_SpeedParameter:
m_MirrorParameter:
m_CycleOffsetParameter:
m_TimeParameter:
--- !u!1107 &-1329585102462520777
AnimatorStateMachine:
serializedVersion: 6
m_ObjectHideFlags: 1
m_CorrespondingSourceObject: {fileID: 0}
m_PrefabInstance: {fileID: 0}
m_PrefabAsset: {fileID: 0}
m_Name: Base Layer
m_ChildStates:
- serializedVersion: 1
m_State: {fileID: -5675820832765795809}
m_Position: {x: 370, y: 110, z: 0}
m_ChildStateMachines: []
m_AnyStateTransitions: []
m_EntryTransitions: []
m_StateMachineTransitions: {}
m_StateMachineBehaviours: []
m_AnyStatePosition: {x: 50, y: 20, z: 0}
m_EntryPosition: {x: 50, y: 120, z: 0}
m_ExitPosition: {x: 800, y: 120, z: 0}
m_ParentStateMachinePosition: {x: 800, y: 20, z: 0}
m_DefaultState: {fileID: -5675820832765795809}
--- !u!91 &9100000
AnimatorController:
m_ObjectHideFlags: 0
m_CorrespondingSourceObject: {fileID: 0}
m_PrefabInstance: {fileID: 0}
m_PrefabAsset: {fileID: 0}
m_Name: rc_wd_on
serializedVersion: 5
m_AnimatorParameters: []
m_AnimatorLayers:
- serializedVersion: 5
m_Name: Base Layer
m_StateMachine: {fileID: -1329585102462520777}
m_Mask: {fileID: 0}
m_Motions: []
m_Behaviours: []
m_BlendingMode: 0
m_SyncedLayerIndex: -1
m_DefaultWeight: 0
m_IKPass: 0
m_SyncedLayerAffectsTiming: 0
m_Controller: {fileID: 9100000}

View File

@ -0,0 +1,8 @@
fileFormatVersion: 2
guid: 7fdfd4d33b132ab45b23f92ec3535b94
NativeFormatImporter:
externalObjects: {}
mainObjectFileID: 9100000
userData:
assetBundleName:
assetBundleVariant:

Binary file not shown.

After

Width:  |  Height:  |  Size: 179 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 232 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 118 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 220 KiB

BIN
docs~/docs/alcom-update.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 242 KiB

View File

@ -13,7 +13,10 @@ you want to use. It can automatically merge outfits onto your avatar, build an a
## Installation
### Install via VCC
The recommended way to install Modular Avatar is using the VRChat Creator Companion. After installing the VCC, click here:
* [Add Modular Avatar to VCC](vcc://vpm/addRepo?url=https://vpm.nadena.dev/vpm.json)
Then, go to "manage project" for your project, and click the + next to Modular Avatar.
@ -22,21 +25,74 @@ Then, go to "manage project" for your project, and click the + next to Modular A
To update to the latest version, just click the green arrow in the "Latest Version" column.
Once you've installed MA, check out one of the tutorials below:
* [Simple clothing setup](/docs/tutorials/clothing)
* [Advanced clothing setup](/docs/tutorials/adv_clothing)
* [Toggle an object](/docs/tutorials/object_toggle/)
* [Edit menus](/docs/tutorials/menu/)
### Install via ALCOM
If you are using [ALCOM](https://vrc-get.anatawa12.com/en/alcom/) to install Modular Avatar, follow these steps:
1. Open "Packages" and select "ADD REPOSITORY".
2. Enter the following values under "Enter information about the repository" and click "ADD REPOSITORY":
* `https://vpm.nadena.dev/vpm.json`
3. Confirm the following details are displayed, then click "Add VPM Repository":
* Repository Name: `bd_`
* URL: The URL you entered.
Afterward, open "Manage Project" for your project, click the + next to Modular Avatar, and then click `APPLY`.
![ALCOM Install UI](alcom-install.png)
![ALCOM Install Confirm UI](alcom-install-confirm.png)
To update to the latest version, click the area with the version number and green arrow, then click `APPLY`.
![ALCOM Update UI](alcom-update.png)
## Prerelease versions
The documentation for the prerelease branch can be [found here](https://modular-avatar.nadena.dev/dev).
Prerelease versions may contain bugs, and/or may have compatibility breaks as development progresses. Please leave
feedback and bug reports at the [github issues page](https://github.com/bdunderscore/modular-avatar/issues).
### Install Prerelease versions via VCC
To make prerelease versions available in the VCC, [click here](vcc://vpm/addRepo?url=https://vpm.nadena.dev/vpm-prerelease.json)
Then, in your VCC Settings -> Packages window, uncheck the `bd_` repository, check the `bd_ prerelease` repository, and enable `Show pre-release packages`.
![Pre-release settings](prerelease.png)
The documentation for the prerelease branch can be [found here](https://modular-avatar.nadena.dev/dev).
### Install Prerelease versions via ALCOM
Prerelease versions may contain bugs, and/or may have compatibility breaks as development progresses. Please leave
feedback and bug reports at the [github issues page](https://github.com/bdunderscore/modular-avatar/issues).
If you are using [ALCOM](https://vrc-get.anatawa12.com/en/alcom/) to install Modular Avatar, follow these steps:
1. Open "Packages" and select "ADD REPOSITORY".
2. Enter the following values under "Enter information about the repository" and click "ADD REPOSITORY":
* `https://vpm.nadena.dev/vpm-prerelease.json`
3. Confirm the following details are displayed, then click "Add VPM Repository":
* Repository Name: `bd_ (prereleases)`
* URL: The URL you entered.
4. When you currenly uses stable version, In your ALCOM Packages window, uncheck `bd_` repo and check `bd_ (prereleases)` repo.
5. In your ALCOM Settings window, enable `Show Prerelease Packages`.
![ALCOM Change Repogitories UI](alcom-prerelease-repo.png)
![ALCOM enable Prerelease UI](alcom-prerelease-settings.png)
Afterward, open "Manage Project" for your project, click the + next to Modular Avatar, and then click `APPLY`.
![ALCOM Install UI](alcom-install.png)
![ALCOM Install Confirm UI](alcom-install-confirm.png)
To update to the latest version, click the area with the version number and green arrow, then click `APPLY`.
![ALCOM Update UI](alcom-update.png)
## What to read next
Once you've installed MA, check out one of the tutorials below:
* [Simple clothing setup](/docs/tutorials/clothing)
* [Advanced clothing setup](/docs/tutorials/adv_clothing)
* [Toggle an object](/docs/tutorials/object_toggle/)
* [Edit menus](/docs/tutorials/menu/)

Binary file not shown.

After

Width:  |  Height:  |  Size: 204 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 244 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 122 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 305 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 254 KiB

View File

@ -11,7 +11,7 @@ Merge Animatorなどで追加されたレイヤーは、置換モードでも
`MA MMD Layer Control` という_ステートマシンビヘイビア_を制御したいレイヤーに追加することができます。
また、全体的にこの対応を無効にする場合は、[VRChat Settings](../reference/vrchat-settings)コンポーネントをアバターにつけて、
該当設置絵を無効にしてください。
該当設を無効にしてください。
:::warning

View File

@ -11,7 +11,10 @@ Modular Avatarの機能はそれぞれコンポーネントとして提供され
## インストール
### VCCでのインストール
VRChat Creator CompanionでModular Avatarをインストールすることをお勧めします。VCCをインストールしたら、こちらをクリックしてください
* [Modular AvatarをVCCに追加](vcc://vpm/addRepo?url=https://vpm.nadena.dev/vpm.json)
その後、プロジェクトの"manage project"を開き、Modular Avatarの+をクリックしてください。
@ -20,22 +23,81 @@ VRChat Creator CompanionでModular Avatarをインストールすることをお
最新版にアップデートするには、"Latest Version"の緑色の矢印をクリックしてください。
インストール後は以下のチュートリアルを参照してください。
### ALCOMでのインストール
* [簡単な衣装設定](/docs/tutorials/clothing)
* [複雑な衣装設定](/docs/tutorials/adv_clothing)
* [アニメーターでトグル作成](/docs/tutorials/object_toggle/)
* [簡易メニュー作成](/docs/tutorials/menu/)
[ALCOM](https://vrc-get.anatawa12.com/ja/alcom/)でModular Avatarのインストールを指定する場合があります。
インストール後、以下の手順でVPMリポジトリを追加してください。
* 「パッケージ管理」 > 「VPMリポジトリを追加」
* 「リポジトリ情報を入力」に次の値を入力し、「VPMリポジトリを追加」
* `https://vpm.nadena.dev/vpm.json`
* 以下の情報が記載されることを確認し、「VPMリポジトリを追加」
* リポジトリ名: `bd_`
* URL: 入力したURL
その後、プロジェクトの"管理"を開き、Modular Avatarの+をクリックし、「適用」をクリックしてください。
![ALCOM Install UI](alcom-install.png)
![ALCOM Install Confirm UI](alcom-install-confirm.png)
最新版にアップデートするには、バージョン番号と緑色の矢印を囲った枠内をクリックし、「適用」をクリックしてください。
![ALCOM Update UI](alcom-update.png)
## テスト版
テスト版のドキュメントは[こちら](https://modular-avatar.nadena.dev/dev)にあります.
テスト版は開発中のため、バグがあったり、互換性のない変更を加える可能性があります。
バグ報告やフィードバックは[GitHubのissueページ](https://github.com/bdunderscore/modular-avatar/issues)へお願いします。
### VCCでのテスト版インストール
VCCでテスト版をインストールできるようにするには、[こちらをクリック](vcc://vpm/addRepo?url=https://vpm.nadena.dev/vpm-prerelease.json)
そして、VCCの設定画面のPackagesタブで、`bd_`のリポジトリをチェックを外し、`bd_ prerelease`のリポジトリをチェックを入れ、`Show pre-release packages`にチェックを入れてください。
![Pre-release settings](prerelease.png)
テスト版のドキュメントは[こちら](https://modular-avatar.nadena.dev/dev)にあります.
### ALCOMでのテスト版インストール
テスト版は開発中のため、バグがあったり、互換性のない変更を加える可能性があります。
バグ報告やフィードバックは[GitHubのissueページ](https://github.com/bdunderscore/modular-avatar/issues)へお願いします。
[ALCOM](https://vrc-get.anatawa12.com/ja/alcom/)でModular Avatarのインストールを指定する場合があります。
インストール後、以下の手順でVPMリポジトリを追加してください。
* 「パッケージ管理」 > 「VPMリポジトリを追加」
* 「リポジトリ情報を入力」に次の値を入力し、「VPMリポジトリを追加」
* `https://vpm.nadena.dev/vpm-prerelease.json`
* 以下の情報が記載されることを確認し、「VPMリポジトリを追加」
* リポジトリ名: `bd_ (prereleases)`
* URL: 入力したURL
VPMリポジトリの追加が完了したら、テスト版が表示されるように変更します。
* (現在「通常版」を使用している場合は)「パッケージ管理」タブで、`bd_`リポジトリのチェックを外し、`bd_ (prereleases)`リポジトリのチェックを入れてください。
* 「設定」タブで、 `VPMパッケージ` の中にある `プレリリース版のパッケージを表示する`にチェックを入れてください。
![ALCOM Change Repogitories UI](alcom-prerelease-repo.png)
![ALCOM enable Prerelease UI](alcom-prerelease-settings.png)
終わったら、プロジェクトの"管理"を開き、Modular Avatarの+をクリックし、「適用」をクリックしてください。
![ALCOM Install UI](alcom-install.png)
![ALCOM Install Confirm UI](alcom-install-confirm.png)
最新版にアップデートするには、バージョン番号と緑色の矢印を囲った枠内をクリックし、「適用」をクリックしてください。
![ALCOM Update UI](alcom-update.png)
## インストール後
インストール後は以下のチュートリアルを参照してください。
* [簡単な衣装設定](/docs/tutorials/clothing)
* [複雑な衣装設定](/docs/tutorials/adv_clothing)
* [アニメーターでトグル作成](/docs/tutorials/object_toggle/)
* [簡易メニュー作成](/docs/tutorials/menu/)

View File

@ -7286,11 +7286,11 @@ __metadata:
linkType: hard
"estree-util-value-to-estree@npm:^3.0.1":
version: 3.1.2
resolution: "estree-util-value-to-estree@npm:3.1.2"
version: 3.3.3
resolution: "estree-util-value-to-estree@npm:3.3.3"
dependencies:
"@types/estree": ^1.0.0
checksum: 31c4b9f3a2e64119b994a86d70070325b6ec238a21842669e79b0d6a7190150293616c8f38fee1c369c18bbef405064d883aa38c05311db5d0a211a30e9924d6
checksum: 73851f26715300046228cf8a36986c101d6741d7a2b024f684675e75d1191bc07b0dc069926876729efd5650343d23bffe76104221b7dc862965632302b05524
languageName: node
linkType: hard

View File

@ -1,7 +1,7 @@
{
"name": "nadena.dev.modular-avatar",
"displayName": "Modular Avatar",
"version": "1.12.3",
"version": "1.13.0-alpha.2",
"unity": "2022.3",
"description": "A suite of tools for assembling your avatar out of reusable components",
"author": {
@ -16,6 +16,6 @@
},
"vpmDependencies": {
"com.vrchat.avatars": ">=3.7.4",
"nadena.dev.ndmf": ">=1.7.4 <2.0.0-a"
"nadena.dev.ndmf": ">=1.8.0-alpha.4 <2.0.0-a"
}
}