Here is a brief overview. I would start with a single Spine animation with its own atlas, get everything working for that, and then if you want to combine multiple Spine animations into a single atlas you can do that afterward. Note that this is mostly off of the top of my head and may not be absolutely 100% complete. If you get stuck let me know.
1) Create your character in Spine as usual, test them out Unity and make sure everything works. Set the material to use the correct "lit" shader (if you're using URP with 2D Renderer, you can use the "Universal Render Pipeline/2D/Spine/Sprite" shader).
2) Make a standalone scene and add a Point Light 2D, and enable "Use Normal Map" on it. You can set the Distance to a low number (like 0.5 or 1) to make the effect of the normal maps really stand out for testing purposes. But since you haven't set up your normal map yet, right now it should just light up the Spine animation as though it was flat.
3) Create a folder called "normalmap" next to your source images folder for your Spine project. Open Sprite Iluminator, drag all of your source images in, and make your normal maps. Export into the "normalmap" folder, with Transparent Background.
4) From now on, you'll want to export your Spine projects "data" separately from its "atlas" stuff. So when you do Spine Menu -> Export... you'll want to uncheck the "Texter Atlas: Pack" button. So when you run the Export this way, you'll only get the ".json" or ".skel.bytes" files.
5) Now you'll want to pack your two atlases (the 'regular source images', which I'll call the Albedo atlas for now, and then the normalmap atlas). You can start by doing Spine Menu -> Texture Packer, and selecting the images folder for the Albedo images, configuring the settings, and Packing. And then the same for the Normalmap images. So you will end up with a .png + .atlas for the Albedo, and a .png + .atlas for the NormalMap.
The goal here is to get the normal map .png to look EXACTLY the same as the Albedo .png. A single pixel difference between the albedo images and the normalmap images will make it so the images do not match up.
For the Albedo packer settings I did this:
-Disable Strip Whitespace, Rotation, and Alias
-Alpha Threshold = 0
-Premultiply Alpha
For the NormalMap packer settings I did this:
-Same settings as Albedo packer, but without Premultiply Alpha checked.
If everything is set up properly, you should be able to open the exported .pngs of the Albedo and the NormalMap side by side, and see that they match up perfectly.
6) At this point its probably best to delete your entire Spine animation setup and files from step #1, that way everything is done from scratch and there is no confusion as to what file is referencing what image.
7) Now drag in those .png + .atlas files into Unity (I like to keep them in separate folders), and it should create the Material for them. We only need to use the Material from the Albedo version - in fact, the only file we really need from the NormalMap is the .png, so I suppose you don't have to drag in the .atlas for the NormalMap at all.
8 ) Select the NormalMap .png, and change its Texture Type to Normal Map. Select the Material that was created for the Albedo, and set the Shader to the correct shader. Now drag the NormalMap .png into the Normal map slot.
9) So now you have your Material prepped, but no Spine animation files yet. Drag your .skel.bytes into Unity -> it may pop up a warning saying "atlas not found", if so, point it at your Albedo atlas.
10) Now you should be able to create a Skeleton Animation by dragging the SkeletonData file into the Scene, and it should be using your Albedo atlas, and the Albedo atlas' Material. On the SkeletonAnimation component, you will need to expand the Advanced section, and check the two boxes "Add Normals" and "Solve Tangents".
So if you have the 2D Point Light in the scene, with Use Normal Map selected, it should be lighting it up correctly.
Once you have that process working, you can then look into how to Texture Pack the source images of multiple projects into a single Albedo atlas (and doing the same with the normal map images) if you want multiple Spine animations to share a single atlases (the pair of Albedo + NormalMap atlases). I use one script to export my Data, and another to pack/export my Albedo + Normalmap atlases.
If you have any specific questions with the texture packing I can help, but unfortunately don't have time right now to go through it all. There's a documentation page for exporting using command line, so check that out. Here is a copy/paste of my two .bat folders that I use for a character. This character has a frontside skeleton and a backside skeleton in the same Spine Project, and has a normal map. I'm not sure if uploading these scripts will be helpful or just more confusing haha, but it might help in some way.
The DATA EXPORT .bat file:
REM ***Set the path below to the folder that contains Spine.exe***
SET spineExecutablePath="C:\Program Files (x86)\Spine\Spine"
REM ***Set the path of the Character's Spine Project***
SET characterSpineProject="E:\GardenfiendGamesDropbox\Dropbox\Perennial Order\Animation\Spine Projects\Sandir\Knight Sandir Felix_1.11.spine"
REM ***Set the path of the Character's Local Output Folder***
SET characterOutputFolder="E:\GardenfiendGamesDropbox\Dropbox\Perennial Order\Animation\Spine Projects\Sandir\export"
REM ***Set the path of the Export Settings***
SET characterExportSettings="E:\GardenfiendGamesDropbox\Dropbox\Perennial Order\Animation\Export Packing Settings\BINARY_ONLY_USE_SCRIPT_OUTPUT_DESTINATION.export.json"
%spineExecutablePath%
---
input %characterSpineProject%
---
output %characterOutputFolder%
---
export %characterExportSettings%
REM ***Copy this section for each Skeleton.**
REM ***Enter name of Skeleton and its Unity Folder Path***
SET skeletonName="sandir_new_front"
SET skeletonUnityFolder="C:\Users\HYDRALISK\Unity Projects\Perennial Order\Assets\Graphics\Spine\Characters\Sandir\Frontside"
SET skeletonNameFullPath=%characterOutputFolder:"=%\%skeletonName:"=%
COPY "%skeletonNameFullPath%.skel.bytes" %skeletonUnityFolder%
SET skeletonName="sandir_new_back"
SET skeletonUnityFolder="C:\Users\HYDRALISK\Unity Projects\Perennial Order\Assets\Graphics\Spine\Characters\Sandir\Backside"
SET skeletonNameFullPath=%characterOutputFolder:"=%\%skeletonName:"=%
COPY "%skeletonNameFullPath%.skel.bytes" %skeletonUnityFolder%
PAUSE
REM NOTES
REM When using a variable, encase in % (ex: %variableName%)
REM Remove quotes from strings when using variable by adding :"= (ex: %variableName:"=%)
The ATLAS EXPORT .bat file:
REM ***Set the path below to the folder that contains Spine.exe***
SET spineExecutablePath="C:\Program Files (x86)\Spine\Spine"
REM ***Texture Atlas Packing**
SET atlasName="sandir_new_front"
SET pathToImages="E:\GardenfiendGamesDropbox\Dropbox\Perennial Order\Animation\Spine Projects\Sandir\images\front"
SET pathToOutput="E:\GardenfiendGamesDropbox\Dropbox\Perennial Order\Animation\Spine Projects\Sandir\export"
SET pathToPack="E:\GardenfiendGamesDropbox\Dropbox\Perennial Order\Animation\Export Packing Settings\UNITY_CHARACTER_PACKER.pack.json"
SET atlasUnityFolder="C:\Users\HYDRALISK\Unity Projects\Perennial Order\Assets\Graphics\Spine\Characters\Sandir\Frontside"
SET atlasLocalFullPath=%pathToOutput:"=%\%atlasName:"=%
%spineExecutablePath%
---
input %pathToImages%
---
output %pathToOutput%
---
name %atlasName%
---
pack %pathToPack%
COPY "%atlasLocalFullPath%.atlas.txt" %atlasUnityFolder%
COPY "%atlasLocalFullPath%.png" %atlasUnityFolder%
SET atlasName="sandir_new_back"
SET pathToImages="E:\GardenfiendGamesDropbox\Dropbox\Perennial Order\Animation\Spine Projects\Sandir\images\back"
SET pathToOutput="E:\GardenfiendGamesDropbox\Dropbox\Perennial Order\Animation\Spine Projects\Sandir\export"
SET pathToPack="E:\GardenfiendGamesDropbox\Dropbox\Perennial Order\Animation\Export Packing Settings\UNITY_CHARACTER_PACKER.pack.json"
SET atlasUnityFolder="C:\Users\HYDRALISK\Unity Projects\Perennial Order\Assets\Graphics\Spine\Characters\Sandir\Backside"
SET atlasLocalFullPath=%pathToOutput:"=%\%atlasName:"=%
%spineExecutablePath%
---
input %pathToImages%
---
output %pathToOutput%
---
name %atlasName%
---
pack %pathToPack%
COPY "%atlasLocalFullPath%.atlas.txt" %atlasUnityFolder%
COPY "%atlasLocalFullPath%.png" %atlasUnityFolder%
SET atlasName="sandir_new_front_normalmap"
SET pathToImages="E:\GardenfiendGamesDropbox\Dropbox\Perennial Order\Animation\Spine Projects\Sandir\normalmap\front"
SET pathToOutput="E:\GardenfiendGamesDropbox\Dropbox\Perennial Order\Animation\Spine Projects\Sandir\export_normalmap"
SET pathToPack="E:\GardenfiendGamesDropbox\Dropbox\Perennial Order\Animation\Export Packing Settings\UNITY_CHARACTER_NORMALMAP.pack.json"
SET atlasUnityFolder="C:\Users\HYDRALISK\Unity Projects\Perennial Order\Assets\Graphics\Spine\Characters\Sandir\Frontside"
SET atlasLocalFullPath=%pathToOutput:"=%\%atlasName:"=%
%spineExecutablePath%
---
input %pathToImages%
---
output %pathToOutput%
---
name %atlasName%
---
pack %pathToPack%
COPY "%atlasLocalFullPath%.atlas.txt" %atlasUnityFolder%
COPY "%atlasLocalFullPath%.png" %atlasUnityFolder%
SET atlasName="sandir_new_back_normalmap"
SET pathToImages="E:\GardenfiendGamesDropbox\Dropbox\Perennial Order\Animation\Spine Projects\Sandir\normalmap\back"
SET pathToOutput="E:\GardenfiendGamesDropbox\Dropbox\Perennial Order\Animation\Spine Projects\Sandir\export_normalmap"
SET pathToPack="E:\GardenfiendGamesDropbox\Dropbox\Perennial Order\Animation\Export Packing Settings\UNITY_CHARACTER_NORMALMAP.pack.json"
SET atlasUnityFolder="C:\Users\HYDRALISK\Unity Projects\Perennial Order\Assets\Graphics\Spine\Characters\Sandir\Backside"
SET atlasLocalFullPath=%pathToOutput:"=%\%atlasName:"=%
%spineExecutablePath%
---
input %pathToImages%
---
output %pathToOutput%
---
name %atlasName%
---
pack %pathToPack%
COPY "%atlasLocalFullPath%.atlas.txt" %atlasUnityFolder%
COPY "%atlasLocalFullPath%.png" %atlasUnityFolder%
PAUSE
REM NOTES
REM When using a variable, encase in % (ex: %variableName%)
REM Remove quotes from strings when using variable by adding :"= (ex: %variableName:"=%)
Let me know if you get stuck anywhere. Good luck!
Ah, forgot to mention that there aren't any ShaderGraph shaders for Spine. I believe the Spine lit shaders use some custom functions for determining the direction of the Normals, so you can't just use Unity's default "sprite lit" functions if you are wanting to use a Normal Map.
I've set up a dissolve shader with ShaderGraph that works with Spine Animations and is "lit" (using Unity's default lighting function), but I can't use a normal-map with it.
I'm planning on looking into how to combine a custom ShaderGraph shader with the Spine "lit" shader, but probably won't be doing that for another month or so. I believe it was suggested on the forums here that you can use ShaderGraph to create the code for the shader, and then modify the code to add in the correct spine lighting.