I have not found a "one tween to rule them all" solution like you're proposing. Each GameObject child needs its own tween, since each child has its own material instance that is being colored. I had the same issue when I received some "programmer art" that needed to be colorized: I had to actually traverse the hierarchy and attach tweens to all the children GameObjects.
One advantage to this system, though, is that I can pause my game (and all these color, scale, and position tweens stop right where they are mid-iteration) and resume them afterward with no need to recalculate logic (like "where were they going? how fast? how much time is left to have to create my own lerp?).
// You can pause the entire object by disabling its tweens, since TweenScale, TweenColor, and
// TweenPosition all resume perfectly once they are re-enabled.
//
// 'canAcceptInput' is a global flag used when identifying NGUI click events: when false, we
// don't consider this object's collider; when true, we do
public void PauseObject()
{
if (gameObject != null) {
UITweener[] tweens = gameObject.GetComponents<UITweener>();
foreach (UITweener tween in tweens) {
tween.enabled = false;
}
}
canAcceptInput = false;
}
// Re-enabling the scale, color, and position tweens effectively unpauses the object.
public void UnpauseObject()
{
if (gameObject != null) {
UITweener[] tweens = gameObject.GetComponents<UITweener>();
foreach (UITweener tween in tweens) {
tween.enabled = true;
}
}
canAcceptInput = true;
}
// Attach a color tween to each child element, as long as it has a renderer attached.
public void SetObjectColor(Color newColor, float colorTime)
{
// Loop through each child transform and, when they have renderers attached to them, tween their colors
foreach (Transform child in this.transform) {
if (child.renderer != null) {
TweenColor tween = TweenColor.Begin(child.gameObject, colorTime, newColor);
tween.onFinished += OnObjectColorFinished;
}
}
}
// Called as soon as each color tween has run its course.
// This callback does not get fired while a tween is paused (disabled) but it WILL get called
// once the tween is unpaused (re-enabled).
public OnObjectColorFinished(UITweener tween)
{
// Do something once the color tween has completed
}