Пример #1
0
    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();
    }
Пример #2
0
    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);
    }
Пример #3
0
    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;
                    }
                }
            }