Hi,
Since you provide a "Is Password" property on UIInput to handle password cases, I thought it would finalize the feature to add the ability to specify the character to use instead of forcing the char to '*'.
That's a really small feature request and it's also atomic enought to bring issues implementing it.
I've already made the change on my side yet I'd like to avoid that being removed every time I update my NGUI package to get all the neat additional features and bug fixes.
So here is the code I implemented myself which seems to be compliant with your approach. (Please, consider adding this

)
In NGUI/Scripts/UI/UIInput.cs:
@line 54 right after caratChar field.
[...]
/// <summary>
/// Visual carat character appended to the end of the text when typing.
/// </summary>
public string caratChar = "|";
/// <summary>
/// Character used to replace the text when isPassword is set to true.
/// </summary>
public string passwordChar = "*";
/// <summary>
/// Delegate used for validation.
/// </summary>
public Validator validator;
[...]
@line 248, replace the existing code with this line:
if (isPassword) label.password = true; label.passwordChar = passwordChar;
Then, we replace @line 448 in the UpdateLabel() method:
[...]
// Start with the text and append the IME composition and carat chars
string processed;
if (isPassword && selected)
{
processed = "";
for (int i = 0, imax = mText.Length; i < imax; ++i) processed += passwordChar;
processed += Input.compositionString + caratChar;
}
else processed = selected ? (mText + Input.compositionString + caratChar) : mText;
[...]
Now, we need to change a few more lines in NGUI/Scripts/UI/UILabel.cs
@line 26, we add the following new field:
[HideInInspector][SerializeField] string mPasswordChar = "*";
And @line 276, right after the password property, we add this new one:
/// <summary>
/// The character to use to hide label content when password is set
/// </summary>
public string passwordChar
{
get { return mPasswordChar; }
set
{
mPasswordChar = value;
hasChanged = true;
}
}
And finally, replace the previously static "*" occurrences by the mPasswordChar field value in ProcessText() method:
@line 472
for (int i = 0, imax = mProcessedText.Length - 1; i < imax; ++i) hidden += mPasswordChar;
And finally @line 477
for (int i = 0, imax = mProcessedText.Length; i < imax; ++i) hidden += mPasswordChar;