You can get the heading (bearing) to another object using Mathf.Atan2() and the delta in position.
As for the aggregate “fully surrounded” part, that will be handled by some kind of count or checklist of directions.
For instance, in a grid it is easy: if you are at x,y then you just add offsets going around all 4 directions (or 8 directions) to your x,y and ask if there is something present.