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); } }
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; }
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); } }