BreakGlass.cs 1.8 KB

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