Как изменить цвет лайнера во время выполнения?

Цвет по умолчанию теперь смешивается с материалом по умолчанию:

Как изменить цвет лайнера во время выполнения?

Я хочу, чтобы во время выполнения или перед запуском игры, если я установил режим None, весь linerenderer был окрашен в красный цвет:

Я пробовал это, но это окрашивание лайнера в белый цвет, даже если я установил для свойства цвета значение красного:

IEnumerator SelectAnimation(AnimationType animType)
    {
        switch (animType)
        {
            case AnimationType.SingleColorMorph:
                yield return RandomSingleColorMorphing(myLineRenderer, morphTime);
                break;
            case AnimationType.MultiColorMorph:
                yield return RandomMultiColorMorphing(myLineRenderer, morphTime);
                break;
            case AnimationType.Shuffle:
                yield return ShuffleGradient(myLineRenderer, .5f);
                break;
            case AnimationType.Shift:
                yield return AnimateLoop(myLineRenderer);
                break;
            default:
                yield return ggg(Color.red);
                break;
        }
    }

    private Color ggg(Color color)
    {
        Material whiteDiffuseMat = new Material(Shader.Find("Unlit/Texture"));
        whiteDiffuseMat.color = Color.red;
        myLineRenderer.material = whiteDiffuseMat;
        return color;
    }

Я также попытался внутри метода ggg установить начальный и конечный цвета myLineRenderer в красный цвет без изменения материала, но это ничего не изменило.

Стоит ли изучать PHP в 2023-2024 годах?
Стоит ли изучать PHP в 2023-2024 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
1
0
31
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Мне удалось решить эту проблему. Здесь я объясню, как можно, например, изменить цвет двухточечного градиента, но добавлять нужные детали зависит от вас. Сначала вам нужно определить градиент с некоторыми ключевыми точками, и, поскольку градиент нельзя напрямую преобразовать в другой градиент, вам нужно лерпировать его цвета. Главный совет — отобразить градиент на линейном рендерере, вам нужен материал, который его поддерживает. Я использовал Particle/ Standard Unlit эта работа в порядке.

Хорошо. Здесь я настроил lineRenderer с двухточечным красно-синим градиентом (например):

    private LineRenderer _lineRenderer;
    void Start()
    {
        _lineRenderer = GetComponent<LineRenderer>();
        
        // how to create gradient in script?
        var gradient = new Gradient();
        
        gradient.mode = GradientMode.Blend;

        var gradientColorKeys = new GradientColorKey[2]
        {
            new GradientColorKey(Color.red, .2f),
            new GradientColorKey(Color.blue, .8f)
        };
        
        var alphaKeys = new GradientAlphaKey[2]
        {
            new GradientAlphaKey(1f, .2f),
            new GradientAlphaKey(1f, .8f)
        };

        gradient.SetKeys(gradientColorKeys, alphaKeys);
        
        _lineRenderer.colorGradient = gradient;

        // This enumerator changes color within a specified time
        StartCoroutine(MorphToColor(Color.green, Color.magenta, 2f));
    }

Я также написал изменение цвета Enumarator в том же классе, которое изменяет цвет двух конкретных точек:

    public IEnumerator MorphToColor(Color color1, Color color2, float morphTime = 1f)
    {
        Debug.Log("start morph");
        var c1 = _lineRenderer.colorGradient.Evaluate(.2f);
        var c2 = _lineRenderer.colorGradient.Evaluate(.8f);

        var fade = 0f;

        while (fade <= 1)
        {
            var gradient = new Gradient();
            gradient.mode = GradientMode.Blend;
            var gradientColorKeys = new GradientColorKey[2]
            {
                new GradientColorKey(Color.Lerp(c1, color1, fade), .2f),
                new GradientColorKey(Color.Lerp(c2, color2, fade), .8f)
            };
        
            var alphaKeys = new GradientAlphaKey[2]
            {
                new GradientAlphaKey(1f, .2f),
                new GradientAlphaKey(1f, .8f)
            };
            
            gradient.SetKeys(gradientColorKeys, alphaKeys);
            
            _lineRenderer.colorGradient = gradient;
            
            yield return new WaitForEndOfFrame();

            fade += Time.deltaTime/morphTime;
        }
    }

Как видите, результат будет таким. Я надеюсь, что это будет полезно.

Другие вопросы по теме