Pular para o conteúdo
AstraDOCS

API gráfica com os nomes da Unity

Volume e perfil, overrides de pós, RenderSettings, Hora do dia com eventos, materiais por nome da URP e busca no mundo, com exemplos que rodaram no celular.

Validado no aparelho · APK 0.4.0 · os seis exemplos rodaram no POCO F7 em C# e em Flow em 26/10

Desde a 0.4.0, o que os componentes gráficos fazem também tem os nomes e as assinaturas da Unity, no namespace Astra.Rendering e nas fachadas de Astra.Components. Os nomes antigos continuam valendo.

using Astra;
using Astra.Rendering;
var volume = Volume.Get(objetoDoVolume)!; // o Volume (componente Ambiente) do objeto
volume.Weight = 1; // 0 a 1, como volume.weight
volume.SharedProfile = outroPerfil; // troca o perfil compartilhado (Volume.sharedProfile)
var perfil = volume.Profile; // cópia só deste Volume (volume.profile)
if (!perfil.TryGet<Bloom>(out var bloom))
bloom = perfil.Add<Bloom>(overrides: true);
bloom.Intensity.Override(0.6f); // marca a caixa e põe o valor
bloom.Threshold.Override(0.9f);
  • Volume: IsGlobal, Weight, Priority, BlendDistance, SharedProfile, Profile, HasInstantiatedProfile().
  • VolumeProfile: TryGet<T>, Add<T>, Remove<T>, Has<T>.
  • Cada parâmetro (VolumeComponent) tem Value, OverrideState e Override(valor).
  • Overrides: Exposure, Tonemapping, ColorAdjustments, Bloom, DepthOfField, MotionBlur, ChromaticAberration, LensDistortion, Vignette, ColorCurves (liga e desliga; as chaves das curvas só no Inspector), WhiteBalance, LiftGammaGain, ShadowsMidtonesHighlights, FilmGrain, AmbientOcclusion, Sky, Celestial, PhysicallyBasedSky, IndirectLightingController, Fog e CloudLayer.

Atalho estático sobre o Ambiente da cena (o da janela Iluminação). Cada escrita marca a caixa do parâmetro, como mexer no campo:

RenderSettings.Fog = true;
RenderSettings.FogMode = FogMode.ExponentialSquared;
RenderSettings.FogDensity = 0.03f;
RenderSettings.AmbientIntensity = 0.8f;
var hora = TimeOfDay.Current!.Value; // a primeira Hora do dia da cena
hora.Hour = 18.5f; // vale no quadro seguinte
hora.Speed = 60; // 1 minuto real = 1 hora de jogo
hora.HourChanged(this, h => Scene.Log(ObjectId, $"{h:00}:00"));
hora.Sunset(this, () => Scene.Log(ObjectId, "Anoiteceu"));

Também Sunrise e DayChanged. Os mesmos quatro eventos existem na Conexão de evento.

var malha = Object.GetComponent<MeshRenderer>()!.Value;
malha.Material.SetColor("_BaseColor", new Color(1, 0.2f, 0.1f));
malha.Material.SetFloat("_Smoothness", 0.9f);
malha.SharedMaterial = outroMaterial; // troca o material do primeiro slot

Nomes aceitos: _BaseColor, _Smoothness, _Metallic, _BumpScale, _Cutoff, _OcclusionStrength, _EmissionColor, _BaseMap, _BumpMap, _MetallicGlossMap, _EmissionMap, _OcclusionMap e os do Standard (_Color, _MainTex, _Glossiness). Um nome desconhecido dá erro em vez de sumir.

SceneQuery.FindFirstObjectByType<T>() e SceneQuery.FindObjectsByType<T>(), como na Unity.

Light (Type, Shadows, RenderingLayerMask), Camera (ClearFlags, FieldOfView, Rect, UsePhysicalProperties, AllowHDR, RenderPostProcessing, VolumeLayerMask), MeshRenderer (ShadowCastingMode, LightProbeUsage, ReflectionProbeUsage, LightmapScaleOffset), ReflectionProbe (Mode, Size, Center, BakedTexture, RenderProbe()) e LightProbeGroup (GetProbePosition, SetProbePosition, ProbeCount()).

Validado no POCO F7. Fica na câmera; segurar a ação Mirar fecha o campo de visão e liga a profundidade de campo de um Volume de mira, focada no que está no centro.

using Astra;
using Astra.Components;
using Astra.Rendering;
[ComponentId("g7.mira_com_desfoque")]
public sealed class MiraComDesfoque : Behavior
{
[PropertyId("volume_de_mira")] public ObjectReference VolumeDeMira;
[PropertyId("campo_normal")] public float CampoNormal = 60;
[PropertyId("campo_mirando")] public float CampoMirando = 30;
[PropertyId("velocidade")] public float Velocidade = 6;
private Volume? volume;
private DepthOfField? desfoque;
public override void Start()
{
volume = Volume.Get(Resolve(VolumeDeMira)!);
var perfil = volume!.Profile; // cópia própria, como volume.profile
desfoque = perfil.TryGet<DepthOfField>(out var existente) ? existente : perfil.Add<DepthOfField>(overrides: true);
desfoque!.Mode.Override(DepthOfFieldMode.Bokeh);
volume.Weight = 0;
}
public override void Update(float deltaTime)
{
var mirando = Input.Pressed("Mirar");
var camera = Object.GetComponent<Camera>()!.Value;
volume!.Weight = Mathf.MoveTowards(volume.Weight, mirando ? 1f : 0f, Velocidade * deltaTime);
camera.FieldOfView = Mathf.Lerp(CampoNormal, CampoMirando, volume.Weight);
var pose = Object.WorldTransform;
var frente = System.Numerics.Vector3.Transform(System.Numerics.Vector3.UnitZ, pose.Rotation);
if (mirando && Physics.RayCast(pose.Position, frente * 50) is { } acerto)
desfoque!.FocusDistance.Override(acerto.Distance);
}
}

Outros exemplos completos em Exemplos da API gráfica.

Trocar o shader do override de um único objeto (troque o Material), editar as chaves das Color Curves por script, saber quando a recaptura de uma sonda terminou e Light.lightmapBakeType.