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