void SelectAvatarDescriptor(VRC.SDK3.Avatars.Components.VRCAvatarDescriptor desc) { if (desc == activeDescriptor) { return; } activeDescriptor = desc; if (activeDescriptor != null) { //Init stage parameters int paramCount = desc.GetExpressionParameterCount(); parameterNames = new string[paramCount + 1]; parameterNames[0] = "[None]"; for (int i = 0; i < paramCount; i++) { var param = desc.GetExpressionParameter(i); string name = "[None]"; if (param != null && !string.IsNullOrEmpty(param.name)) { name = string.Format("{0}, {1}", param.name, param.valueType.ToString(), i + 1); } parameterNames[i + 1] = name; } } else { parameterNames = null; } }
public IEnumerable <ValidateResult> Validate(VRCAvatarDescriptor avatar) { if (avatar.expressionsMenu is null) { return(Enumerable.Empty <ValidateResult>()); } return(ValidateExpressionsMenu(avatar.expressionsMenu)); }
public IEnumerable <ValidateResult> Validate(VRCAvatarDescriptor avatar) { // Write validation code. // Return validation result if have error. yield return(new ValidateResult( null, ValidateResult.ValidateResultType.Error, "Write result message.")); }
public IEnumerable <ValidateResult> Validate(VRCAvatarDescriptor avatar) { var humanoidBoneNames = Enum.GetNames(typeof(HumanBodyBones)) .SelectMany(n => new string[] { n, ToContainSpace(n) }) .Distinct() .ToArray(); var playableLayers = VRCAvatarUtility.GetBaseAnimationLayers(avatar); if (!playableLayers.Any()) { yield break; } foreach (var playableLayer in playableLayers) { if (playableLayer.type == VRCAvatarDescriptor.AnimLayerType.FX) { continue; } var animatorController = playableLayer.animatorController as AnimatorController; if (animatorController is null) { continue; } foreach (var state in animatorController.layers.SelectMany(l => l.stateMachine.states)) { var clip = state.state.motion as AnimationClip; if (clip is null) { continue; } foreach (var binding in AnimationUtility.GetCurveBindings(clip)) { // Transformを操作するもの以外が含まれているか検出 if (binding.type != typeof(Transform) && !(binding.type == typeof(Animator) && humanoidBoneNames.Any(n => binding.propertyName.StartsWith(n)))) { yield return(new ValidateResult( clip, ValidateResult.ValidateResultType.Error, $"{clip.name} have key changed other than Transform")); } } } } }
public void Start() { LyumaAv3Emulator[] emulators = FindObjectsOfType <LyumaAv3Emulator>(); if (emulators == null || emulators.Length == 0) { return; } emulator = emulators[0]; if (emulator != null && emulator.runtimes != null) { if (emulator.runtimes.Count > 0) { avatarDescriptor = emulator.runtimes[0].GetComponent <VRC.SDK3.Avatars.Components.VRCAvatarDescriptor>(); } } }
public IEnumerable <ValidateResult> Validate(VRCAvatarDescriptor avatar) { var exParamsAsset = VRCAvatarUtility.GetExpressionParametersAsset(avatar); if (exParamsAsset is null) { yield break; } var exParams = exParamsAsset.parameters.Where(p => !string.IsNullOrEmpty(p.name)).ToArray(); if (!exParams.Any()) { yield break; } var parameterlist = VRCAvatarUtility.GetParameters(avatar.baseAnimationLayers.Select(l => l.animatorController as AnimatorController)); bool found = false; foreach (var exParam in exParams) { var exParamName = exParam.name; var exParamType = exParam.valueType == VRCExpressionParameters.ValueType.Float ? AnimatorControllerParameterType.Float : AnimatorControllerParameterType.Int; found = false; foreach (var param in parameterlist) { if (exParamName == param.name && exParamType == param.type) { found = true; break; } } if (!found) { yield return(new ValidateResult( exParamsAsset, ValidateResult.ValidateResultType.Error, $"{exParamName} is not found in AnimatorControllers")); } } }
public IEnumerable <ValidateResult> Validate(VRCAvatarDescriptor avatar) { var animationClips = VRCAvatarUtility.GetAnimationClips(avatar); foreach (var animationClip in animationClips) { foreach (var binding in AnimationUtility.GetCurveBindings(animationClip)) { if (!avatar.transform.Find(binding.path)) { yield return(new ValidateResult( animationClip, ValidateResult.ValidateResultType.Warning, $"`{animationClip.name}` have missing path. ({binding.path})")); } } } }
public IEnumerable <ValidateResult> Validate(VRCAvatarDescriptor avatar) { var controllers = VRCAvatarUtility.GetControllers(avatar); foreach (var controller in controllers) { // 一番上のLayerは内部的にweight0であっても強制的に1になるので調べない for (int i = 1; i < controller.layers.Length; i++) { var layer = controller.layers[i]; if (layer.defaultWeight == 0) { yield return(new ValidateResult( controller, ValidateResult.ValidateResultType.Warning, $"`{layer.name}` Layer in {controller.name} is weight 0.")); } } } }
void SelectAvatarDescriptor(VRC.SDK3.Avatars.Components.VRCAvatarDescriptor desc) { if (desc == activeDescriptor) { return; } activeDescriptor = desc; if (activeDescriptor != null) { //Init stage parameters for (int i = 0; i < 16; i++) { InitStage(i); } void InitStage(int i) { var param = desc.GetExpressionParameter(i); string name = "[None]"; if (param != null && !string.IsNullOrEmpty(param.name)) { name = string.Format("{0}, {1}", param.name, param.valueType.ToString(), i + 1); } ParameterNames[i + 1] = name; } } else { //Clear for (int i = 0; i < 16; i++) { ParameterNames[i + 1] = "[None]"; } } }
public static IEnumerable <AnimationClip> GetAnimationClips(VRCAvatarDescriptor avatar) => GetControllers(avatar) .SelectMany(controller => controller.animationClips);
public static VRCExpressionParameters GetExpressionParametersAsset(VRCAvatarDescriptor avatar) => avatar.expressionParameters;
public static IEnumerable <VRCAvatarDescriptor.CustomAnimLayer> GetBaseAnimationLayers(VRCAvatarDescriptor avatar) => avatar.baseAnimationLayers .Where(l => l.animatorController != null);
public static IEnumerable <AnimatorController> GetControllers(VRCAvatarDescriptor avatar) => avatar.baseAnimationLayers .Union(avatar.specialAnimationLayers) .Select(l => l.animatorController as AnimatorController) .Where(c => c != null);
public static Dictionary <int, IEnumerable <ValidateResult> > ValidateAvatars3(VRCAvatarDescriptor avatar, IEnumerable <RuleItem> rules) { return(rules.Select((rule, index) => new { Rule = rule, Index = index }) .Where(rulePair => rulePair.Rule.Enabled) .Select(rulePair => { var rule = RuleUtility.FilePath2IRule(rulePair.Rule.FilePath); var results = rule.Validate(avatar); return new KeyValuePair <int, IEnumerable <ValidateResult> >(rulePair.Index + 1, results); }) .ToDictionary(resultPair => resultPair.Key, resultPair => resultPair.Value)); }
public void OnSwitchAvatar(VRCAvatarDescriptor avatar) { this.avatar = avatar; HasNeverValided = true; }