Advertisement
DugganSC

Crate.cs

Dec 22nd, 2023
536
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C# 3.48 KB | None | 0 0
  1. using System.Collections;
  2. using System.Collections.Generic;
  3. using UnityEngine;
  4.  
  5. namespace Game.Scripts.LiveObjects
  6. {
  7.     public class Crate : MonoBehaviour
  8.     {
  9.         [SerializeField] private float _punchDelay;
  10.         [SerializeField] private GameObject _wholeCrate, _brokenCrate;
  11.         [SerializeField] private Rigidbody[] _pieces;
  12.         [SerializeField] private BoxCollider _crateCollider;
  13.         [SerializeField] private InteractableZone _interactableZone;
  14.         private bool _isReadyToBreak = false;
  15.  
  16.         private List<Rigidbody> _breakingPieces = new List<Rigidbody>();
  17.         private float _holdStarted = 0;
  18.         [SerializeField] private float _holdDelay = 0.5f;
  19.  
  20.         private void OnEnable()
  21.         {
  22.             InteractableZone.onZoneInteractionComplete += InteractableZone_onZoneInteractionComplete;
  23.             InteractableZone.onHoldStarted += InteractableZone_onHoldStarted;
  24.             InteractableZone.onHoldEnded += InteractableZone_onHoldEnded;
  25.         }
  26.  
  27.         private void InteractableZone_onHoldStarted(int obj)
  28.         {
  29.             if (_isReadyToBreak)
  30.             {
  31.                 Debug.Log("Hold started");
  32.  
  33.                 _holdStarted = Time.time;
  34.             }
  35.         }
  36.  
  37.         private void InteractableZone_onHoldEnded(int obj)
  38.         {
  39.             if (_isReadyToBreak)
  40.             {
  41.                 Debug.Log("Hold ended");
  42.                 if (_holdStarted <= Time.time + _holdDelay)
  43.                 {
  44.                     int parts = Random.Range(3, 6);
  45.                     for (int i = 0; i < parts; i++)
  46.                     {
  47.                         BreakPart();
  48.                     }
  49.                 }
  50.                 else
  51.                 {
  52.                     // Otherwise, single strike
  53.                     BreakPart();
  54.                 }
  55.             }
  56.         }
  57.  
  58.         private void InteractableZone_onZoneInteractionComplete(InteractableZone zone)
  59.         {
  60.             Debug.Log("Interaction Zone complete");
  61.             if (_isReadyToBreak == false && _breakingPieces.Count >0)
  62.             {
  63.                 _wholeCrate.SetActive(false);
  64.                 _brokenCrate.SetActive(true);
  65.                 _isReadyToBreak = true;
  66.             }            
  67.         }
  68.  
  69.         private void Start()
  70.         {
  71.             _breakingPieces.AddRange(_pieces);            
  72.         }
  73.  
  74.  
  75.  
  76.         public void BreakPart()
  77.         {
  78.             if (_breakingPieces.Count > 0)
  79.             {
  80.                 int rng = Random.Range(0, _breakingPieces.Count);
  81.                 _breakingPieces[rng].constraints = RigidbodyConstraints.None;
  82.                 _breakingPieces[rng].AddForce(new Vector3(1f, 1f, 1f), ForceMode.Force);
  83.                 _breakingPieces.Remove(_breakingPieces[rng]);
  84.             } else
  85.             {
  86.                 _isReadyToBreak = false;
  87.                 _crateCollider.enabled = false;
  88.                 _interactableZone.CompleteTask(6);
  89.                 Debug.Log("Completely Busted");
  90.             }
  91.         }
  92.  
  93.         IEnumerator PunchDelay()
  94.         {
  95.             float delayTimer = 0;
  96.             while (delayTimer < _punchDelay)
  97.             {
  98.                 yield return new WaitForEndOfFrame();
  99.                 delayTimer += Time.deltaTime;
  100.             }
  101.  
  102.             _interactableZone.ResetAction(6);
  103.         }
  104.  
  105.         private void OnDisable()
  106.         {
  107.             InteractableZone.onZoneInteractionComplete -= InteractableZone_onZoneInteractionComplete;
  108.         }
  109.     }
  110. }
  111.  
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement