Here is a project on Unity that implements a simple quest. There is NPC on stage, and Blue Box and Red Box. Player approaches NPC and dialog is shown with request: Choose Red box or Blue Box. Player then may approach either Red Box or Blue Box. Once Box is chosen player returns back to NPC and reports about it.
.\Assets\Scripts\MyInteractable.cs - MonoBehavior class that shows or hides "press E" prompt when player approaches interactable actor. Also it shows and hides dialog panel with instructions
.\Assets\Scripts\RedBoxBlueBoxQuestStates.cs - contains enum which gives semantic names to quest states
.\Assets\Scripts\MyQuest\MyQuest.cs - plain C# class that represents Quest as set of states and transmissions. Also contains declaration of transmission of quest. Pretty generic and basic and universal and reusable
.\Assets\Scripts\ObjectInteraction\BlueBoxInteraction.cs - interaction that occured with blue box
.\Assets\Scripts\ObjectInteraction\RedBoxInteraction.cs - interaction that occured with red box
.\Assets\Scripts\ObjectInteraction\NPCInteraction.cs - interaction that occured with NPC
.\Assets\Scripts\ObjectInteraction\PlayerInteraction.cs - interaction that is related to player. Very special class , it holds instance of MyQuest class