How to create a color picker

Topic says it all.

I cant seem to find an out-of-the-box solution to this and the other relevant posts only suggest making one from stratch. Perhaps this is indeed the only option.

Any help would be appreciated.

As I promised, I'm from Brazil and speak portuguese, so, you will find somethings in portuguese, hope its help you:

Set these parameters:

Offset X : 10

Offset Y : 10

Cores Offset X : 0

Cores Offset Y : 0

Cores Size X : 128

Cores Size Y : 128

Iluminacao Offset X :130

Iluminacao Offset Y :0

Iluminacao Size X : 10

Iluminacao Size Y : 128

Modo and camaleao is not implemented yet, so, don’t need to alter.

The images and script file you can get from here:

http://www.unity3dbrasil.com/ups/paleta.rar

        var imgCores            : Texture;
        var imgIluminacaoBack   : Texture;
        var imgIluminacao       : Texture;
        var imgPicker           : Texture;
        var imgArrowPicker      : Texture;

        var offset              : Vector2;

        var coresOffset         : Vector2;
        var coresSize           : Vector2;
        var iluminacaoOffset    : Vector2;
        var iluminacaoSize      : Vector2;

        var modo                : String;   //cor para a cor padro, specular para a cor do specular.
        var camaleao            : int;      //se ativado, permite que o specular seja alterado, caso contrrio, o specular ficar branco.

private var state               : String;   //"paleta" para paleta selecionada, "iluminacao" para a barra de iluminacao selecionada e "" para nada
private var coresPicker         : Vector2;  // posicionamento de 0 a 1 dentro da paleta de cores
private var iluminacaoPicker    : float;    // posicionamento de 0 a 1 dentro da barra de iluminao

private var coresRGB            : Vector3;  
private var coresRGBMinusIlum   : Vector3;  //Cor RGB antes de passar pela barra de iluminao, usado para pintar a barra de iluminao no GUI

private var list;               //Lista com todos os objetos que devem ter as cores alteradas.

function Start(){
    list = new Array();
    state = "";
    coresRGB.x=1;
    coresRGB.y=0;
    coresRGB.z=0;
    iluminacaoPicker=0.5;
    coresRGBMinusIlum = Vector3(1,0,0);
    camaleao = 0;
    modo="cor";

    //DEBUG
    SetRGB(Vector3(0.13 , 0.66 , 0.71));
}

