NodeWorld

Caméras, matériaux et effets

Tout ce qui est sur cette page dessine : ça tourne dans le jeu des joueurs, là où le monde est rendu. Le serveur ne rend rien et refuse ces appels : marque ces scripts [ClientOnly].

Les matériaux

Un Material est un matériau de ton monde : un champ réglé par la scène, ou renderer.sharedMaterial. Le changer change tous les renderers qui l'utilisent.

csharp
using NodeWorld.Flux;

namespace MonMonde
{
    [ClientOnly]
    public class Neon : FluxScript
    {
        public Material neon;

        protected override void Update()
        {
            var pulsation = 0.5f + 0.5f * Mathf.Sin(Time.time * 4f);
            neon.SetColor("_EmissionColor", Color.cyan * (2f * pulsation));
        }
    }
}
Materialcolor (sa couleur principale), SetFloat, SetColor, SetVector, SetTexture, GetFloat, GetColor, GetVector, HasProperty, shader (donne-lui le shader d'un autre matériau de ton monde), renderQueue, shaderKeywords
RenderersharedMaterial, sharedMaterials, SetSharedMaterial(index, material), materialCount, enabled, bounds
Renderer.SetFloat, SetColor, SetVector, SetMatrix, SetTextureUne valeur pour ce renderer seul (un property block) : le matériau partagé ne change pas. Le dernier argument est l'indice du matériau (0 par défaut).
Shader.SetGlobalFloat, SetGlobalVector, SetGlobalColor, SetGlobalTextureUne valeur que tous les shaders de ton monde lisent (une horloge, un vent). Les noms qui commencent par unity_ ou _NW sont ceux de Unity et de NodeWorld : A world cannot set the global shader property '_NWTime' (reserved by Unity or NodeWorld).

Les textures viennent des champs (Texture, Sprite), des images chargées depuis le web, des render textures et des textures de données.

Caméras et render textures

Une caméra de ta scène garde ses réglages, mais le jeu l'éteint : la vue du joueur est celle du jeu. Pour faire le rendu d'autre chose (un miroir, un écran de surveillance, la vue d'un portail), un script crée sa propre caméra et en fait le rendu dans une texture :

csharp
[ClientOnly]
public class CameraSurveillance : FluxScript
{
    public Renderer ecran;
    private Camera _camera;
    private RenderTexture _texture;

    protected override void Start()
    {
        _texture = RenderTexture.Create(512, 512);
        _camera = Camera.Create();
        _camera.targetTexture = _texture;
        _camera.transform.SetPositionAndRotation(transform.position, transform.rotation);
        ecran.SetTexture("_BaseMap", _texture);
    }

    protected override void LateUpdate() => _camera.Render();
}
  • Camera.Create() crée une caméra de ton monde, éteinte : elle ne fait son rendu que quand le script appelle Render(), dans sa targetTexture. L'allumer est refusé (A camera created by a script only renders when the script calls Render.).
  • Ses réglages : cullingMask, clearFlags et backgroundColor, fieldOfView, aspect, nearClipPlane, farClipPlane, worldToCameraMatrix, projectionMatrix, CalculateObliqueMatrix, useOcclusionCulling, et showLocalPlayerHead (la tête du joueur local, cachée à ses propres yeux, apparaît dans un miroir).
  • Camera.main est la caméra du joueur (les yeux en VR) : lis sa pose, stereoEnabled, GetStereoViewMatrix(eye) et GetStereoProjectionMatrix(eye) pour faire une image par œil.
  • RenderTexture.Create(width, height, depthBits, hdr) et Release(). Une render texture va à un renderer (SetTexture) ou à tous les shaders (Shader.SetGlobalTexture).

Le miroir du monde d'exemple est un script de caméra complet.

Les textures de données

DataTexture.Create(width, height) (de 1 à 1024 texels de côté) est une petite texture de nombres à virgule que ton script écrit : SetPixels(rgba) prend largeur × hauteur × 4 valeurs (r, g, b, a), ligne par ligne depuis y = 0. Donne-la à tes shaders avec Shader.SetGlobalTexture : Pulse passe ainsi la musique aux shaders. Release() la libère.

Lumières, particules, animation

ComposantCe qu'un script utilise
Lightenabled, intensity, color, range, spotAngle
ParticleSystemPlay, Stop, Pause, Clear, Emit(count), Simulate, isPlaying, isEmitting, particleCount ; main : startColor, startSize, startSpeed, startLifetime, simulationSpeed, gravityModifier, loop, maxParticles ; emission : enabled, rateOverTime, rateOverTimeMultiplier
AnimatorSetBool, SetFloat, SetInteger, SetTrigger, ResetTrigger, leurs Get…, Play(state, layer, normalizedTime), speed, Rebind, Update(deltaTime), enabled
LineRenderer, TrailRendererpositionCount, SetPosition, GetPosition, SetPositions, useWorldSpace, startWidth, endWidth, startColor, endColor
Volume (post-traitement)weight, enabled
ReflectionProbeintensity, enabled
LODGroupenabled
ParentConstraintsourceCount, GetSourceTransform, GetSourceWeight, SetSourceWeight, enabled

Pour beaucoup d'objets à la fois, vois les lots d'objets et le dessin par instances ; pour les meshes, les meshes faits par les scripts.