/// <summary> /// オートアイムーブメントが有効化される条件が揃っていれば、目ボーンの関連付けを外します。 /// </summary> /// <param name="avatar"></param> private static void DisableAutoEyeMovement(GameObject avatar) { if (!VRChatUtility.IsEnabledAutoEyeMovementInSDK2(avatar)) { return; } var eyeBones = new[] { HumanBodyBones.RightEye, HumanBodyBones.LeftEye } .Select(id => avatar.GetComponent <Animator>().GetBoneTransform(id)) .Where(bone => bone); if (eyeBones.Count() == 0) { return; } AvatarDescription avatarDescription = avatar.GetComponent <VRMHumanoidDescription>().Description; var boneLimits = avatarDescription.human.ToList(); foreach (Transform bone in eyeBones) { var index = boneLimits.FindIndex(match: limit => limit.boneName == bone.name); bone.name = bone.name.ToLower(); BoneLimit boneLimit = boneLimits[index]; boneLimit.boneName = bone.name; boneLimits[index] = boneLimit; } avatarDescription.human = boneLimits.ToArray(); ApplyAvatarDescription(avatar: avatar); }
/// <summary> /// オートアイムーブメントが有効化される条件が揃っていれば、目ボーンの関連付けを外します。 /// </summary> /// <param name="avatar"></param> private static void DisableAutoEyeMovement(GameObject avatar) { var paths = VRChatUtility.RequiredPathForAutoEyeMovement.Concat(new string[] { VRChatUtility.AutoBlinkMeshPath }); var transforms = paths.Concat(new string[] { VRChatUtility.AutoBlinkMeshPath }).Select(path => avatar.transform.Find(path)); if (transforms.Contains(value: null)) { return; } var renderer = avatar.transform.Find(VRChatUtility.AutoBlinkMeshPath).gameObject.GetOrAddComponent <SkinnedMeshRenderer>(); Mesh mesh = renderer.sharedMesh; if (!mesh || mesh.blendShapeCount < BlendShapeReplacer.OrderedBlinkGeneratedByCatsBlenderPlugin.Count()) { return; } var eyeBones = new[] { HumanBodyBones.RightEye, HumanBodyBones.LeftEye } .Select(id => avatar.GetComponent <Animator>().GetBoneTransform(id)) .Where(bone => bone && transforms.Contains(value: bone)); if (eyeBones.Count() == 0) { return; } AvatarDescription avatarDescription = avatar.GetComponent <VRMHumanoidDescription>().Description; var boneLimits = avatarDescription.human.ToList(); foreach (Transform bone in eyeBones) { int index = boneLimits.FindIndex(match: limit => limit.boneName == bone.name); bone.name = bone.name.ToLower(); BoneLimit boneLimit = boneLimits[index]; boneLimit.boneName = bone.name; boneLimits[index] = boneLimit; } avatarDescription.human = boneLimits.ToArray(); ApplyAvatarDescription(avatar: avatar); }