internal override void Update(PiavRoadAgent agent) { if (agent._desiredIncomingPath.Count > 1) { for (int i = 1; i < agent._desiredIncomingPath.Count; i++) { foreach (var possibleSegment in agent.CurrentSegments) { if (possibleSegment._segment.Id == agent._desiredIncomingPath[i]._parentSegment.Id && possibleSegment._root > 0 && possibleSegment._root < 1) { agent._desiredIncomingPath.RemoveRange(0, i); break; } } } var gizmolist = new List <Vector3>(); foreach (var tuple in agent._desiredIncomingPath) { gizmolist.Add(RoadUtilities.Calculate(tuple._parentSegment.Polynomial, (tuple._fromRoot + tuple._toRoot) / 2)); } SetProjectionGizmo(gizmolist, Color.red); } }
internal override void Update(PiavRoadAgent agent) { if (agent != null && agent.CurrentSegments != null && agent.CurrentSegments.Count > 0) { var chosenSegment = new PiavRoadContainer.ValuedSegment(); if (agent._desiredIncomingPath != null && agent._desiredIncomingPath.Count > 0) { foreach (var possibleSegment in agent.CurrentSegments) { if (possibleSegment._segment.Id == agent._desiredIncomingPath[0]._parentSegment.Id) { chosenSegment = possibleSegment; break; } } } else { chosenSegment = agent.CurrentSegments[0]; } if (chosenSegment._segment != null) { //Debug.Log(chosenSegment.Item1.Id + " " + chosenSegment.Item2); var proj = _parentContainer.ProjectPathLaneFromOrigin(agent, 3.5 + agent.Dimensions.y / 2, true); var target = RoadUtilities.Calculate(proj._targetSegment.Polynomial, proj._targetRoot); SetProjectionGizmo(new List <Vector3>() { target }, Color.cyan); var direction = target - agent.CurrentPosition; direction.y = 0; var curDirection = agent.CurrentFacingDirection; curDirection.y = 0; var angle2 = Vector3.Angle(direction, curDirection); var cross = Vector3.Cross(direction, curDirection); if (cross.y > 0) { angle2 = -angle2; } //Debug.Log(angle2); var steer = Mathf.Clamp(angle2 / 35, -1, 1); agent.DesiredSteer = steer; } } }
internal override void Update(PiavRoadAgent agent) { if (agent != null && agent.CurrentSegments != null && agent.CurrentSegments.Count > 0) { var chosenSegment = new PiavRoadContainer.ValuedSegment(); if (agent._desiredIncomingPath != null && agent._desiredIncomingPath.Count > 0) { foreach (var possibleSegment in agent.CurrentSegments) { if (possibleSegment._segment.Id == agent._desiredIncomingPath[0]._parentSegment.Id) { chosenSegment = possibleSegment; break; } } } else { chosenSegment = agent.CurrentSegments[0]; } if (chosenSegment._segment != null) { for (int i = 0; i < _parentAi._profile._forcedSpeedLimitValues.Count; i++) { if (_parentAi._profile._forcedSpeedLimitValues[i]._originBehaviorType == GetType()) { double totalAngle = 0; var projections = new List <Vector3>(); for (int j = 1; j <= 3; j++) { var proj = _parentContainer.ProjectPathLaneFromOrigin(agent, (3 + agent.CurrentAbsoluteSpeed) * j * 1.2, true); var pos = RoadUtilities.Calculate(proj._targetSegment.Polynomial, proj._targetRoot); pos.y = agent.CurrentPosition.y; projections.Add(pos); var dir = pos - agent.CurrentPosition; totalAngle += Math.Abs(Vector3.Angle(dir, agent.CurrentFacingDirection)); } totalAngle /= 3; SetProjectionGizmo(projections, Color.yellow); if (totalAngle < 5) { _parentAi._profile._forcedSpeedLimitValues[i] = new PiavRoadContainer.SpeedLimitation { _value = double.PositiveInfinity, _originBehaviorType = GetType() } } ; else if (totalAngle < 35) { _parentAi._profile._forcedSpeedLimitValues[i] = new PiavRoadContainer.SpeedLimitation { _value = 5 / ((totalAngle - 4) / 30), _originBehaviorType = GetType() } } ; else if (totalAngle < 125) { _parentAi._profile._forcedSpeedLimitValues[i] = new PiavRoadContainer.SpeedLimitation { _value = 5 - (totalAngle - 35) / 225, _originBehaviorType = GetType() } } ; else { _parentAi._profile._forcedSpeedLimitValues[i] = new PiavRoadContainer.SpeedLimitation { _value = 0.1, _originBehaviorType = GetType() } }; break; } } } else { for (int i = 0; i < _parentAi._profile._forcedSpeedLimitValues.Count; i++) { if (_parentAi._profile._forcedSpeedLimitValues[i]._originBehaviorType == GetType()) { _parentAi._profile._forcedSpeedLimitValues[i] = new PiavRoadContainer.SpeedLimitation { _value = double.PositiveInfinity, _originBehaviorType = GetType() } } ; } } } } }