ColliderComponent.cs 5.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161
  1. // Magica Cloth.
  2. // Copyright (c) MagicaSoft, 2020-2022.
  3. // https://magicasoft.jp
  4. using System.Collections.Generic;
  5. using UnityEngine;
  6. namespace MagicaCloth
  7. {
  8. /// <summary>
  9. /// コライダーパーティクルオブジェクト基底クラス
  10. /// </summary>
  11. public abstract class ColliderComponent : ParticleComponent
  12. {
  13. /// <summary>
  14. /// グローバルフラグ
  15. /// </summary>
  16. [SerializeField]
  17. protected bool isGlobal;
  18. [SerializeField]
  19. private Vector3 center;
  20. //=========================================================================================
  21. public Vector3 Center
  22. {
  23. get
  24. {
  25. return center;
  26. }
  27. set
  28. {
  29. center = value;
  30. ReserveDataUpdate();
  31. }
  32. }
  33. //=========================================================================================
  34. /// <summary>
  35. /// 初期化
  36. /// </summary>
  37. protected override void OnInit()
  38. {
  39. base.OnInit();
  40. // パーティクル初期化
  41. if (isGlobal)
  42. {
  43. CreateColliderParticle(0);
  44. }
  45. }
  46. /// <summary>
  47. /// 破棄
  48. /// </summary>
  49. protected override void OnDispose()
  50. {
  51. // チームからコライダーを解除する
  52. List<int> teamList = new List<int>();
  53. foreach (var teamId in particleDict.Keys)
  54. {
  55. teamList.Add(teamId);
  56. }
  57. foreach (var teamId in teamList)
  58. {
  59. RemoveColliderParticle(teamId);
  60. }
  61. base.OnDispose();
  62. }
  63. //=========================================================================================
  64. /// <summary>
  65. /// データハッシュ計算
  66. /// </summary>
  67. /// <returns></returns>
  68. public override int GetDataHash()
  69. {
  70. return isGlobal.GetDataHash();
  71. }
  72. /// <summary>
  73. /// 指定座標に最も近い衝突点pと、中心軸からのpへの方向dirを返す。
  74. /// ※エディタ計算用
  75. /// </summary>
  76. /// <param name="pos"></param>
  77. /// <param name="p">衝突点</param>
  78. /// <param name="dir">中心軸位置から衝突点へのベクトル</param>
  79. /// <param name="d">最も近い中心軸位置</param>
  80. public abstract bool CalcNearPoint(Vector3 pos, out Vector3 p, out Vector3 dir, out Vector3 d, bool skinning);
  81. /// <summary>
  82. /// 指定座標のローカル位置を返す
  83. /// ※エディタ計算用
  84. /// </summary>
  85. /// <param name="pos"></param>
  86. /// <returns></returns>
  87. public Vector3 CalcLocalPos(Vector3 pos)
  88. {
  89. // スケールは含めない
  90. var rot = transform.rotation;
  91. var v = pos - transform.position;
  92. return Quaternion.Inverse(rot) * v;
  93. }
  94. /// <summary>
  95. /// 指定方向のローカル方向を返す
  96. /// ※エディタ計算用
  97. /// </summary>
  98. /// <param name="dir"></param>
  99. /// <returns></returns>
  100. public Vector3 CalcLocalDir(Vector3 dir)
  101. {
  102. return transform.InverseTransformDirection(dir);
  103. }
  104. /// <summary>
  105. /// 指定チーム用のコライダーパーティクルを作成
  106. /// </summary>
  107. /// <param name="teamId"></param>
  108. /// <returns></returns>
  109. public ChunkData CreateColliderParticle(int teamId)
  110. {
  111. var c = CreateColliderParticleReal(teamId);
  112. // すでにアクティブならばパーティクル有効化
  113. if (c.IsValid() && Status.IsActive)
  114. EnableTeamParticle(teamId);
  115. return c;
  116. }
  117. /// <summary>
  118. /// 指定チームのコライダーパーティクルを削除
  119. /// </summary>
  120. /// <param name="teamId"></param>
  121. public void RemoveColliderParticle(int teamId)
  122. {
  123. if (MagicaPhysicsManager.IsInstance() == false)
  124. return;
  125. if (particleDict.ContainsKey(teamId))
  126. {
  127. var c = particleDict[teamId];
  128. for (int i = 0; i < c.dataLength; i++)
  129. {
  130. int pindex = c.startIndex + i;
  131. MagicaPhysicsManager.Instance.Team.RemoveCollider(teamId, pindex);
  132. }
  133. RemoveTeamParticle(teamId);
  134. }
  135. }
  136. //=========================================================================================
  137. /// <summary>
  138. /// 指定チーム用のコライダーパーティクル作成
  139. /// </summary>
  140. /// <param name="teamId"></param>
  141. /// <returns></returns>
  142. protected abstract ChunkData CreateColliderParticleReal(int teamId);
  143. }
  144. }