private void RewardMovementAgent()
    {
        Collider2D coll = Physics2D.OverlapPoint((Vector2)transform.position, _layerMaskBirdEnv);

        // Check what's been shot
        if (coll && coll.tag.Equals(_BIRD_TAG))
        {
            BirdBehavior bird = coll.GetComponent <BirdBehavior>();
            // Reward the agent for hitting a bird based on the bird's size
            switch (bird.BirdSize)
            {
            case BirdSize.S:
                _movementAgent.AddReward(2.0f);
                break;

            case BirdSize.M:
                _movementAgent.AddReward(0.75f);
                break;

            case BirdSize.L:
                _movementAgent.AddReward(0.25f);
                break;
            }
        }
        else
        {
            // Punish for hitting nothing
            _movementAgent.AddReward(-0.1f);
        }
    }
Ejemplo n.º 2
0
    public override void OnInspectorGUI()
    {
        DrawDefaultInspector();
        BirdBehavior birdBehavior = (BirdBehavior)target;

        if (GUILayout.Button("SpottedByGaze"))
        {
            birdBehavior.SpottedByGaze();
        }
    }
    /// <summary>
    /// Shoots at the position of the agent, if enough ammo is left.
    /// </summary>
    protected void Shoot()
    {
        if (_leftAmmo > 0 || _infinteAmmo)
        {
            _shotCount++;

            Collider2D coll = Physics2D.OverlapPoint((Vector2)transform.position, _layerMaskBirdEnv);
            // Check what's been shot
            if (coll && coll.tag.Equals(_BIRD_TAG))
            {
                BirdBehavior bird = coll.GetComponent <BirdBehavior>();
                bird.Hit();
                // Reward the agent for hitting a bird based on the bird's size
                switch (bird.BirdSize)
                {
                case BirdSize.S:
                    AddReward(2.0f);
                    break;

                case BirdSize.M:
                    AddReward(0.75f);
                    break;

                case BirdSize.L:
                    AddReward(0.25f);
                    break;
                }
                _hitCount++;
            }
            else
            {
                // Punish for hitting nothing
                AddReward(-0.1f);
            }

            if (!_infinteAmmo)
            {
                // Decrease ammo
                _leftAmmo--;
            }
        }
        else
        {
            // Punish the agent for trying to shoot without ammo
            AddReward(-1f);
        }
        // Update UI
        _accuracyText.text = "Shot Accuracy: " + ((float)_hitCount / (float)_shotCount).ToString("0.00");
        _ammoText.text     = "Ammo: " + _leftAmmo + " / " + _maxAmmo;
    }
Ejemplo n.º 4
0
    private void SpawnBirds()
    {
        GameObject bird;

        for (int i = 0; i < birdLandingSpots.Count; i++)
        {
            if (birdLandingSpots[i].birdToSpawn)
            {
                bird = Instantiate(birdPrefab, birdLandingSpots[i].transform.position, birdLandingSpots[i].transform.rotation);
                BirdBehavior birdBehavior = bird.GetComponent <BirdBehavior>();
                birds.Add(birdBehavior);
                birdBehavior.currentLandingSpot = birdLandingSpots[i];
                birdBehavior.SetColor(birdLandingSpots[i].birdToSpawn.birdMaterial);
                birdBehavior.treePreference = birdLandingSpots[i].birdToSpawn.treePreference;

                UnoccupiedSpots.Remove(birdLandingSpots[i]);
            }
        }
    }
    /// <summary>
    /// Spawns a single bird.
    /// </summary>
    public void Spawn()
    {
        // Spawn position (x,y)
        // Decide on spawn site
        var spawnSite        = Random.Range(0, 2);
        var size             = Random.Range(0, 3);
        var spawnZAdjustment = Random.Range(0.1f, 0.2f); // This modification on the Z-Axis shall prevent flickering issues of overlapping sprites

        Vector3 spawnPos;

        if (spawnSite == 0) // left
        {
            spawnPos = new Vector3(_leftTopSpawnIndicatior.position.x,
                                   Random.Range(_rightBottomIndicator.position.y, _leftTopSpawnIndicatior.position.y), size - spawnZAdjustment);
        }
        else // right
        {
            spawnPos = new Vector3(_rightBottomIndicator.position.x,
                                   Random.Range(_rightBottomIndicator.position.y, _leftTopSpawnIndicatior.position.y), size - spawnZAdjustment);
        }

        // Instantiate bird (i.e. reuse pooledbird)
        GameObject bird = GetBird();

        if (bird != null)
        {
            bird.transform.position = spawnPos;
            bird.transform.rotation = Quaternion.identity;
            bird.SetActive(true);
            BirdBehavior birdBehavior = bird.GetComponent <BirdBehavior>();

            // Initialize bird behavior
            var speed = Random.Range(1.5f, 6f);
            birdBehavior.Init(this, (BirdSize)size, speed, spawnSite != 0);
        }
    }