একাধিক রঙের মধ্যে কিভাবে রঙ করুন?


12

ইউনিটির দলিলগুলিতে এর সমাধান খুঁজে পাওয়া আমার পক্ষে বরং কঠিন মনে হয়েছে।

Color.Lerp(Color a, Color b, float t) এটি এমন একটি ফাংশন যা ধাপে ধাপে ধীরে ধীরে রঙ পরিবর্তন করে এটি রঙ বি এর চূড়ান্ত মান দেয়।

আমি একের পর এক একাধিক রঙের মধ্যে কীভাবে লার্প করব?

উত্তর:


13

যাক _colors রঙের একটি অ্যারের দিন হতে দৈর্ঘ্য অ্যারের মধ্যে রঙের সংখ্যা হতে দিন টি 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)

+1 - দুর্দান্ত উত্তর - কোনও লুপিং বা বিশেষ শাখা প্রয়োজন হয় না, এবং এটি সম্পূর্ণরূপে এন রঙে সাধারণ।
jpaver

যখন মান 1 টি হিট হবে তখন রঙটি কী অ্যারেতে খুব শেষ রঙ হবে?
G3tinmybelly

G3tinmybelly আপনি ঠিক বলেছেন। টি == 1 সঠিকভাবে পরিচালিত হয়নি। সুতরাং আমরা এর আগে যুক্ত করতে পারি: যদি (t == 1)
আরার

10

একাধিক রঙের ট্রানজিশনের সাথে নেওয়া যেতে পারে এমন একটি পদ্ধতির নাম হ'ল গ্রেডিয়েন্টটি লাভ করা

এই ধরণের কোনও পাবলিক ভেরিয়েবল প্রকাশ করে কোনও বিকাশকারী কোনও গ্রেডিয়েন্ট সম্পাদক চালু করতে কোনও পরিসংখ্যানযুক্ত রঙের গ্রেডিয়েন্ট ডিজাইন করতে ইন্সপেক্টর ব্যবহার করুন। এই সম্পাদকটি আপনাকে unityক্য রঙ পিকারগুলি, রঙ / আলফা কীগুলির সূক্ষ্ম সুরের স্থান নির্ধারণ এবং সংরক্ষণ / লোড গ্রেডিয়েন্টগুলি ব্যবহার করতে দেয়।

এখানে চিত্র বর্ণনা লিখুন

একবার ডিজাইন করার পরে 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);
    }
}

দুর্ভাগ্যক্রমে প্রোগ্রামিয়ালি গ্রেডিয়েন্ট তৈরির জন্য এপিআই তেমন মার্জিত নয়


1
কালারব্যান্ডগুলি একই লক্ষ্যে ব্যবহার করা যেতে পারে তবে রঙের চেয়ে আরও বেশি স্বাধীনতার সাথে
স্টিক ওভারফ্লো

1
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;
        }
    }
}

সুতরাং এই কোডটি আমি আমার তিনটি রঙের মধ্যে লার্প ব্যবহার করে শেষ করেছি, আমি আশা করি যে কেউ এই সন্ধান করার সিদ্ধান্ত নিয়েছে আমি তার কাজে আসব।


0

আমার মনে হচ্ছে এর থেকে আরও ভাল সমাধান হতে পারে। আমি রঙ থেকে বর্ণের দিকে ঝাঁপিয়ে পড়ার একমাত্র কারণ হ'ল যদি আপনি ক্রমাগত বর্ণটি পরিবর্তন করতে চান ... http://en.wikedia.org/wiki/Hue

এইচএসভি কে কীভাবে আরজিবিতে রূপান্তর করতে হবে তা এখানে: http://en.wikedia.org/wiki/HSL_and_HSV#From_HSV

এটির সাহায্যে আপনি এইচএসভি রং ব্যবহার করতে পারেন, কেবল রঙ পরিবর্তন করতে পারেন, তারপরে আরজিবিতে রূপান্তর করতে পারেন। এছাড়াও, কালার.লার্প সহ আপনার অসামঞ্জস্যতার সমস্যা রয়েছে। যদি আপনি কমলা থেকে হলুদ হয়ে সবুজ হয়ে যায় তবে আপনি দেখতে পাবেন যে রঙ খুব তাড়াতাড়ি হলুদ হতে শুরু করে তারপর এটি হলুদ হয়ে যাওয়ার সাথে সাথে ধীরে ধীরে শুরু হয়, পরে এটি একবার হলুদ হয়ে যায় এবং সবুজ হয়ে যায় spe সুতরাং এটি আপনি যে দিকে যাচ্ছেন সেই প্রতি বিন্দুতে রঙ বদলাবে। আমি মনে করি যে রঙ পরিবর্তন করা আরও কার্যকর হবে - এবং দীর্ঘমেয়াদে, আরও ভাল প্রভাব দেবে। :)


0

আপনি কীভাবে নিজের সংস্করণ লিখবেন, কোনটি লিভারেজ 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);
}

0

যেহেতু আপনি রঙটি পরিবর্তন করতে চান তা আপনি বলেননি, তাই পদ্ধতিটিতে তৈরি রঙের সাথে আমি একটি অস্পষ্ট উদাহরণ দেব।

মূল বিষয়টি হ'ল রঙগুলির সংকলন এবং মোট একটি সময়কাল (যেমন আমি সরবরাহ করব উদাহরণের মতো) বা প্রত্যেকের মধ্যে একটি সময়কাল (এটি আপনার উপর নির্ভরশীল)।

আপডেটে আমি ব্যক্তিগতভাবে জিনিসগুলিকে বিভক্ত করি না যে আমি জানি যে আমি ক্রমাগত ইন্টারপোলটিং করব না (ক্যামেরা একটি ব্যতিক্রম হ'ল), তাই আমি এটি পরিচালনা করতে কর্টিন ব্যবহার করি।

এই উদাহরণে আমি পরিদর্শকের উপর প্রদত্ত সময়কালকে রঙের পরিমাণ অনুসারে ভাগ করে দেব এবং তারপরে আমি প্রকৃত পুনরাবৃত্তির রঙটি পরবর্তী পুনরাবৃত্তকারী বর্ণের সাথে প্রসারিত করব এবং সময়কাল পূর্বে বিভক্ত সময়কালের হবে। নমুনাটি এখানে:

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.
    }
}

আশা করি এটা সাহায্য করবে.

আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.