Kamis, 29 November 2012

Working A* pathfinding

The A* pathfinding system is now functional and very efficient, guards quickly generate a route to the player using the nodes placed on the map and then optimize the route deleting any superfluous nodes on the path. I ended up not using the arrays built into the nodes of closest other nodes because I would have to use that array and the open list of nodes on the pathfinding script at the same time constantly cross checking that a node in the node's array was also on the script's array and then finding the chosen node from the node's array in the script's array to remove it from the open list. I decided it would be more efficient to just check all nodes.
(Above) The pathfinder with no optimization finding the first route through the nodes to a set point. (Below) With optimization code (And fewer nodes) the script finds an efficient path to the target. Also switched to spherecasting instead of raycasting because rays were cutting corners too close and guards couldn't get past comfortable and from time to time would try to find paths through arrow slits.
One more addition needs to be made before the script is ready to be implemented by the guard movement script, that is back tracking. I haven't run into any problems that would need it yet, any failures of the pathfinding so far have been node placement related but as levels get larger and more complex it's probable that guards will start taking dead ends and the pathfinder will get stuck at the ends of hallways instead of reaching the target. To solve this the script needs to be able to backtrack one node at a time. So ad the end of the dead end it realizes its mistake and moves back one node and looks for a new closest node disregarding the previous choice, either it finds a new path or it moves back again until a new path is available.
Once all this is implemented guards will need some sort of smoothing to make their paths look more natural, also they may run this script over the course of a few frames to make sure it always runs smoothly and the guards don't need to move immediately anyway, a few frames to notice the sound or sight, then a few frames shouting out or looking around will only look natural.
Primbon Jawa Pathfinding, Stealth
Jumat, 16 November 2012

AI pathfinding nodes

I started writing an A* pathfinding system with branching nodes, each node is linked to it's closest eight nodes for more efficient path plotting. I wrote a script that would cycle through them and link them to their eight closest nodes who's paths don't intersect walls or obstacles. Above is the turn out when I got it right, below is the result when I accidentally required rather than disallowed raycasts intersect with walls and obstacles.

Two more examples, above just two links each, below is four which is probably the one I'll stick with for speed.

Primbon Jawa Pathfinding, Stealth

Light level

Light level is the first thing I've completed, the concept for measuring light seemed simple but it was so essential to the gameplay I decided to do it first to make sure it could be done efficiently and accurately.

The method is quite simple, since we're already using light objects in unity to create light we can add extra code to each of them to check how much they're lighting up the player. All the check does is raycast the distance from the light to the player to check for walls in the way, then if it finds the path clear it measures the distance to the player and assigns a percentage based on the distance. Unity handled all of this very well and the code ran smoothly with no difference in frame rate.

Past this there are still a lot of improvements to be made to this system, things like ambient light, how close the player is to walls and special areas like outside or rooms with windows. Also the checks run to the centre of the player so sides of the player poking out doorways won't register as putting the player in light and if it's dark in the middle of a room the player can walk through undetected even though logically the character would make a silhouette on the wall behind him if it was lit well enough. That said there's always room for improvement but as long as the basic system works I can go ahead with the project.
Primbon Jawa Stealth