public void Update(double time, float3 playerPosition, float3 targetPosition, bool testing = false)
        {
            var unit = testing ? fetch_random(time) : fetch_input(time, playerPosition, targetPosition);

            if (_buffer.Length < _buffer.Capacity)
            {
                _buffer.Add(unit);
            }
            if (Input.GetButtonDown("Submit"))
            {
                var filename = "controller.bin";
                Debug.Log("dump file to:" + filename);
                ControllerBuffer.Save(_buffer, filename);
                Debug.Log("done.");
            }

            if (!unit.Toward && _buffer.Length >= 2)
            {
                for (var i = _buffer.Length - 2; i >= 0; --i)
                {
                    var oldUnit = _buffer[i];
                    if (oldUnit.Toward)
                    {
                        oldUnit.Condition = unit.Condition;
                        _buffer[i]        = oldUnit;
                    }
                    else
                    {
                        break;
                    }
                }
            }

            _currentUnit = unit;
        }
        ControllerUnit fetch_random(double time)
        {
            var unit = new ControllerUnit {
                Horizontal  = _random.NextFloat(),
                Vertical    = _random.NextFloat(),
                FireBullet  = _random.NextBool(),
                FireMissile = _random.NextBool(),
                Toward      = _random.NextBool(),
                Away        = _random.NextBool(),
                Condition   = _random.NextFloat(),
                Time        = (float)(time - _startTime),
            };

            return(unit);
        }
        ControllerUnit fetch_input(double time, float3 playerPosition, float3 targetPosition)
        {
            var unit = new ControllerUnit {
                Horizontal  = Input.GetAxisRaw("Horizontal"),
                Vertical    = Input.GetAxisRaw("Vertical"),
                FireBullet  = Input.GetButton("Fire1"),
                FireMissile = Input.GetButtonDown("Fire2"),
                Toward      = Input.GetButton("Toward"),
                Away        = Input.GetButton("Away"),
                Condition   = math.length(targetPosition - playerPosition),
                Time        = (float)(time - _startTime),
            };

            return(unit);
        }