예제 #1
0
        private void HandleDown()
        {
            //  If shot is cooling down return
            if (!canShoot)
            {
                return;
            }

            // If the game isn't playing don't do anything.
            if (!m_ShootingGalleryController.IsPlaying)
            {
                return;
            }

            //  If gun is empty reload and return
            if (currAmmo <= 0)
            {
                reloadSlider.SetActive(true);
                return;
            }
            bulletUpdate.UpdateDisplay(currAmmo);
            currAmmo -= 1;
            StartCoroutine(ShootCooldown());

            // Otherwise, if there is an interactible currently being looked at, try to find it's BabushkaTarget component.
            BabushkaTarget babushkaTarget = m_EyeRaycaster.CurrentInteractible ? m_EyeRaycaster.CurrentInteractible.GetComponent <BabushkaTarget>() : null;

            // We will also get the transform of the target for the purpose of calculating distance
            Transform target;
            float     targetDistance;

            // If we discovered a babushkaTarget a moment ago...
            if (babushkaTarget)
            {
                target         = babushkaTarget.transform;
                targetDistance = Vector3.Distance(m_GunEnd.position, target.position);
            }
            else
            {
                target         = null;
                targetDistance = m_DefaultLineLength;
            }

            // If there is a BabushkaTarget component tell it to receive a hit
            if (babushkaTarget)
            {
                babushkaTarget.ReceiveHit(scoreMultiplier, (int)targetDistance);
                scoreMultiplier += 1;
            }
            //  Otherwise the player has missed. Reset their multiplier.
            else
            {
                scoreMultiplier = 1;
            }
            UpdateScoreMultiplierDisplay();

            // Display visual aspects of shot
            StartCoroutine(Fire(target, targetDistance));
        }
        private void HandleTargetRemoved(/*ShootingTarget target*/ BabushkaTarget target)
        {
            // Now that the event has been hit, unsubscribe from it.
            target.OnRemove -= HandleTargetRemoved;

            // Return the target to it's object pool.
            // m_TargetObjectPool.ReturnGameObjectToPool (target.gameObject);

            // Increase the likelihood of a spawn next time because there are fewer targets now.
            SetSpawnProbability(m_SpawnProbability + m_ProbabilityDelta);
        }
        private IEnumerator PlayUpdate()
        {
            // When the updates start, the probability of a target spawning is 100%.
            SetSpawnProbability(1f);

            // The time remaining is the full length of the game length.
            float gameTimer = m_GameLength;

            // The amount of time before the next spawn is the full interval.
            float spawnTimer = m_SpawnInterval;

            // The amount of time before the difficulty notches up
            float difficultyTimer = m_DifficultyInterval;

            // While there is still time remaining...
            while (gameTimer > 0f)
            {
                // ... check if the timer for spawning has reached zero.
                if (spawnTimer <= 0f)
                {
                    // If it's time to spawn, check if a spawn should happen based on the probability.
                    if (Random.value < m_SpawnProbability)
                    {
                        // If a spawn should happen, restart the timer for spawning.
                        spawnTimer = m_SpawnInterval;

                        // Decrease the probability of a spawn next time because there are now more targets.
                        SetSpawnProbability(m_SpawnProbability - m_ProbabilityDelta);

                        int            randomSpawnerIndex = Random.Range(0, spawners.transform.childCount);
                        BabushkaTarget targetScript       = spawners.transform.GetChild(randomSpawnerIndex).gameObject.GetComponent <Spawner>().Spawn();
                        if (targetScript)
                        {
                            targetScript.OnRemove += HandleTargetRemoved;
                        }
                        // Spawn a target.
                        // Spawn (gameTimer);
                    }
                }
                // When the difficulty timer has gone off:
                if (difficultyTimer <= 0f)
                {
                    // Reset it, then notch up the difficulty and recalculate the probability delta.
                    difficultyTimer      = m_DifficultyInterval;
                    m_IdealTargetNumber += 1;
                    m_ProbabilityDelta   = (1f - m_BaseSpawnProbability) / m_IdealTargetNumber;
                    SetSpawnProbability(1f);
                    Debug.Log("Ideal targets number: " + m_IdealTargetNumber + ". Probability delta: " + m_ProbabilityDelta);
                }

                // Wait for the next frame.
                yield return(null);

                // Decrease the timers by the time that was waited.
                gameTimer       -= Time.deltaTime;
                spawnTimer      -= Time.deltaTime;
                difficultyTimer -= Time.deltaTime;

                // Set the timer bar to be filled by the amount
                m_TimerBar.fillAmount = gameTimer / m_GameLength;
            }
        }