Собственно вот:
Синтаксис:
Используется csharp
void SetBodyColor(float H, float S, float V) {
if(H >= 0 && H <=60) BodyColor = new Color(1,H/60,0);
if(H > 60 && H <= 120) BodyColor = new Color(1-(H-60)/60,1,0);
if(H > 120 && H <= 180) BodyColor = new Color(0,1,(H-120)/60);
if(H > 180 && H <= 240) BodyColor = new Color(0,1-(H-180)/60,1);
if(H > 240 && H <= 300) BodyColor = new Color((H-240)/60,0,1);
if(H > 300 && H <= 360) BodyColor = new Color(1,0,1-(H-300)/60);
BodyColor.r *= V;
BodyColor.g *= V;
BodyColor.b *= V;
BodyColor.r += (V-BodyColor.r)*(1-S);
BodyColor.g += (V-BodyColor.g)*(1-S);
BodyColor.b += (V-BodyColor.b)*(1-S);
}
if(H >= 0 && H <=60) BodyColor = new Color(1,H/60,0);
if(H > 60 && H <= 120) BodyColor = new Color(1-(H-60)/60,1,0);
if(H > 120 && H <= 180) BodyColor = new Color(0,1,(H-120)/60);
if(H > 180 && H <= 240) BodyColor = new Color(0,1-(H-180)/60,1);
if(H > 240 && H <= 300) BodyColor = new Color((H-240)/60,0,1);
if(H > 300 && H <= 360) BodyColor = new Color(1,0,1-(H-300)/60);
BodyColor.r *= V;
BodyColor.g *= V;
BodyColor.b *= V;
BodyColor.r += (V-BodyColor.r)*(1-S);
BodyColor.g += (V-BodyColor.g)*(1-S);
BodyColor.b += (V-BodyColor.b)*(1-S);
}
BodyColor - переменная типа Color для конечного цвета. Переменные H S V задаются ползунками HorizontalSlider. H задается от 0.0 до 360.0, S и V от 0.0 до 1.0. Формулы высчитывал сам, опираясь на палитру Gimp'а.
Суть темы:
C# только изучаю, до этого владел js в плане web дизайна (скажу, что похожи таки). Так вооот. Такой функцией очень неудобно пользоваться и она громоздкая. К примеру: переменная BodyColor отвечает за цвет тела (неужели), и чтобы изменит цвет глаз, нужно эту функцию продублировать в коде, изменить ее название и заменить переменные, так же и с гривой и хвостом и с второстепенными цветами гривы\хвоста и еще много чего (гг - пони, не удивляйтесь). Если есть какой-то другой путь, чтобы не дублировать постоянно эту функцию, прошу его описание, желательно конечно, чтобы он поподробнее был. Изучаю c# преимущественно шарясь в чужих кодах и по статьям с форума.
Мои догадки: Думал, можно как-то запилить функцию, которая возвращала бы результат типа Color, который записывался бы в нужную переменную. Вроде сеттер и геттер подходят.
PS Вот полный код, в котором, пока только, задаются 3 цвета :I
Синтаксис:
Используется csharp
public class Custom : MonoBehaviour {
public GameObject _body;
public GameObject _hair;
public GUISkin _style;
private float BodyH;
private float BodyS;
private float BodyV;
private float EyeH;
private float EyeS;
private float EyeV;
private float HairH;
private float HairS;
private float HairV;
private Color BodyColor;
private Color EyeColor;
private Color HairColor;
void Start () {
Randomize();
}
void OnGUI() {
GUI.skin = _style;
if(GUI.Button(new Rect(Screen.width-155,5, 150, 20), "Randomize")) Randomize();
BodyH = GUI.HorizontalSlider(new Rect(Screen.width-155,30, 150, 10), BodyH, 0, 360);
BodyS = GUI.HorizontalSlider(new Rect(Screen.width-155,45, 150, 10), BodyS, 0, 1);
BodyV = GUI.HorizontalSlider(new Rect(Screen.width-155,60, 150, 10), BodyV, 0, 1);
EyeH = GUI.HorizontalSlider(new Rect(Screen.width-155,90, 150, 10), EyeH, 0, 360);
EyeS = GUI.HorizontalSlider(new Rect(Screen.width-155,105, 150, 10), EyeS, 0, 1);
EyeV = GUI.HorizontalSlider(new Rect(Screen.width-155,120, 150, 10), EyeV, 0, 1);
HairH = GUI.HorizontalSlider(new Rect(Screen.width-155,150, 150, 10), HairH, 0, 360);
HairS = GUI.HorizontalSlider(new Rect(Screen.width-155,165, 150, 10), HairS, 0, 1);
HairV = GUI.HorizontalSlider(new Rect(Screen.width-155,180, 150, 10), HairV, 0, 1);
}
void Update () {
SetBodyColor(BodyH, BodyS, BodyV);
SetEyeColor(EyeH, EyeS, EyeV);
SetHairColor(HairH, HairS, HairV);
_body.renderer.materials[0].color = BodyColor;
_body.renderer.materials[0].SetColor("_OutlineColor", new Color(BodyColor.r/3,BodyColor.g/3,BodyColor.b/3));
_body.renderer.materials[2].color = EyeColor;
_hair.renderer.materials[0].color = HairColor;
_hair.renderer.materials[0].SetColor("_OutlineColor", new Color(HairColor.r/3,HairColor.g/3,HairColor.b/3));
}
void Randomize() {
BodyH = Random.Range(0.0f, 360.0f);
BodyS = Random.Range(0.0f, 1.0f);
BodyV = Random.Range(0.0f, 1.0f);
EyeH = Random.Range(0.0f, 360.0f);
EyeS = Random.Range(0.0f, 1.0f);
EyeV = Random.Range(0.0f, 1.0f);
HairH = Random.Range(0.0f, 360.0f);
HairS = Random.Range(0.0f, 1.0f);
HairV = Random.Range(0.0f, 1.0f);
}
void SetBodyColor(float H, float S, float V) {
if(H >= 0 && H <=60) BodyColor = new Color(1,H/60,0);
if(H > 60 && H <= 120) BodyColor = new Color(1-(H-60)/60,1,0);
if(H > 120 && H <= 180) BodyColor = new Color(0,1,(H-120)/60);
if(H > 180 && H <= 240) BodyColor = new Color(0,1-(H-180)/60,1);
if(H > 240 && H <= 300) BodyColor = new Color((H-240)/60,0,1);
if(H > 300 && H <= 360) BodyColor = new Color(1,0,1-(H-300)/60);
BodyColor.r *= V;
BodyColor.g *= V;
BodyColor.b *= V;
BodyColor.r += (V-BodyColor.r)*(1-S);
BodyColor.g += (V-BodyColor.g)*(1-S);
BodyColor.b += (V-BodyColor.b)*(1-S);
}
void SetEyeColor(float H, float S, float V) {
if(H >= 0 && H <=60) EyeColor = new Color(1,H/60,0);
if(H > 60 && H <= 120) EyeColor = new Color(1-(H-60)/60,1,0);
if(H > 120 && H <= 180) EyeColor = new Color(0,1,(H-120)/60);
if(H > 180 && H <= 240) EyeColor = new Color(0,1-(H-180)/60,1);
if(H > 240 && H <= 300) EyeColor = new Color((H-240)/60,0,1);
if(H > 300 && H <= 360) EyeColor = new Color(1,0,1-(H-300)/60);
EyeColor.r *= V;
EyeColor.g *= V;
EyeColor.b *= V;
EyeColor.r += (V-EyeColor.r)*(1-S);
EyeColor.g += (V-EyeColor.g)*(1-S);
EyeColor.b += (V-EyeColor.b)*(1-S);
}
void SetHairColor(float H, float S, float V) {
if(H >= 0 && H <=60) HairColor = new Color(1,H/60,0);
if(H > 60 && H <= 120) HairColor = new Color(1-(H-60)/60,1,0);
if(H > 120 && H <= 180) HairColor = new Color(0,1,(H-120)/60);
if(H > 180 && H <= 240) HairColor = new Color(0,1-(H-180)/60,1);
if(H > 240 && H <= 300) HairColor = new Color((H-240)/60,0,1);
if(H > 300 && H <= 360) HairColor = new Color(1,0,1-(H-300)/60);
HairColor.r *= V;
HairColor.g *= V;
HairColor.b *= V;
HairColor.r += (V-HairColor.r)*(1-S);
HairColor.g += (V-HairColor.g)*(1-S);
HairColor.b += (V-HairColor.b)*(1-S);
}
}
public GameObject _body;
public GameObject _hair;
public GUISkin _style;
private float BodyH;
private float BodyS;
private float BodyV;
private float EyeH;
private float EyeS;
private float EyeV;
private float HairH;
private float HairS;
private float HairV;
private Color BodyColor;
private Color EyeColor;
private Color HairColor;
void Start () {
Randomize();
}
void OnGUI() {
GUI.skin = _style;
if(GUI.Button(new Rect(Screen.width-155,5, 150, 20), "Randomize")) Randomize();
BodyH = GUI.HorizontalSlider(new Rect(Screen.width-155,30, 150, 10), BodyH, 0, 360);
BodyS = GUI.HorizontalSlider(new Rect(Screen.width-155,45, 150, 10), BodyS, 0, 1);
BodyV = GUI.HorizontalSlider(new Rect(Screen.width-155,60, 150, 10), BodyV, 0, 1);
EyeH = GUI.HorizontalSlider(new Rect(Screen.width-155,90, 150, 10), EyeH, 0, 360);
EyeS = GUI.HorizontalSlider(new Rect(Screen.width-155,105, 150, 10), EyeS, 0, 1);
EyeV = GUI.HorizontalSlider(new Rect(Screen.width-155,120, 150, 10), EyeV, 0, 1);
HairH = GUI.HorizontalSlider(new Rect(Screen.width-155,150, 150, 10), HairH, 0, 360);
HairS = GUI.HorizontalSlider(new Rect(Screen.width-155,165, 150, 10), HairS, 0, 1);
HairV = GUI.HorizontalSlider(new Rect(Screen.width-155,180, 150, 10), HairV, 0, 1);
}
void Update () {
SetBodyColor(BodyH, BodyS, BodyV);
SetEyeColor(EyeH, EyeS, EyeV);
SetHairColor(HairH, HairS, HairV);
_body.renderer.materials[0].color = BodyColor;
_body.renderer.materials[0].SetColor("_OutlineColor", new Color(BodyColor.r/3,BodyColor.g/3,BodyColor.b/3));
_body.renderer.materials[2].color = EyeColor;
_hair.renderer.materials[0].color = HairColor;
_hair.renderer.materials[0].SetColor("_OutlineColor", new Color(HairColor.r/3,HairColor.g/3,HairColor.b/3));
}
void Randomize() {
BodyH = Random.Range(0.0f, 360.0f);
BodyS = Random.Range(0.0f, 1.0f);
BodyV = Random.Range(0.0f, 1.0f);
EyeH = Random.Range(0.0f, 360.0f);
EyeS = Random.Range(0.0f, 1.0f);
EyeV = Random.Range(0.0f, 1.0f);
HairH = Random.Range(0.0f, 360.0f);
HairS = Random.Range(0.0f, 1.0f);
HairV = Random.Range(0.0f, 1.0f);
}
void SetBodyColor(float H, float S, float V) {
if(H >= 0 && H <=60) BodyColor = new Color(1,H/60,0);
if(H > 60 && H <= 120) BodyColor = new Color(1-(H-60)/60,1,0);
if(H > 120 && H <= 180) BodyColor = new Color(0,1,(H-120)/60);
if(H > 180 && H <= 240) BodyColor = new Color(0,1-(H-180)/60,1);
if(H > 240 && H <= 300) BodyColor = new Color((H-240)/60,0,1);
if(H > 300 && H <= 360) BodyColor = new Color(1,0,1-(H-300)/60);
BodyColor.r *= V;
BodyColor.g *= V;
BodyColor.b *= V;
BodyColor.r += (V-BodyColor.r)*(1-S);
BodyColor.g += (V-BodyColor.g)*(1-S);
BodyColor.b += (V-BodyColor.b)*(1-S);
}
void SetEyeColor(float H, float S, float V) {
if(H >= 0 && H <=60) EyeColor = new Color(1,H/60,0);
if(H > 60 && H <= 120) EyeColor = new Color(1-(H-60)/60,1,0);
if(H > 120 && H <= 180) EyeColor = new Color(0,1,(H-120)/60);
if(H > 180 && H <= 240) EyeColor = new Color(0,1-(H-180)/60,1);
if(H > 240 && H <= 300) EyeColor = new Color((H-240)/60,0,1);
if(H > 300 && H <= 360) EyeColor = new Color(1,0,1-(H-300)/60);
EyeColor.r *= V;
EyeColor.g *= V;
EyeColor.b *= V;
EyeColor.r += (V-EyeColor.r)*(1-S);
EyeColor.g += (V-EyeColor.g)*(1-S);
EyeColor.b += (V-EyeColor.b)*(1-S);
}
void SetHairColor(float H, float S, float V) {
if(H >= 0 && H <=60) HairColor = new Color(1,H/60,0);
if(H > 60 && H <= 120) HairColor = new Color(1-(H-60)/60,1,0);
if(H > 120 && H <= 180) HairColor = new Color(0,1,(H-120)/60);
if(H > 180 && H <= 240) HairColor = new Color(0,1-(H-180)/60,1);
if(H > 240 && H <= 300) HairColor = new Color((H-240)/60,0,1);
if(H > 300 && H <= 360) HairColor = new Color(1,0,1-(H-300)/60);
HairColor.r *= V;
HairColor.g *= V;
HairColor.b *= V;
HairColor.r += (V-HairColor.r)*(1-S);
HairColor.g += (V-HairColor.g)*(1-S);
HairColor.b += (V-HairColor.b)*(1-S);
}
}