function Update () {

    //verifica se ouve um clique e se foi na paleta ou na barra de iluminao
    if (Input.GetMouseButtonDown(0)){
        if (Input.mousePosition.x >= offset.x + coresOffset.x && Input.mousePosition.x <= offset.x + coresOffset.x + coresSize.x - 1){
            if (Screen.height - Input.mousePosition.y >= offset.y + coresOffset.y && Screen.height - Input.mousePosition.y <= offset.y + coresOffset.y + coresSize.y -1 ){
                //Ouve clique dentro da paleta de cores
                state="paleta";
            }
        }
        else
        if (Input.mousePosition.x >= offset.x + iluminacaoOffset.x && Input.mousePosition.x <= offset.x + iluminacaoOffset.x + iluminacaoSize.x - 1){
            if (Screen.height - Input.mousePosition.y >= offset.y + iluminacaoOffset.y && Screen.height - Input.mousePosition.y <= offset.y + iluminacaoOffset.y + iluminacaoSize.y - 1){
                //Ouve clique dentro da barra de iluminacao
                state="iluminacao";
            }
        }

    }

    //Caso clicado na paleta de cores, adiciona de 0 a 1 na varivel coresPicker a posio do mouse dentro da paleta
    if (state == "paleta"){
        coresPicker.x = (Input.mousePosition.x - offset.x - coresOffset.x) / (coresSize.x-1);
        coresPicker.y = ((Screen.height - Input.mousePosition.y) - offset.y - coresOffset.y) / (coresSize.y-1);
        if (coresPicker.x<0){coresPicker.x=0;}
        if (coresPicker.x>1){coresPicker.x=1;}
        if (coresPicker.y<0){coresPicker.y=0;}
        if (coresPicker.y>1){coresPicker.y=1;}
    }
    else
    //Caso clicado na barra de iluminacao, adiciona de 0 a 1 na varivel iluminacaoPicker a posio do mouse dentro da barra
    if (state == "iluminacao"){
        iluminacaoPicker = 1-(((Screen.height - Input.mousePosition.y) - offset.y - iluminacaoOffset.y) / (iluminacaoSize.y-1));
        if (iluminacaoPicker<0){iluminacaoPicker=0;}
        if (iluminacaoPicker>1){iluminacaoPicker=1;}

    }

    //Caso soltar o mouse, para as aes acima
    if (Input.GetMouseButtonUp(0)){
        state="";
    }

    //pega o RGB na horizontal de acordo com o coresPicker.x
    //Calcula somente se estiver mexendo na paleta de cores ou na barra de iluminacao

    if (state != ""){
        var a : float = 1;
        if(coresPicker.x >= 0 && coresPicker.x <= a/6){
            coresRGB.x= 1;
            coresRGB.y= coresPicker.x / (a / 6);
            coresRGB.z= 0;
        }

        if(coresPicker.x >= a/6 && coresPicker.x <= a/3){
            coresRGB.x= 1-((coresPicker.x-(a/6)) / (a / 6));
            coresRGB.y= 1;
            coresRGB.z= 0;
        }

        if(coresPicker.x >= a/3 && coresPicker.x <= a/2){
            coresRGB.x= 0;
            coresRGB.y= 1;
            coresRGB.z= ((coresPicker.x-(a/6*2)) / (a / 6));
        }

        if(coresPicker.x >= a/2 && coresPicker.x <= a/1.5){
            coresRGB.x= 0;
            coresRGB.y= 1-((coresPicker.x-(a/6*3)) / (a / 6));
            coresRGB.z= 1;
        }

        if(coresPicker.x >= a/1.5 && coresPicker.x <= a/1.2){
            coresRGB.x= ((coresPicker.x-(a/6*4)) / (a / 6));
            coresRGB.y= 0;
            coresRGB.z= 1;
        }       

        if(coresPicker.x >= a/1.2 && coresPicker.x <= a){
            coresRGB.x= 1;
            coresRGB.y= 0;
            coresRGB.z= 1-((coresPicker.x-(a/6*5)) / (a / 6));
        }

    }

    //Aqui as cores em rgb j esto configuradas
    //Agora tratamos a saturao com o coresPicker.y

    //Verifica quanto falta para chegar ao 0.5 (cinza) para cada cor e soma esse valor multiplicado pela fora (picker.y)
    if (state!=""){
        coresRGB.x = coresRGB.x + (0.5-coresRGB.x)*coresPicker.y;
        coresRGB.y = coresRGB.y + (0.5-coresRGB.y)*coresPicker.y;
        coresRGB.z = coresRGB.z + (0.5-coresRGB.z)*coresPicker.y;

        coresRGBMinusIlum = coresRGB; //Aqui atribuimos a cor atual antes de passar pela barra de iluminacao, essa cor ser usada para pintar a barra de iluminao no GUI;
    }

    //Aqui as cores esto configuradas com a saturao
    //Agora trataremos a barra de iluminao

    //Verifica se a barra est acima da metade ou abaixo e faz um processo parecido com o da saturao
    if (state != ""){
        if (iluminacaoPicker>=0.5){
            //puxa parao o branco
            coresRGB.x = coresRGB.x + (1-coresRGB.x)* (iluminacaoPicker-0.5)*2;
            coresRGB.y = coresRGB.y + (1-coresRGB.y)* (iluminacaoPicker-0.5)*2;
            coresRGB.z = coresRGB.z + (1-coresRGB.z)* (iluminacaoPicker-0.5)*2;
        }else{
            //puxa para o preto
            coresRGB.x -= coresRGB.x-(iluminacaoPicker*coresRGB.x*2);
            coresRGB.y -= coresRGB.y-(iluminacaoPicker*coresRGB.y*2);
            coresRGB.z -= coresRGB.z-(iluminacaoPicker*coresRGB.z*2);

        }

    }

    //DEBUG
    var objeto = GameObject.Find("/BOLINHA");
    objeto.renderer.material.color = Color(coresRGB.x,coresRGB.y,coresRGB.z);

}

//FUNCES EXTRAS    
function GetModo(){
    return modo;
}

function SetModo(m:String){
    modo = m;
}

function GetCamaleao(){
    return camaleao;
}

function SetCamaleao(c:int){
    camaleao = c;
}

function GetRGB(){
    return coresRGB;
}

