Definitely go for 1 blueprint only here, assuming the notes are identical in functionality but have different text.
In your original post, you mentioned 50+ notes. In this case, I’d suggest putting the text in a DataTable, you can do it manually or load it up from a *.csv file exported from Excel.
Apart from having an Index variable in the widget, create a text variable that will hold the actual text for the note. Expose it on spawn, same as the index int, and feed it an entry from the DataTable.
For the DataTable to work, you will need to create a struct to hold the data:
DataTable is based on that struct:
As you can see above, the first column called RowName is added automatically and can be renamed - it can be a number or it can be a searchable text. It is up to you how you want to handle data. You can access it like this:
This will allow you to fetch any text you want and create a widget with the associated index ID without the need to create 50+ separate blueprints. In addition, you no longer have to worry about adding +1 to the index because it is all stored in a static database with the indexes you’ve assigned yourself:
If you had only 10 notes in the game, you could probably just dump them in an array or map. But if your game is going to be even moderately wordy, consider taking advantage of the DataTable.
This provides you with a lot of room to manoeuvre. For example, the struct for the note can contain additional information/flags. Like a hidden clue, providing the player deserves it; or a tiny picture you may or may not want to add to the player’s widget depending on their actions. You can add an audio log or a decorative element making the note stand out, different font, ornamental frame for the widget border.