using UnityEngine; using System.Collections; public class Reel : MonoBehaviour { public FaceScriptableObject[] faces; // Array of face scriptable objects public float faceSpriteSize = 1.0f; // Size of the face sprites public float spacing = 0.5f; // Spacing between the face sprites public float baseSpinSpeed = 5.0f; // Base speed at which the faces move public float minSpinTime = 2.0f; // Minimum spin time public float maxSpinTime = 5.0f; // Maximum spin time public float faceHeightSpacing = 1.0f; // Height distance between faces public bool isSpinning { get; private set; } // Spinning status public AudioClip spinAudioClip; // Audio clip for spinning sound private AudioSource audioSource; // Reference to the AudioSource component private int winningIndex; // Store winning index private void Start() { BuildReel(); audioSource = GetComponent(); } public void BuildReel() { // Clear existing faces (if any) foreach (Transform child in transform) { Destroy(child.gameObject); } // Create and position face objects float reelHeight = faces.Length * (faceSpriteSize + faceHeightSpacing); for (int i = 0; i < faces.Length; i++) { GameObject faceObj = new GameObject("Face" + (i + 1)); faceObj.transform.SetParent(transform); faceObj.transform.localPosition = new Vector3(0, reelHeight / 2 - i * (faceSpriteSize + faceHeightSpacing), 0); SpriteRenderer faceRenderer = faceObj.AddComponent(); faceRenderer.sprite = faces[i].sprite; faceRenderer.sortingLayerName = "Reels"; faceRenderer.sortingOrder = i + 1; faceRenderer.maskInteraction = SpriteMaskInteraction.VisibleInsideMask; faceRenderer.enabled = true; // Debug log to verify face sprite assignment Debug.Log($"Reel {gameObject.name}: Face {i + 1} assigned with sprite: {faces[i].sprite.name}"); } } public void StartSpin() { isSpinning = true; // Play the spin audio if (audioSource != null && spinAudioClip != null) { audioSource.clip = spinAudioClip; audioSource.Play(); } StartCoroutine(SpinReel()); } private IEnumerator SpinReel() { float spinTime = Random.Range(minSpinTime, maxSpinTime); float spinSpeed = baseSpinSpeed * Random.Range(0.8f, 1.2f); float elapsed = 0.0f; float reelHeight = faces.Length * (faceSpriteSize + faceHeightSpacing); while (elapsed < spinTime) { elapsed += Time.deltaTime; for (int i = 0; i < faces.Length; i++) { Transform faceTransform = transform.GetChild(i); SpriteRenderer faceRenderer = faceTransform.GetComponent(); float newY = faceTransform.localPosition.y - (spinSpeed * Time.deltaTime); if (newY < -reelHeight / 2) { newY += reelHeight; } faceTransform.localPosition = new Vector3(faceTransform.localPosition.x, newY, faceTransform.localPosition.z); faceRenderer.enabled = faceTransform.localPosition.y <= reelHeight / 2 && faceTransform.localPosition.y >= -reelHeight / 2; } yield return null; } Transform closestFace = null; float closestDistance = float.MaxValue; for (int i = 0; i < faces.Length; i++) { Transform faceTransform = transform.GetChild(i); float distance = Mathf.Abs(faceTransform.localPosition.y); if (distance < closestDistance) { closestDistance = distance; closestFace = faceTransform; } } float centerY = 0; closestFace.localPosition = new Vector3(closestFace.localPosition.x, centerY, closestFace.localPosition.z); winningIndex = closestFace.GetSiblingIndex(); // Get the index of the winning face for (int i = 0; i < faces.Length; i++) { if (i != winningIndex) { Transform faceTransform = transform.GetChild(i); float offset = (i - winningIndex) * (faceSpriteSize + faceHeightSpacing); faceTransform.localPosition = new Vector3(faceTransform.localPosition.x, centerY + offset, faceTransform.localPosition.z); } } // Stop the spin audio when the spin completes if (audioSource != null && audioSource.isPlaying) { audioSource.Stop(); } // Play the sound effect of the winning face FaceScriptableObject winningFace = faces[winningIndex]; if (winningFace.soundEffect != null) { audioSource.PlayOneShot(winningFace.soundEffect); } isSpinning = false; Debug.Log("Reel finished spinning with winning face: " + faces[winningIndex].itemName); StartCoroutine(WinningFaceEffect(closestFace, 2.0f)); } public FaceScriptableObject GetWinningFace() { return faces[winningIndex]; } private IEnumerator WinningFaceEffect(Transform winningFace, float duration) { SpriteRenderer faceRenderer = winningFace.GetComponent(); float elapsed = 0.0f; float blinkInterval = 0.1f; bool isVisible = true; while (elapsed < duration) { elapsed += Time.deltaTime; float rotation = 360 * (elapsed / duration); winningFace.eulerAngles = new Vector3(0, rotation, 0); if (elapsed % blinkInterval < blinkInterval / 2) { isVisible = !isVisible; faceRenderer.enabled = isVisible; } yield return null; } faceRenderer.enabled = true; winningFace.eulerAngles = Vector3.zero; } }