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); }
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); }
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); }