// 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();
}
}
}