2025-07-15 14:22:42 +05:00

119 lines
3.3 KiB
C#

namespace ArionDigital
{
using UnityEngine;
public class CrashCrate : MonoBehaviour
{
[Header("Fractured Crate")]
public GameObject[] crackPiecesPerTap;
[Header("Audio")]
public AudioSource audioSource;
public AudioClip crackSound;
public AudioClip crashSound;
public Animator dogAnimator;
private int hitCount = 0;
private const int maxHits = 5;
void Start()
{
foreach (var piece in crackPiecesPerTap)
{
if (piece != null)
{
piece.SetActive(true); // ✅ keep visible
var rb = piece.GetComponent<Rigidbody>();
if (rb) rb.isKinematic = true; // ✅ freeze physics
}
}
}
void Update()
{
if (Input.GetMouseButtonDown(0))
{
Ray ray = Camera.main.ScreenPointToRay(Input.mousePosition);
if (Physics.Raycast(ray, out RaycastHit hit))
{
GameObject touchedObject = hit.collider.gameObject;
// Check if the tapped object is in our list
for (int i = 0; i < crackPiecesPerTap.Length; i++)
{
if (crackPiecesPerTap[i] == touchedObject)
{
RegisterHit(i);
break;
}
}
}
}
}
private void RegisterHit(int index)
{
hitCount++;
if (hitCount < maxHits)
{
var piece = crackPiecesPerTap[index];
var rb = piece.GetComponent<Rigidbody>();
if (rb && rb.isKinematic)
{
rb.isKinematic = false;
Vector3 explosionOrigin = transform.position + Random.insideUnitSphere * 0.5f;
explosionOrigin.y = transform.position.y - 0.5f; // keep the force coming from slightly below
rb.AddExplosionForce(10f, explosionOrigin, 2f, 0.5f, ForceMode.Impulse);
}
if (crackSound && audioSource)
audioSource.PlayOneShot(crackSound);
}
else
{
BreakCrate();
}
}
private void BreakCrate()
{
foreach (var piece in crackPiecesPerTap)
{
if (piece != null)
{
var rb = piece.GetComponent<Rigidbody>();
if (rb && rb.isKinematic)
{
rb.isKinematic = false;
rb.AddExplosionForce(300f, transform.position, 2f);
}
}
}
if (crashSound && audioSource)
audioSource.PlayOneShot(crashSound);
if (dogAnimator)
dogAnimator.SetInteger("state", 1);
Invoke(nameof(Destroyer), 1f);
}
private void Destroyer()
{
gameObject.SetActive(false);
}
[ContextMenu("Test Hit Index 0")]
public void Test()
{
RegisterHit(0);
}
}
}