태그 보관물: c#

c#

여러 색상 사이를 색상으로 구분하는 방법은 무엇입니까? 단계 t에 따라 색상을

Unity 문서에서 이에 대한 해결책을 찾는 것이 다소 어렵다는 것을 알았습니다.

Color.Lerp(Color a, Color b, float t) 단계 t에 따라 색상을 점진적으로 변경하여 색상 b의 최종 값을 제공하는 함수입니다.

여러 색상을 차례대로 반복하려면 어떻게해야합니까?



답변

하자 _colors은 색상의 배열 할 수 아이폰에가 보자 배열의 색상 수있을 t이 0..1 부동 소수점 값

float scaledTime = t * (float) (LENGHT - 1);
Color oldColor = _colors[(int) scaledTime];
Color newColor = _colors[(int) (scaledTime + 1f)];
float newT = scaledTime - Mathf.Round(scaledTime); 

마지막으로 Lerp를 사용할 수 있습니다

Color.Lerp(oldColor, newColor, newT)


답변

여러 색상 전환으로 수행 할 수있는 한 가지 방법은 그라디언트 를 활용하는 것 입니다.

개발자는 이러한 유형의 공용 변수를 노출함으로써 Inspector를 사용하여 그라디언트 편집기를 시작하여 여러 색상을 포함하는 그라디언트를 디자인 할 수 있습니다. 이 편집기를 사용하면 단일 색상 피커를 사용하고 색상 / 알파 키의 미세한 배치 및 그라디언트를 저장 /로드 할 수 있습니다.

여기에 이미지 설명을 입력하십시오

일단 디자인되면이 Gradient.Evaluate()메서드는 적절한 색상을 반환하기 위해 0-1 범위의 부동 소수점을 받아들입니다.

using UnityEngine;

public class GradientTest : MonoBehaviour
{
    public Gradient myGradient;
    public float strobeDuration = 2f;

    public void Update() {
        float t = Mathf.PingPong(Time.time / strobeDuration, 1f);
        Camera.main.backgroundColor = myGradient.Evaluate(t);
    }
}

불행히도 프로그래밍 방식으로 그라디언트를 빌드하기위한 API는 우아 하지 않습니다 .


답변

public float every;   //The public variable "every" refers to "Lerp the color every X"
float colorstep;
Color[] colors = new Color[4]; //Insert how many colors you want to lerp between here, hard coded to 4
int i;
Color lerpedColor = Color.red;  //This should optimally be the color you are going to begin with

void Start () {

    //In here, set the array colors you are going to use, optimally, repeat the first color in the end to keep transitions smooth

    colors [0] = Color.red;
    colors [1] = Color.yellow;
    colors [2] = Color.cyan;
    colors [3] = Color.red;

}


// Update is called once per frame
void Update () {

    if (colorstep < every) { //As long as the step is less than "every"
        lerpedColor = Color.Lerp (colors[i], colors[i+1], colorstep);
        this.GetComponent<Camera> ().backgroundColor = lerpedColor;
        colorstep +=0.025f;  //The lower this is, the smoother the transition, set it yourself
    } else { //Once the step equals the time we want to wait for the color, increment to lerp to the next color

        colorstep = 0;

        if (i < (colors.Length - 2)){ //Keep incrementing until i + 1 equals the Lengh
        i++;
        }
        else { //and then reset to zero
            i=0;
        }
    }
}

그래서 이것은 내가 세 가지 색상 사이에서 뛰기 위해 사용했던 코드입니다. 이걸 찾기로 결정한 사람이라면 누구나 사용할 수 있기를 바랍니다.


답변

더 나은 해결책이있을 것 같습니다. 색상에서 색상으로 나아갈 수있는 유일한 이유는 색조를 지속적으로 변경하려는 경우입니다.
http://en.wikipedia.org/wiki/Hue

HSV를 RGB로 변환하는 방법은 다음과 같습니다. http://en.wikipedia.org/wiki/HSL_and_HSV#From_HSV

이를 통해 HSV 색상을 사용하고 색조를 변경 한 다음 RGB로 변환 할 수 있습니다. 또한 Color.Lerp를 사용하면 불일치 문제가 있습니다. 주황색에서 노란색으로, 녹색으로 뛰면 색상이 매우 빠르게 노란색으로 바뀌기 시작하고 노란색에 가까워 질수록 느리게 시작한 다음 노란색이 지나고 다시 녹색으로 변하면 다시 속도가 빨라집니다. 따라서 당신이 견딜 수있는 모든 시점에서 색상 변경이 느려질 것입니다. 색조를 변경하는 것이 훨씬 더 효과적이라고 생각합니다. 장기적으로는 더 나은 효과를 줄 것입니다. 🙂


답변

자신의 버전을 작성하는 것은 Color.Lerp()어떻습니까?

3 가지 색상을 사용하고 중간에 두 번째 색상을 넣는 매우 간단한 버전은 다음과 같습니다.

Color Lerp3(Color a, Color b, Color c, float t)
{
    if (t < 0.5f) // 0.0 to 0.5 goes to a -> b
        return Color.Lerp(a, b, t / 0.5f);
    else // 0.5 to 1.0 goes to b -> c
        return Color.Lerp(b, c, (t - 0.5f) / 0.5f);
}


답변

색상을 바꾸고 싶은 것을 말하지 않았으므로 메소드에서 만든 색상으로 모호한 예를 들겠습니다.

요점은 색상 모음과 총 지속 시간 (예 : 제공 할 예제와 같이) 또는 각 색상 간의 지속 시간 (사용자에게 달려 있음)을 갖는 것입니다.

나는 개인적 으로 끊임없이 보간하지 않을 것이라는 것을 알고있는 업데이트에 대해 보간하지 않습니다 (카메라는 예외 임). 따라서 코 루틴을 사용하여 처리합니다.

이 예제에서는 관리자에 지정된 지속 시간을 색상 수량으로 나눈 다음 실제 반복기 색상을 다음 반복기 색상으로 나눕니다. 지속 시간은 이전에 접합 된 지속 시간입니다. 샘플은 다음과 같습니다.

public class ColorLerping : MonoBehaviour
{
    public Color sampleColor; /// Just for debugging purposes.
    public float lerpDuration;
    public Color[] colors;

    void Awake()
    {
        StartCoroutine(LerpColors());
    }

    private IEnumerator LerpColors()
    {
        if(colors.Length > 0)
        {
            /// Split the time between the color quantities.
            float dividedDuration = lerpDuration / colors.Lenght;

            for(int i = 0; i < colors.Length - 1; i++)
            {
                float t = 0.0f;

                while(t < (1.0f + Mathf.Epsilon))
                {
                    sampleColor = Color.Lerp(colors[i], colors[i + 1], t);
                    t += Time.deltaTime / dividedDuration;
                    yield return null;
                }

                // Since it is posible that t does not reach 1.0, force it at the end.
                sampleColor = Color.Lerp(colors[i], colors[i + 1], 1.0f);
            }

        }
        else yield return null; /// Do nothing if there are no colors.
    }
}

도움이 되길 바랍니다.


답변