using UnityEngine; using UnityEngine.UI; using TMPro; using DG.Tweening; public class WhackAMoleGameManager : MonoBehaviour { public Mole[] moles; public float spawnInterval = 1.5f; public float gameDuration = 30f; public TextMeshProUGUI scoreText; public TextMeshProUGUI timerText; public GameObject hammerPrefab; public Transform[] moleHammerPositions; private int score = 0; private float timeLeft; private Camera mainCamera; void Start() { mainCamera = Camera.main; timeLeft = gameDuration; InvokeRepeating(nameof(SpawnMole), 1f, spawnInterval); } void Update() { timeLeft -= Time.deltaTime; timerText.text = "Time: " + Mathf.CeilToInt(Mathf.Max(timeLeft, 0f)); if (timeLeft <= 0f) { CancelInvoke(nameof(SpawnMole)); return; } // Check for click if (Input.GetMouseButtonDown(0)) { Ray ray = mainCamera.ScreenPointToRay(Input.mousePosition); RaycastHit hit; if (Physics.Raycast(ray, out hit)) { Mole mole = hit.collider.GetComponent(); if (mole != null && mole.IsVisible()) { mole.ReactToHit(); int moleIndex = System.Array.IndexOf(moles, mole); InstantiateHammerAtMole(moleIndex); } else { InstantiateHammerAtClick(hit.point); } } } } void SpawnMole() { if (moles.Length == 0) return; int index = Random.Range(0, moles.Length); moles[index].Show(); } public void AddScore(int points) { score += points; scoreText.text = "Score: " + score; } void InstantiateHammerAtMole(int index) { if (index < 0 || index >= moleHammerPositions.Length) return; Transform hammerPos = moleHammerPositions[index]; GameObject hammer = Instantiate(hammerPrefab, hammerPos.position, hammerPos.rotation); AnimateHammerMesh(hammer); } void InstantiateHammerAtClick(Vector3 position) { Quaternion referenceRotation = moleHammerPositions[0].rotation; // Calculate lifted position using the reference's up direction Vector3 liftedPosition = position + referenceRotation * Vector3.zero; GameObject hammer = Instantiate(hammerPrefab, liftedPosition, referenceRotation); AnimateHammerMesh(hammer); } void AnimateHammerMesh(GameObject hammer) { Transform meshHammer = hammer.transform.GetChild(0); // assumes first child is the mesh meshHammer.localEulerAngles = new Vector3(-150f, 0f, 0f); meshHammer.DOLocalRotate(Vector3.zero, 0.2f).SetEase(Ease.OutBack); // Optional: Destroy hammer after animation Destroy(hammer, 0.5f); } }