Estoy usando la función [gml]mp_potential_step[/gml] pero los enemigos se aveces se quedan pegados entre ellos y contra pared, ¿Como hago para que no pase eso?

Hola Gmes, en vez de usar mp_potential_step, puedes usar las funciones lengthdir_x y lengthdir_y para mover los enemigos hacia donde quieras. En el ejemplo abajo los enemigos seguiran al jugador a una velocidad de 4 pixeles por step.

[gml]
hsp = lengthdir_x(4, point_direction(obPlayer.x,obPlayer.y));
vsp = lengthdir_y(4, point_direction(obPlayer.x, obPlayer.y));

x += hsp;
y += vsp;
[/gml]
Las variables hsp y vsp las puedes sustituir por las variables que uses para calcular la velocidad.

El problema de usar solo lengthdir es que van a atravesar las paredes.

¿Cómo son las paredes y los objetos? danos una idea de sus propiedades, si solid = true, cómo es su máscara de colisión etc.

Para mover muchas instancias juntas sin colisionar he utilizado un sistema en el que se define un área circular alrededor de cada instancia. Si las áreas de dos instancias se empalman, se desplazan en direcciones contrarias para que las áreas dejen de estar empalmadas. Como resultado parece que las instancias se deslizan suavemente cuando chocan.

Hay varias técnicas de búsqueda de caminos. Si las paredes están alineadas a una cuadrícula, puedes usar el algoritmo A* que ya está implementado en GMS (mp_grid functions)
https://docs.yoyogames.com/source/dadiospice/002_reference/movement%20and%20collisions/motion%20planning/index.html