Hey,
I've noticed that when framerate temporarily drops, Unity's Input class sometimes misses mouse events, resulting in NGUI buttons feeling unresponsive, even totally ignoring clicks.
Basically, what happens is that you might get an Input.GetMouseButtonUp without an Input.GetMouseButtonDown occurring before it. An NGUI button won't received the Clicked event if Input.GetMouseButtonDown was skipped by Unity.
This is not an NGUI bug, but there's a very simple way to fix this in NGUI, but changing a few lines in UICamera.
Here is what you need to change in UICamera.cs:
instead of this (from line 832 in NGUI 2.7)
// Process all 3 mouse buttons as individual touches
if (useMouse)
{
for (int i = 0; i < 3; ++i)
{
bool pressed = Input.GetMouseButtonDown(i);
bool unpressed = Input.GetMouseButtonUp(i);
...
Use this:
// Process all 3 mouse buttons as individual touches
if (useMouse)
{
for (int i = 0; i < 3; ++i)
{
bool pressed = false, unpressed = false;
if (Input.GetMouseButtonDown(i) && Input.GetMouseButtonUp(i))
{
//press unpress in same frame
pressed = true;
unpressed = true;
mouseDown
= false;
}
else
if (Input.GetMouseButton(i) != mouseDown[ i ])
{
pressed = Input.GetMouseButton(i);
unpressed = !Input.GetMouseButton(i);
mouseDown = pressed;
}
...
You will also need to declare as the MouseDown array as a global private field somewhere in the class, like this:
private bool[] mouseDown = new bool[3];
Hope this helps.
BTW, Michael, if you read this and if you feel this modification makes sense, it would be great to have it integrated in a coming release of NGUI. And while we're at it, it would be even better if this problem was fixed in Unity's Input class and/or the so much anticipated new UI system. 
Tks