// Magica Cloth. // Copyright (c) MagicaSoft, 2020-2022. // https://magicasoft.jp using System.Collections.Generic; using UnityEngine; namespace MagicaCloth { /// /// アバターパーツコンポーネント /// [HelpURL("https://magicasoft.jp/avatar-parts/")] [AddComponentMenu("MagicaCloth/MagicaAvatarParts")] public class MagicaAvatarParts : BaseComponent, IDataVerify { //============================================================================================= /// /// 親アバター /// private MagicaAvatar parentAvatar = null; /// /// このアバターパーツが保持するボーン辞書 /// private Dictionary boneDict = new Dictionary(); /// /// このアバターパーツが保持するMagicaコンポーネントのリスト /// private List magicaComponentList = null; //========================================================================================= public override ComponentType GetComponentType() { return ComponentType.AvatarParts; } //============================================================================================= public MagicaAvatar ParentAvatar { get { return parentAvatar; } set { parentAvatar = value; } } public bool HasParent { get { return parentAvatar != null; } } public int PartsId { get { return GetInstanceID(); } } //============================================================================================= private void OnDestroy() { Dispose(); } //============================================================================================= /// /// 破棄 /// public void Dispose() { // 親から削除する if (parentAvatar != null) { parentAvatar.DetachAvatarParts(gameObject); parentAvatar = null; } } //============================================================================================= /// /// ゲームオブジェクト名が重複するトランスフォームのリストを返す /// /// public List CheckOverlappingTransform() { var boneHash = new HashSet(); var overlapList = new List(); var tlist = GetComponentsInChildren(); var root = transform; foreach (var t in tlist) { if (t == root) continue; if (boneHash.Contains(t.name)) { overlapList.Add(t); } else { boneHash.Add(t.name); } } return overlapList; } /// /// すべてのボーンを辞書に登録して返す /// この時にボーン名に重複があると着せ替えのときに問題を起こす可能性がある /// public Dictionary GetBoneDict() { if (boneDict.Count > 0) return boneDict; boneDict.Clear(); var tlist = GetComponentsInChildren(); foreach (var t in tlist) { if (boneDict.ContainsKey(t.name)) { // Duplication name! Debug.LogWarning(string.Format("{0} [{1}]", Define.GetErrorMessage(Define.Error.OverlappingTransform), t.name)); } else { boneDict.Add(t.name, t); } } //Debug.Log("boneDict:" + boneDict.Count); return boneDict; } /// /// このアバターパーツが保持するMagicaコンポーネントのリストを返す /// /// public List GetMagicaComponentList() { if (magicaComponentList != null) return magicaComponentList; magicaComponentList = new List(GetComponentsInChildren()); return magicaComponentList; } //============================================================================================= public int GetVersion() { return 1; } public void CreateVerifyData() { throw new System.NotImplementedException(); } public Define.Error VerifyData() { if (Application.isPlaying) { // 実行中 return Define.Error.None; } else { // エディット中 // 重複トランスフォームチェック var olist = CheckOverlappingTransform(); if (olist.Count > 0) return Define.Error.OverlappingTransform; return Define.Error.None; } } public string GetInformation() { StaticStringBuilder.Clear(); if (Application.isPlaying) { // 実行中 if (ParentAvatar) { StaticStringBuilder.Append("Connection parent avatar:"); StaticStringBuilder.AppendLine(); StaticStringBuilder.Append(" [", ParentAvatar.name, "]"); } else { StaticStringBuilder.Append("No connection."); } } else { // エディット中 // 重複トランスフォームチェック var olist = CheckOverlappingTransform(); if (olist.Count > 0) { StaticStringBuilder.Append("There are duplicate game object names."); foreach (var t in olist) { StaticStringBuilder.AppendLine(); StaticStringBuilder.Append("* ", t.name); } } else { StaticStringBuilder.Append("No problem."); } } return StaticStringBuilder.ToString(); } } }