// Magica Cloth.
// Copyright (c) MagicaSoft, 2020-2022.
// https://magicasoft.jp
using System.Collections.Generic;
using UnityEngine;
namespace MagicaCloth
{
///
/// アバター管理コンポーネント
///
[HelpURL("https://magicasoft.jp/avatar/")]
[AddComponentMenu("MagicaCloth/MagicaAvatar")]
public partial class MagicaAvatar : CoreComponent
{
///
/// データバージョン
///
private const int DATA_VERSION = 1;
///
/// データリセットフラグ
/// ※このフラグが立つとエディタ拡張側で自動的にデータが作成される
///
[SerializeField]
private bool dataReset;
///
/// ランタイム処理
///
MagicaAvatarRuntime runtime = new MagicaAvatarRuntime();
//=========================================================================================
///
/// アバターパーツ接続イベント
/// Avatar parts attach event.
///
public AvatarPartsAttachEvent OnAttachParts = new AvatarPartsAttachEvent();
///
/// アバターパーツ分離イベント
/// Avatar parts detach event.
///
public AvatarPartsDetachEvent OnDetachParts = new AvatarPartsDetachEvent();
//=========================================================================================
public override ComponentType GetComponentType()
{
return ComponentType.Avatar;
}
//=========================================================================================
///
/// データを識別するハッシュコードを作成して返す
///
///
public override int GetDataHash()
{
int hash = 0;
return hash;
}
//=========================================================================================
public bool DataReset
{
set
{
dataReset = value;
}
get
{
return dataReset;
}
}
public MagicaAvatarRuntime Runtime
{
get
{
runtime.SetParent(this);
return runtime;
}
}
//=========================================================================================
void Reset()
{
// 自動データ作成フラグを立てる
DataReset = true;
}
void OnValidate()
{
}
protected override void OnInit()
{
Runtime.Create();
}
protected override void OnDispose()
{
Runtime.Dispose();
}
protected override void OnUpdate()
{
}
protected override void OnActive()
{
Runtime.Active();
}
protected override void OnInactive()
{
Runtime.Inactive();
}
//=========================================================================================
public override int GetVersion()
{
return DATA_VERSION;
}
///
/// エラーとするデータバージョンを取得する
///
///
public override int GetErrorVersion()
{
return 0;
}
///
/// データを検証して結果を格納する
///
///
public override void CreateVerifyData()
{
base.CreateVerifyData();
}
///
/// 現在のデータが正常(実行できる状態)か返す
///
///
public override Define.Error VerifyData()
{
if (Application.isPlaying)
{
// 実行中
return Define.Error.None;
}
else
{
// エディット中
// 重複トランスフォームチェック
var olist = Runtime.CheckOverlappingTransform();
if (olist.Count > 0)
return Define.Error.OverlappingTransform;
return Define.Error.None;
}
}
public override string GetInformation()
{
StaticStringBuilder.Clear();
if (Application.isPlaying)
{
// 実行中
if (Runtime.AvatarPartsCount > 0)
{
StaticStringBuilder.Append("Connection avatar parts:");
int cnt = Runtime.AvatarPartsCount;
for (int i = 0; i < cnt; i++)
{
StaticStringBuilder.AppendLine();
StaticStringBuilder.Append(" [", Runtime.GetAvatarParts(i).name, "]");
}
}
else
{
StaticStringBuilder.Append("No avatar parts connected.");
}
}
else
{
// エディット中
// 重複トランスフォームチェック
var olist = Runtime.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.");
}
StaticStringBuilder.AppendLine();
StaticStringBuilder.Append("Collider : ", Runtime.GetColliderCount());
}
return StaticStringBuilder.ToString();
}
//=========================================================================================
///
/// 共有データオブジェクト収集
///
///
public override List GetAllShareDataObject()
{
var slist = base.GetAllShareDataObject();
return slist;
}
///
/// sourceの共有データを複製して再セットする
/// 再セットした共有データを返す
///
///
///
public override ShareDataObject DuplicateShareDataObject(ShareDataObject source)
{
return null;
}
}
}