I have racing cars and want to customize the color. Steer right and color goes up one. Steer left and color goes down one. In other systems, I can access the color as a Long and just increment that by 1 (or 10, or 100). Using the RGBA individually, I have it so that it increments R until R>1, then resets that to 0 and increments G, and so on.
//Change color
if (Input.GetButton("Fire3")){
var oldColor : Color;
var v;
var addV = 0.1; // or .01, or .001 depending upon speed I want.
oldColor = transform.GetComponent("CarColor").car_color;
v=oldColor.r+addV;
if (v>1) {
oldColor.r=0;
v=oldColor.g+addV;
if (v>1) {
oldColor.g=0;
v=oldColor.b+addV;
if (v>1) {
oldColor.b=0;
v=oldColor.a+addV;
if (v>1) {
oldColor.a=0;
} else oldColor.a=v;
} else oldColor.b=v;
} else oldColor.g=v;
} else oldColor.r=v;
transform.GetComponent("CarColor").car_color=oldColor;
Is this the best way to handle this, or is there a better way to gradually shift through colors? I’d rather not use a colorpicker, since we’re building for a steering wheel control and not a mouse interface.
If you can live with subdivides which are a power of two (2,4,8,16,32,64,…) you can “translate” your color into a linear integer value and only use a certain bit-count for each color:
// C#
public static int Col2Int(Color aColor, int aBitCount)
{
int maxValue = 2 << aBitCount - 1;
int r = Mathf.FloorToInt(aColor.r * maxValue);
int g = Mathf.FloorToInt(aColor.g * maxValue);
int b = Mathf.FloorToInt(aColor.b * maxValue);
return r | (g << aBitCount) | (b << aBitCount*2);
}
public static Color Int2Col(int aValue, int aBitCount)
{
int maxValue = 2 << aBitCount - 1;
float r = ((float)(( aValue ) & maxValue)) / maxValue;
float g = ((float)(( aValue >> aBitcount ) & maxValue)) / maxValue;
float b = ((float)(( aValue >> aBitcount*2 ) & maxValue)) / maxValue;
return new Color(r,g,b);
}
With those two methods you can “convert” a color into an integer representation with a certain (bit) precision.
For example:
int val = Col2Int(someColor, 3); // 3 bits per color channel
// XXXX XXXB BBGG GRRR
“val” represents the color as a 9 bit value so each color channel can have 8 different values (2^3 == 8). So the value can have 512 different values. This int-value you can increment or decrement as you like.
When done you can use “Int2Col” to convert the integer value back to a color:
Color col = Int2Col(val, 3);
Note: I just wrote those two methods from scratch and don’t have the time to test them, but they should work 
After reading other people’s answers, and googling how to do it outside of Unity, I finally implemented the solution I wanted.
[Here’s the final effect][1]
And here’s the code I used to get that effect.
void ColorUp ()
{
currentIndex += 0.1f;
//if (currentIndex>1) currentIndex=0f;
SetColor ();
}
and
void SetColor()
{
float red = Mathf.Sin (frequency1 * currentIndex + phase1);
float grn = Mathf.Sin (frequency2 * currentIndex + phase2);
float blu = Mathf.Sin (frequency3 * currentIndex + phase3);
car_color.r = red;
car_color.g = grn;
car_color.b = blu;
Debug.Log (car_color);
}
Let me know what you think of the effect. I like it, and think it’s a great way to customize the car.
Thanks to all who pitched in!
[1]: http://www.dcjoys.com/Games/Time_Trials/Chamelian/