function SetRGB(rgb : Vector3){
    coresRGB = rgb;
    //verifica os maiores e menores numeros
    var numMaior : float = 0;
    var numMeio : float = 0;
    var numMenor : float = 0;
    var rgbMaior ="";
    var rgbMeio="";
    var rgbMenor="";

    if (rgb.x >= rgb.y && rgb.x >= rgb.z){
        numMaior = rgb.x;
        rgbMaior = "R";
        if(rgb.y >= rgb.z){
            numMeio = rgb.y;
            rgbMeio = "G";
            numMenor = rgb.z;
            rgbMenor = "B";
        }else{
            numMeio = rgb.z;
            rgbMeio = "B";
            numMenor = rgb.y;
            rgbMenor = "G";
        }
    }else

    if(rgb.y >= rgb.z){
        numMaior = rgb.y;
        rgbMaior = "G";
        if (rgb.x >= rgb.z){
            numMeio = rgb.x;
            rgbMeio = "R";
            numMenor = rgb.z;
            rgbMenor = "B";
        }else{
            numMeio = rgb.z;
            rgbMeio = "B";
            numMenor = rgb.x;
            rgbMenor = "R"; 
        }   
    }else{
        numMaior = rgb.z;
        rgbMaior = "B";
        if(rgb.x >= rgb.y){
            numMeio = rgb.x;
            rgbMeio = "R";
            numMenor = rgb.y;
            rgbMenor = "G";
        }else{
            numMeio = rgb.y;
            rgbMeio = "G";
            numMenor = rgb.x;
            rgbMenor = "R";
        }
    }
    //Aqui j configuramos as variaveis numMaior, Meio e Menor; rgbMaior, Meio e Menor
    print(rgbMaior);
    print(numMaior);
    print(rgbMeio);
    print(numMeio);
    print(rgbMenor);
    print(numMenor);

    if(rgbMaior == "R"){
        if(rgbMeio == "G"){
            coresPicker.x = 0;
        }else{
            coresPicker.x=1;
        }
    }else
    if(rgbMaior == "G"){
        if(rgbMeio == "R"){
            coresPicker.x = 0.1666666;
        }else{
            coresPicker.x = 0.3333333;
        }
    }else{
        if(rgbMeio == "R"){
            coresPicker.x = 0.8333333;
        }else{
            coresPicker.x = 0.5;
        }
    }

}

function OnGUI(){
    GUI.DrawTexture(Rect(offset.x+coresOffset.x,offset.y+coresOffset.y,coresSize.x,coresSize.y),imgCores);
    GUI.DrawTexture(Rect(offset.x+coresOffset.x+(coresPicker.x*(coresSize.x-1))-5,  offset.y+coresOffset.y+(coresPicker.y*(coresSize.y-1))-5  ,11,11),imgPicker);
    GUI.DrawTexture(Rect(iluminacaoOffset.x+iluminacaoSize.x+offset.x,    offset.y+iluminacaoOffset.y+iluminacaoSize.y-(iluminacaoSize.y*iluminacaoPicker)-5    ,8,9),imgArrowPicker);
    GUI.DrawTexture(Rect(offset.x+iluminacaoOffset.x,offset.y+iluminacaoOffset.y,iluminacaoSize.x,iluminacaoSize.y),imgIluminacaoBack);
    GUI.color = Color(coresRGBMinusIlum.x, coresRGBMinusIlum.y, coresRGBMinusIlum.z);
    GUI.DrawTexture(Rect(offset.x+iluminacaoOffset.x,offset.y+iluminacaoOffset.y,iluminacaoSize.x,iluminacaoSize.y),imgIluminacao);
    GUI.color = Color.white;

    GUI.Box(Rect(0,300,100,20),(1*coresRGB.x).ToString());
    GUI.Box(Rect(0,330,100,20),(1*coresRGB.y).ToString());
    GUI.Box(Rect(0,360,100,20),(1*coresRGB.z).ToString());
    GUI.Box(Rect(0,390,100,20),Input.mousePosition.x.ToString());
    GUI.Box(Rect(0,420,100,20),Input.mousePosition.y.ToString());
    GUI.Box(Rect(0,450,100,20),iluminacaoPicker.ToString());
}

/*
    VARIAVEL LIST GUARDAR OBJETOS QUE SERO ALTERADOS
    CRIAR FUNO ADICIONAROBJETO(OBJ)
    CRIAR FUNO LIMPARLISTA()

*/