I would avoid the use of wchar and tchar as they are Windows only, while you did specify Windows in your post I think it's always good to have portability.
The short answer is use UTF-8 everywhere you can.
If you really only want to deal with windows then use the Microsoft only characters.
UTF-16 is used in Windows, Java, Qt, and a few other places. But it's not because it's the best choice, it's actually a historical artifact. Originally there was a thing called UCS-2 which was 16-bit characters but a codeunit and a codepoint where the same thing. It only covered the Basic Multilingual Plane which was though to be enough back then and Windows and Java both jumped on board.
But since then we have needed to go beyond the BMP (blame China and it's thousands of characters, also they have come up with their own encoding system that is government mandated just to mess with things more GB 18030 but that's another issue).
In order to give backwards compatibility UCS-2 become UTF-16 which now meant that a codepoint could be represented by multiple codeunits (the 16 bit blocks).
What this means is that UTF-16 and UTF-8 must have every character analysed to check to see if it's 1 single code point or multiple (if you want to truncate the length of a name for example you can't just do it on bytes or you may get half a UTF codepoint and end up with gibberish). UTF-32 doesn't have that issue so some people incorrectly recommend just using UTF32 everywhere for 'efficacy', but they are wrong as every UTF encoding things must still be analysed as you now have glyphs that can be made up of multiple codepoints (for example adding a accent to a letter).
UTF-16 and UTF-32 both use more memory (UTF16 can save some if your encoding something like Chinese), now days it generally isn't such an issue but there's no sense in doubling the amount of memory you use. With video games though it's probably much more of an issue. Also with UTF-16/32 endianness is an issue.
UTF-8 is normally much smaller and much more widely supported. You don't need to use any special char's, but you do need to use special library functions when manipulating text (are you getting the size of the string in bytes, the number of codepoints or the number of visible glyphs?).
With video games, you normally control the text rendering. So using whatever you want internally should be fine, you only have to deal with conversions for external API's.
With Windows, Microsoft have their own non-portable functions that accept tchar/wchars so if your using them you will need to convert to UTF-16. For games, this is probably only an issue with things like setting the window title, message boxes and filenames (which have other issues such as slashdirection). I'm not sure how Direct X does text rendering though.