PhysicsTeam.cs 12 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408
  1. // Magica Cloth.
  2. // Copyright (c) MagicaSoft, 2020-2022.
  3. // https://magicasoft.jp
  4. using Unity.Mathematics;
  5. using UnityEngine;
  6. namespace MagicaCloth
  7. {
  8. /// <summary>
  9. /// 物理チーム
  10. /// 特定のパーティクルと機能を1つのチームとして管理します。
  11. /// 当たり判定はチーム内部のパーティクルに対してのみ有効です。
  12. /// これによりチームごとに独立した環境を構築することが可能です。
  13. /// 例:キャラクタAとBは当たり判定が干渉しないようにする
  14. /// </summary>
  15. public abstract class PhysicsTeam : CoreComponent
  16. {
  17. [SerializeField]
  18. protected PhysicsTeamData teamData = new PhysicsTeamData();
  19. /// <summary>
  20. /// ユーザー設定ブレンド率
  21. /// </summary>
  22. [SerializeField]
  23. private float userBlendWeight = 1.0f;
  24. /// <summary>
  25. /// 更新モード
  26. /// </summary>
  27. public enum TeamUpdateMode
  28. {
  29. Normal = 0,
  30. UnityPhysics = 1,
  31. }
  32. [SerializeField]
  33. private TeamUpdateMode updateMode = TeamUpdateMode.Normal;
  34. /// <summary>
  35. /// カリングモード(数値が高いほど優先)
  36. /// </summary>
  37. public enum TeamCullingMode
  38. {
  39. Reset = 0,
  40. Pause = 10,
  41. Off = 100,
  42. }
  43. [SerializeField]
  44. private TeamCullingMode cullingMode = TeamCullingMode.Reset;
  45. /// <summary>
  46. /// スキニングモード
  47. /// さらにNone以外の設定では計算時にアニメーション化された姿勢を利用するようになる(旧UseAnimatedDistanceフラグ)
  48. /// </summary>
  49. public enum TeamSkinningMode
  50. {
  51. None = 0,
  52. UserAnimation = 1,
  53. //GenerateFromBones = 2,
  54. }
  55. [SerializeField]
  56. private TeamSkinningMode skinningMode = TeamSkinningMode.UserAnimation;
  57. //[SerializeField]
  58. //private bool skinningUpdateFixed = false;
  59. //=========================================================================================
  60. /// <summary>
  61. /// この物理チームのID
  62. /// </summary>
  63. protected int teamId = -1;
  64. /// <summary>
  65. /// この物理チームで管理するパーティクル
  66. /// </summary>
  67. protected ChunkData particleChunk = new ChunkData();
  68. /// <summary>
  69. /// 速度影響/ワープ判定トランスフォーム
  70. /// </summary>
  71. protected Transform influenceTarget;
  72. //=========================================================================================
  73. /// <summary>
  74. /// データハッシュを求める
  75. /// </summary>
  76. /// <returns></returns>
  77. public override int GetDataHash()
  78. {
  79. int hash = teamData.GetDataHash();
  80. return hash;
  81. }
  82. //=========================================================================================
  83. public int TeamId
  84. {
  85. get
  86. {
  87. return teamId;
  88. }
  89. }
  90. public PhysicsTeamData TeamData
  91. {
  92. get
  93. {
  94. return teamData;
  95. }
  96. }
  97. public ChunkData ParticleChunk
  98. {
  99. get
  100. {
  101. return particleChunk;
  102. }
  103. }
  104. public Transform InfluenceTarget
  105. {
  106. set
  107. {
  108. influenceTarget = value;
  109. }
  110. get
  111. {
  112. return influenceTarget;
  113. }
  114. }
  115. public float UserBlendWeight
  116. {
  117. get
  118. {
  119. return userBlendWeight;
  120. }
  121. set
  122. {
  123. userBlendWeight = Mathf.Clamp01(value);
  124. }
  125. }
  126. public TeamUpdateMode UpdateMode
  127. {
  128. get
  129. {
  130. return updateMode;
  131. }
  132. protected set
  133. {
  134. updateMode = value;
  135. }
  136. }
  137. public TeamCullingMode CullingMode
  138. {
  139. get
  140. {
  141. return cullingMode;
  142. }
  143. set
  144. {
  145. cullingMode = value;
  146. }
  147. }
  148. public TeamSkinningMode SkinningMode
  149. {
  150. get => skinningMode;
  151. set => skinningMode = value;
  152. }
  153. //public bool SkinningUpdateFixed
  154. //{
  155. // get => skinningUpdateFixed;
  156. // set => skinningUpdateFixed = value;
  157. //}
  158. /// <summary>
  159. /// 計算に使用する距離/回転を常にアニメーション後の姿勢から取得するかどうか
  160. /// </summary>
  161. internal bool UseAnimatedPose
  162. {
  163. get
  164. {
  165. //return skinningMode == TeamSkinningMode.UserAnimation || skinningMode == TeamSkinningMode.GenerateFromBones;
  166. return skinningMode == TeamSkinningMode.UserAnimation;
  167. }
  168. }
  169. //=========================================================================================
  170. protected override void OnInit()
  171. {
  172. // チーム作成
  173. teamId = MagicaPhysicsManager.Instance.Team.CreateTeam(this, 0);
  174. TeamData.Init(TeamId);
  175. }
  176. /// <summary>
  177. /// 破棄
  178. /// 通常はOnDestroy()で呼ぶ
  179. /// </summary>
  180. protected override void OnDispose()
  181. {
  182. // 破棄
  183. if (TeamId >= 0)
  184. {
  185. TeamData.Dispose(TeamId);
  186. // チーム削除
  187. if (MagicaPhysicsManager.IsInstance())
  188. MagicaPhysicsManager.Instance.Team.RemoveTeam(teamId);
  189. }
  190. }
  191. /// <summary>
  192. /// 更新
  193. /// </summary>
  194. protected override void OnUpdate()
  195. {
  196. }
  197. /// <summary>
  198. /// 実行状態に入った場合に呼ばれます
  199. /// </summary>
  200. protected override void OnActive()
  201. {
  202. // チーム有効化
  203. MagicaPhysicsManager.Instance.Team.SetEnable(teamId, true);
  204. }
  205. /// <summary>
  206. /// 実行状態から抜けた場合に呼ばれます
  207. /// </summary>
  208. protected override void OnInactive()
  209. {
  210. if (MagicaPhysicsManager.IsInstance())
  211. {
  212. // チーム無効化
  213. MagicaPhysicsManager.Instance.Team.SetEnable(teamId, false);
  214. }
  215. }
  216. //=========================================================================================
  217. /// <summary>
  218. /// 実行状態を取得
  219. /// </summary>
  220. /// <returns></returns>
  221. public bool IsActive()
  222. {
  223. if (MagicaPhysicsManager.IsInstance())
  224. return MagicaPhysicsManager.Instance.Team.IsActive(teamId);
  225. else
  226. return false;
  227. }
  228. /// <summary>
  229. /// チームデータが存在するか判定
  230. /// </summary>
  231. /// <returns></returns>
  232. public bool IsValid()
  233. {
  234. if (MagicaPhysicsManager.IsInstance())
  235. return MagicaPhysicsManager.Instance.Team.IsValid(teamId);
  236. else
  237. return false;
  238. }
  239. //=========================================================================================
  240. /// <summary>
  241. /// パーティクルを1つ追加
  242. /// </summary>
  243. /// <param name="flag"></param>
  244. /// <param name="team"></param>
  245. /// <param name="wpos"></param>
  246. /// <param name="wrot"></param>
  247. /// <param name="lpos"></param>
  248. /// <param name="lrot"></param>
  249. /// <param name="radius"></param>
  250. /// <param name="mass"></param>
  251. /// <param name="gravity"></param>
  252. /// <param name="drag"></param>
  253. /// <param name="depth"></param>
  254. /// <param name="maxVelocity"></param>
  255. /// <param name="target"></param>
  256. /// <param name="targetLocalPos"></param>
  257. /// <returns></returns>
  258. //public ChunkData CreateParticle(
  259. // uint flag,
  260. // int team,
  261. // float3 wpos, quaternion wrot,
  262. // float3 lpos, quaternion lrot,
  263. // float depth,
  264. // float radius,
  265. // Transform target, float3 targetLocalPos
  266. // )
  267. //{
  268. // var c = MagicaPhysicsManager.Instance.Particle.CreateParticle(
  269. // flag,
  270. // team,
  271. // wpos, wrot,
  272. // lpos, lrot,
  273. // depth,
  274. // radius,
  275. // target, targetLocalPos
  276. // );
  277. // // チームパーティクルとして管理する
  278. // particleChunk = c;
  279. // return c;
  280. //}
  281. /// <summary>
  282. /// パーティクルをグループで追加
  283. /// </summary>
  284. /// <param name="team"></param>
  285. /// <param name="count"></param>
  286. /// <param name="funcFlag"></param>
  287. /// <param name="funcWpos"></param>
  288. /// <param name="funcWrot"></param>
  289. /// <param name="funcLpos"></param>
  290. /// <param name="funcLrot"></param>
  291. /// <param name="funcRadius"></param>
  292. /// <param name="funcMass"></param>
  293. /// <param name="funcGravity"></param>
  294. /// <param name="funcDrag"></param>
  295. /// <param name="funcDepth"></param>
  296. /// <param name="funcMaxVelocity"></param>
  297. /// <param name="funcTarget"></param>
  298. /// <param name="funcTargetLocalPos"></param>
  299. /// <returns></returns>
  300. public ChunkData CreateParticle(
  301. int team,
  302. int count,
  303. System.Func<int, uint> funcFlag,
  304. System.Func<int, float3> funcWpos,
  305. System.Func<int, quaternion> funcWrot,
  306. System.Func<int, float> funcDepth,
  307. System.Func<int, float3> funcRadius,
  308. System.Func<int, float3> funcTargetLocalPos
  309. )
  310. {
  311. var c = MagicaPhysicsManager.Instance.Particle.CreateParticle(
  312. team,
  313. count,
  314. funcFlag,
  315. funcWpos,
  316. funcWrot,
  317. funcDepth,
  318. funcRadius,
  319. funcTargetLocalPos
  320. );
  321. // チームパーティクルとして管理する
  322. particleChunk = c;
  323. return c;
  324. }
  325. /// <summary>
  326. /// パーティクル削除(全体のみ)
  327. /// </summary>
  328. public void RemoveAllParticle()
  329. {
  330. MagicaPhysicsManager.Instance.Particle.RemoveParticle(particleChunk);
  331. particleChunk.Clear();
  332. }
  333. /// <summary>
  334. /// 管理するパーティクルを有効化する
  335. /// </summary>
  336. public void EnableParticle(
  337. System.Func<int, Transform> funcTarget,
  338. System.Func<int, float3> funcLpos,
  339. System.Func<int, quaternion> funcLrot
  340. )
  341. {
  342. MagicaPhysicsManager.Instance.Particle.SetEnable(particleChunk, true, funcTarget, funcLpos, funcLrot);
  343. }
  344. /// <summary>
  345. /// 管理するパーティクルを無効化する
  346. /// </summary>
  347. public void DisableParticle(
  348. System.Func<int, Transform> funcTarget,
  349. System.Func<int, float3> funcLpos,
  350. System.Func<int, quaternion> funcLrot
  351. )
  352. {
  353. if (MagicaPhysicsManager.IsInstance())
  354. {
  355. MagicaPhysicsManager.Instance.Particle.SetEnable(particleChunk, false, funcTarget, funcLpos, funcLrot);
  356. }
  357. }
  358. //=========================================================================================
  359. /// <summary>
  360. /// 現在のデータが正常(実行できる状態)か返す
  361. /// </summary>
  362. /// <returns></returns>
  363. public override Define.Error VerifyData()
  364. {
  365. return base.VerifyData();
  366. }
  367. }
  368. }