So take a look at this I have it firing from my level blueprint on begin play.
The transform in the “make transform” node is the location and rotation to spawn the pawns, what this is doing is creating a playercontroller 1 & 2, then spawning and possessing these pawns to each controller, think of it like this. Controller0 is player 1, controller1 is player 2 (locally doesn’t work that way with net play as controllers aren’t replicated).
Then in a persistent actor (camera/level) I’d get all actors of class, set index 0 to player1, index 1 to player2 reference of the pawn, and use those to drive something like this lines of this (obviously you don’t need the cast if it’s inside the same bp), it’s 4am here though I’ll look over it again in the morning but this should get you started, it is a similar version to how I have it set up for local play in my fighting game.
p.s. don’t forget using controller -1 means getting the next available number.
p.p.s. I should probably have pointed out I don’t use player start, I use this function to spawn the players instead.