using System.Collections.Generic; using System.Linq; using RotateParticle; using RotateParticle.Components; using SphereTriangle; using UnityEngine; namespace UniVRM10.Cloth.Viewer { public static class ClothGuess { public enum StrandConnectionType { Cloth, ClothLoop, Strand, } public static void Guess(Animator animator) { // skirt { if (TryAddGroup(animator, HumanBodyBones.Hips, new[] { "skirt", "スカート", "スカート" }, out var g)) { var c = g[0].gameObject.AddComponent(); c.Warps = g; c.LoopIsClosed = true; } } { if (TryAddGroupChildChild(animator, HumanBodyBones.Hips, new[] { "skirt", "スカート", "スカート" }, new string[] { }, out var g)) { var c = g[0].gameObject.AddComponent(); c.Warps = g; c.LoopIsClosed = true; } } { if (TryAddGroup(animator, HumanBodyBones.Head, new[] { "髪", "hair" }, out var g)) { } } { if (TryAddGroup(animator, HumanBodyBones.Hips, new[] { "裾" }, out var g)) { var c = g[0].gameObject.AddComponent(); c.Warps = g; } } { if (TryAddGroupChildChild(animator, HumanBodyBones.LeftUpperArm, new[] { "袖" }, new[] { "ひじ袖" }, out var g)) { var c = g[0].gameObject.AddComponent(); c.Warps = g; c.LoopIsClosed = true; } } { if (TryAddGroupChildChild(animator, HumanBodyBones.LeftLowerArm, new[] { "袖" }, new string[] { }, out var g)) { var c = g[0].gameObject.AddComponent(); c.Warps = g; c.LoopIsClosed = true; } } { if (TryAddGroupChildChild(animator, HumanBodyBones.RightUpperArm, new[] { "袖" }, new[] { "ひじ袖" }, out var g)) { var c = g[0].gameObject.AddComponent(); c.Warps = g; c.LoopIsClosed = true; } } { if (TryAddGroupChildChild(animator, HumanBodyBones.RightLowerArm, new[] { "袖" }, new string[] { }, out var g)) { var c = g[0].gameObject.AddComponent(); c.Warps = g; } } { if (TryAddGroup(animator, HumanBodyBones.Chest, new[] { "マント" }, out var g)) { var c = g[0].gameObject.AddComponent(); c.Warps = g; } } } /// /// /// /// /// /// /// /// /// /// /// /// /// static bool TryAddGroupChildChild( Animator animator, HumanBodyBones humanBone, string[] targets, string[] excludes, out List group) { var bone = animator.GetBoneTransform(humanBone); if (bone == null) { Debug.LogWarning($"{humanBone} not found"); group = default; return false; } List transforms = new(); foreach (Transform child in bone) { foreach (Transform childchild in child) { if (excludes.Any(x => childchild.name.ToLower().Contains(x.ToLower()))) { continue; } foreach (var target in targets) { if (childchild.name.ToLower().Contains(target.ToLower())) { var warp = childchild.gameObject.AddComponent(); // Name = name, // CollisionMask = mask, warp.BaseSettings.radius = 0.02f; warp.AddParticleRecursive(); // Connection = type transforms.Add(warp); break; } } } } if (transforms.Count == 0) { // Debug.LogWarning($"{string.Join(',', targets)} not found"); group = default; return false; } group = transforms; return true; } static bool TryAddGroup(Animator animator, HumanBodyBones humanBone, string[] targets, out List group) { var bone = animator.GetBoneTransform(humanBone); if (bone == null) { Debug.LogWarning($"{humanBone} not found"); group = default; return false; } List transforms = new(); foreach (Transform child in bone) { foreach (var target in targets) { if (child.name.ToLower().Contains(target.ToLower())) { var warp = child.gameObject.AddComponent(); if (warp != null) { // CollisionMask = mask, warp.BaseSettings.radius = 0.02f; warp.AddParticleRecursive(); // Connection = type transforms.Add(warp); } break; } } } if (transforms.Count == 0) { // Debug.LogWarning($"{string.Join(',', targets)} not found"); group = default; return false; } group = transforms; return true; } } }