Beispiel #1
0
        public void TestUpdateShort()
        {
            var linearPath = new LinearPath(Vector3.zero, Vector3.forward);
            var paths      = new List <PathDescription>()
            {
                new PathDescription(new DummyAIPath(linearPath), 0, 1)
            };

            var state = new AgentState(0, 0, null);

            var agent = new DummyStateAgent(state);

            GetSpeedDelegate getSpeed = s => 1.0f;

            AgentState newState;

            state.Update(agent, 1 / 60.0f, getSpeed, paths, out newState);

            Assert.AreEqual(1 / 60.0f, newState.Progress, 0.000001f);
        }
Beispiel #2
0
        public void TestUpdateLong()
        {
            var linearPath = new LinearPath(Vector3.zero, Vector3.forward);
            var paths      = new List <PathDescription>()
            {
                new PathDescription(new DummyAIPath(linearPath), 0, 1)
            };

            var state = new AgentState(0, 0, null);

            var agent = new DummyStateAgent(state);

            GetSpeedDelegate getSpeed = s => 1.0f;

            AgentState newState;
            var        result = state.Update(agent, 1 + 1 / 60.0f, getSpeed, paths, out newState);

            Assert.IsTrue(result.HasFlag(AgentStateResult.Moved));
            Assert.IsTrue(result.HasFlag(AgentStateResult.ChangedPath));
            Assert.AreEqual(1 / 60.0f, newState.Progress, 0.000001f);
        }
Beispiel #3
0
        public static AgentStateResult Update(this AgentState currentState, IAgent agent, float dt, GetSpeedDelegate getSpeed, IList <PathDescription> paths, out AgentState newState)
        {
            var result = AgentStateResult.None;
            var speed  = getSpeed(currentState);

            var progress = currentState.Progress;

            var increment = speed * dt;

            progress += increment;

            if (Mathf.Abs(increment) > 0.000001)
            {
                result |= AgentStateResult.Moved;
            }

            var currentIndex = currentState.PathIndex;

            var currentPath = paths[currentIndex];

            var length = currentPath.Path.GetLength() * currentPath.End;

            var pointer = currentState.Pointer;

            if (progress >= length)
            {
                do
                {
                    progress -= length;
                    result   |= AgentStateResult.ChangedPath;
                    currentIndex++;
                    if (currentIndex >= paths.Count)
                    {
                        newState = new AgentState(currentIndex, progress, null);
                        return(result | AgentStateResult.ReachedEnd);
                    }
                    currentPath = paths[currentIndex];
                    progress   += currentPath.Start * currentPath.Path.GetLength(); // move to path start according to description
                    length      = currentPath.Path.GetLength() * currentPath.End;
                    currentState.Pointer?.Disconnect();
                }while (progress >= length);
                pointer = (currentPath.Path as IAgentChainAIPath)?.Connect(agent);
            }

            newState = new AgentState(currentIndex, progress, pointer);
            return(result);
        }