public void ControllerManater_replay()
        {
            var random = new Random();

            random.InitState(1234567);

            using (var buffer = new NativeList <ControllerUnit>(ControllerBuffer.MaxFrames, Allocator.Persistent)) {
                const int NUM    = 10;
                double    time   = 0;
                var       device = new ControllerDevice(buffer);
                for (var i = 0; i < NUM; ++i)
                {
                    var ppos = new float3(1000, 1000, 1000);
                    var tpos = new float3(0, 0, 0);
                    device.Update(time, ppos, tpos, true /* testing */);
                    time += 1.0 / 60.0;
                }
                Assert.AreEqual(NUM, buffer.Length);

                var filename = "test2.bin";
                ControllerBuffer.Save(buffer, filename);

                using (var buffer2 = ControllerBuffer.Load <ControllerUnit>(filename)) {
                    //var replay = new ControllerReplay();
                    for (var i = 0; i < NUM; ++i)
                    {
                        var ppos  = new float3(1000, 1000, 1000);
                        var tpos  = new float3(0, 0, 0);
                        var unitA = buffer[i];
                        var unitB = buffer2[i];
                        Assert.AreEqual(unitA, unitB);
                    }
                }
            }
        }
        public void ControllerManater_update()
        {
            var random = new Random();

            random.InitState(1234567);

            using (var buffer = new NativeList <ControllerUnit>(ControllerBuffer.MaxFrames, Allocator.Persistent))
            {
                const int NUM        = 10;
                double    time       = 0;
                var       file_path0 = Application.dataPath + "/../tmp.txt";
                using (System.IO.StreamWriter sw = new System.IO.StreamWriter(file_path0))
                {
                    var device = new ControllerDevice(buffer);
                    for (var i = 0; i < NUM; ++i)
                    {
                        var ppos = random.NextFloat3();
                        var tpos = random.NextFloat3();
                        device.Update(time, ppos, tpos, true /* testing */);
                        time += 1.0 / 60.0;

                        var unit = device.GetCurrent();
                        sw.WriteLine(unit.ToString());
                    }
                    Assert.AreEqual(NUM, buffer.Length);

                    sw.WriteLine("----");

                    for (var i = 0; i < buffer.Length; ++i)
                    {
                        var unit = buffer[i];
                        sw.WriteLine(unit.ToString());
                    }

                    sw.WriteLine("----");

                    var replay = new ControllerReplay();
                    for (var i = 0; i < NUM * 10; ++i)
                    {
                        var ppos = random.NextFloat3();
                        var tpos = random.NextFloat3();
                        var unit = replay.Step(buffer, ppos, tpos);
                        time += 1.0 / 60.0;
                        sw.WriteLine(unit.ToString());
                    }
                }
            }
        }