Unity 6.3
0 онлайн 76 гостей 3 в системе
Вход

SpriteShapeRenderer.SetShaderUserValue

Declaration

public void SetShaderUserValue(uint v);

Параметры

Параметр Описание
v Целое число, которое будет назначено рендеру в качестве пользовательского значения для использования в шейдерах.

Описание

Назначить пользовательское значение для этого рендерера.

Метод SetShaderUserValue присваивает пользовательское целое значение для рендерера. Затем вы можете получить доступ к этому значению в своих шейдерах в качестве переменной unity_RendererUserValue. Вы можете использовать этот метод для изменения того, как шейдер рисует каждый рендерер, без использования различных материалов или дополнительного CPU времени.

Примечание: Значение переменной unity_RendererUserValue всегда будет равняться 0 в следующих ситуациях:

* Шейдер написан для встроенного Render Pipeline. * При изготовлении lightmaps или light probes.

Примечание: Значение не сериализовано, поэтому оно не сохраняется в ассете и сбросилось при перезагрузке объекта.

Дополнительные ресурсы: SpriteShapeRenderer.GetShaderUserValue.

В следующем примере кода создается MonoBehaviour для присвоения определенного цветового значения на рендерере путем кодирования его в uint.

using UnityEngine;
using UnityEngine.Rendering;
using UnityEngine.Tilemaps;
using UnityEngine.U2D;

[ExecuteAlways] public class PerRendererColor : MonoBehaviour { public Color color = Color.white;

private SpriteShapeRenderer m_Renderer;

void Start() { m_Renderer = GetComponent<SpriteShapeRenderer>(); }

void Update() { if (m_Renderer) { Color32 colorb = color; uint packedColor = (uint)colorb.r | ((uint)colorb.g << 8) | ((uint)colorb.b << 16); m_Renderer.SetShaderUserValue(packedColor); } } }

Соответствующий код шейдера распаковывает беззнаковое целое число в триплет с плавающей запятой RGB в шейдере фрагмента.

// This shader fills the mesh shape with the color packed in the renderer's user value.
Shader "Example/URPUnlitUserValue"
{
    Properties
    { }

SubShader { Tags { "RenderType" = "Opaque" "RenderPipeline" = "UniversalPipeline" }

Pass { HLSLPROGRAM #pragma vertex vert #pragma fragment frag

#include "Packages/com.unity.render-pipelines.universal/ShaderLibrary/Core.hlsl"

struct Attributes { float4 positionOS : POSITION; };

struct Varyings { float4 positionHCS : SV_POSITION; };

Varyings vert(Attributes IN) { Varyings OUT; OUT.positionHCS = TransformObjectToHClip(IN.positionOS.xyz); return OUT; }

half4 frag() : SV_Target { // Decoding the user value color and returning it. uint3 c = uint3(unity_RendererUserValue & 0xFF, (unity_RendererUserValue >> 8) & 0xFF, (unity_RendererUserValue >> 16) & 0xFF); return half4(half3(c) / 255.0f, 1.0f); } ENDHLSL } } }