// Magica Cloth.
// Copyright (c) MagicaSoft, 2020-2022.
// https://magicasoft.jp
using System.Collections.Generic;
using UnityEngine;
namespace MagicaCloth
{
///
/// 各チームのデータ
///
[System.Serializable]
public class PhysicsTeamData : IDataHash
{
// チーム固有のコライダーリスト
[SerializeField]
private List colliderList = new List();
///
/// 移動制限で無視するコライダーリスト
///
[SerializeField]
private List penetrationIgnoreColliderList = new List();
///
/// スキニング用ボーンリスト
///
//[SerializeField]
//private List skinningBoneList = new List();
///
/// 親アバターのコライダーを結合するかどうか
///
[SerializeField]
private bool mergeAvatarCollider = true;
//=========================================================================================
///
/// ランタイムに追加されたコライダー
///
private List addColliderList = new List();
//=========================================================================================
///
/// データハッシュを求める
///
///
public int GetDataHash()
{
return colliderList.GetDataHash();
}
//=========================================================================================
public void Init(int teamId)
{
// コライダーをチームに参加させる
foreach (var collider in colliderList)
{
if (collider)
{
collider.CreateColliderParticle(teamId);
}
}
}
public void Dispose(int teamId)
{
if (MagicaPhysicsManager.IsInstance())
{
// コライダーをチームから除外する
foreach (var collider in colliderList)
{
if (collider)
{
collider.RemoveColliderParticle(teamId);
}
}
// 追加されたコライダーをチームから除外する
foreach (var collider in addColliderList)
{
if (collider)
{
collider.RemoveColliderParticle(teamId);
}
}
addColliderList.Clear();
}
}
///
/// ランタイム追加されたコライダーを管理リストに登録する
///
///
public void AddCollider(ColliderComponent collider)
{
if (collider && addColliderList.Contains(collider) == false)
addColliderList.Add(collider);
}
///
/// ランタイム追加されたコライダーを管理リストから削除する
///
///
public void RemoveCollider(ColliderComponent collider)
{
if (collider && addColliderList.Contains(collider))
addColliderList.Remove(collider);
}
///
/// コライダーなどの外部パーティクルの状態を更新する
///
internal void UpdateStatus()
{
foreach (var collider in colliderList)
collider.UpdateStatus();
}
//=========================================================================================
public int ColliderCount
{
get
{
return colliderList.Count;
}
}
public List ColliderList
{
get
{
return colliderList;
}
}
public List PenetrationIgnoreColliderList
{
get
{
return penetrationIgnoreColliderList;
}
}
//public List SkinningBoneList => skinningBoneList;
public bool MergeAvatarCollider
{
get
{
return mergeAvatarCollider;
}
}
//=========================================================================================
///
/// コライダーリスト検証
///
public void ValidateColliderList()
{
// コライダーのnullや重複を削除する
ShareDataObject.RemoveNullAndDuplication(colliderList);
}
}
}