BreakGlass.cs 1.9 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667
  1. using UnityEngine;
  2. using System.Collections;
  3. using DG.Tweening;
  4. public class BreakGlass : MonoBehaviour
  5. {
  6. private static WaitForSeconds _waitForSeconds0_15 = new WaitForSeconds(0.15f);
  7. private static WaitForSeconds _waitForSeconds0_1 = new WaitForSeconds(0.1f);
  8. //[SerializeField] private bool useGravity = false; // 重力を有効にするかどうか
  9. [SerializeField] internal Vector3 explodeVel = new Vector3(0, 0, 0f); // 爆発の中心地
  10. [SerializeField] private float explodeForce = 75000; // 爆発の威力
  11. [SerializeField] private float explodeRange = 500; // 爆発の範囲
  12. internal Rigidbody[] rigidBodies;
  13. [SerializeField] AudioClip breakGlassSE;
  14. public virtual void Init(Material material)
  15. {
  16. rigidBodies = GetComponentsInChildren<Rigidbody>();
  17. foreach (Rigidbody rb in rigidBodies)
  18. {
  19. rb.isKinematic = true;
  20. if (material != null)
  21. {
  22. rb.GetComponent<MeshRenderer>().material = material;
  23. }
  24. }
  25. }
  26. public virtual void Break()
  27. {
  28. this.gameObject.SetActive(true);
  29. StartCoroutine(BreakIenumerator());
  30. }
  31. public virtual IEnumerator BreakIenumerator()
  32. {
  33. ContinuousController.instance.PlaySE(breakGlassSE);
  34. foreach (Rigidbody rb in rigidBodies)
  35. {
  36. rb.isKinematic = false;
  37. rb.AddExplosionForce(explodeForce, transform.position + explodeVel, explodeRange);
  38. }
  39. yield return _waitForSeconds0_1;
  40. if (this is not SecurityBreakGlass)
  41. {
  42. foreach (Rigidbody rb in rigidBodies)
  43. {
  44. rb.velocity *= 20;
  45. }
  46. }
  47. yield return _waitForSeconds0_15;
  48. foreach (Rigidbody rb in rigidBodies)
  49. {
  50. rb.isKinematic = true;
  51. }
  52. gameObject.SetActive(false);
  53. }
  54. }