public override void OnEpisodeBegin() { if (_fireCoroutine != null) { StopCoroutine(_fireCoroutine); _fireCoroutine = null; } Renderer.material = NormalMaterial; CanFire = true; _fireTime = Random.Range(FireTimeMin, FireTimeMax); var p = Spawner.GetRandomPosition(Radius, SpawnDistance); transform.position = p; transform.rotation = Quaternion.Euler(0f, Random.value * 360f, 0f); _direction = Vector3.zero; _look = Vector3.zero; _lookedCoin = null; _speed = Random.Range(SpeedMin, SpeedMax); _rotSpeed = Random.Range(RotSpeedMin, RotSpeedMax); _rayDistance = Random.Range(RayDistanceMin, RayDistanceMax); _coinCount = 0; Spawner.ResetWalls(); }
public CoinAgent GetNearlyCoin(Vector3 pos) { CoinAgent result = null; float dist = float.MaxValue; foreach (var coin in _coinList) { var d = (pos - coin.transform.position).magnitude; if (result == null || d < dist) { result = coin; dist = d; } } return(result); }
public override void CollectObservations(VectorSensor sensor) { _lookedCoin = null; var rotAngle = transform.rotation.eulerAngles.y; sensor.AddObservation(rotAngle / 360f); sensor.AddObservation(_speed); sensor.AddObservation(_rotSpeed); sensor.AddObservation(CanFire); var nearCoin = Spawner.GetNearlyCoin(transform.position); if (nearCoin != null) { //var coinAngle = Vector3.SignedAngle(transform.position, nearCoin.transform.position, Vector3.up); //sensor.AddObservation(coinAngle / 360f); var p = (transform.position - nearCoin.transform.position) / _rayDistance; sensor.AddObservation(p.x); sensor.AddObservation(p.z); } else { sensor.AddObservation(1f); sensor.AddObservation(1f); } for (int i = 0; i < Rays.Length; i++) { /*if(i > 0) * { * sensor.AddObservation(0.5f); * continue; * }*/ var d = _rayDistance; Color rc = Color.white; var baseDir = Rays[i].normalized; var dir = Quaternion.LookRotation(baseDir) * transform.forward; var r = new Ray(transform.position + RayOffset, dir); if (Physics.Raycast(r, out var hitInfo, _rayDistance) && hitInfo.transform != null) { var idx = Targets.IndexOf(hitInfo.transform.tag); var dist = hitInfo.distance / _rayDistance; sensor.AddObservation(dist); d = hitInfo.distance; if (i == 0) { if (hitInfo.transform.CompareTag("Coin")) { _lookedCoin = hitInfo.transform.GetComponentInParent <CoinAgent>(); _lookedCoinDist = dist; _lookedCoinTimer += Time.fixedDeltaTime; rc = Color.red; } else { _lookedCoinTimer = 0f; } } }