https://docs.unity3d.com/ScriptReference/CustomYieldInstruction.html

 class WaitForMoves : CustomYieldInstruction {
 
 private int movesLeft;
 
 public WaitForMoves(int moves) {
 movesLeft = moves;
 Game.moveEvent.AddListener(OnMoveComplete);
 }
 
 void OnMoveComplete() {
 movesLeft—-;
 if (movesLeft <= 0)
 Game.moveEvent.RemoveListener(OnMoveComplete);
 }
 
 public override bool keepWaiting {
 get {
 return movesLeft > 0;
 }
 }
 }

And to use it, just as you wanted:

 yield return new WaitForMoves(2);

If you have a global move counter in Game, then you wouldn’t need to have a listener at all:

 class WaitForMoves : CustomYieldInstruction {
 
 private int targetMoves;
 
 public WaitForMoves(int moves) {
 targetMoves = moves + Game.moveCounter;
 }
 
 public override bool keepWaiting {
 get {
 return Game.moveCounter < targetMoves;
 }
 }
 }