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.
Volume e perfil
Seção intitulada “Volume e perfil”using Astra;using Astra.Rendering;
var volume = Volume.Get(objetoDoVolume)!; // o Volume (componente Ambiente) do objetovolume.Weight = 1; // 0 a 1, como volume.weightvolume.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 valorbloom.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,OverrideStateeOverride(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.
RenderSettings
Seção intitulada “RenderSettings”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;Hora do dia
Seção intitulada “Hora do dia”var hora = TimeOfDay.Current!.Value; // a primeira Hora do dia da cenahora.Hour = 18.5f; // vale no quadro seguintehora.Speed = 60; // 1 minuto real = 1 hora de jogohora.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.
Materiais pelo nome da URP
Seção intitulada “Materiais pelo nome da URP”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 slotNomes 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.
Achar componentes no mundo
Seção intitulada “Achar componentes no mundo”SceneQuery.FindFirstObjectByType<T>() e SceneQuery.FindObjectsByType<T>(), como na Unity.
Outros nomes da Unity
Seção intitulada “Outros nomes da 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()).
Exemplo completo: desfoque ao mirar
Seção intitulada “Exemplo completo: desfoque ao mirar”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.
Ainda não existe
Seção intitulada “Ainda não existe”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.