The World Publisher and the Avatar Publisher keep the shader variants the game lights with, whatever the project's URP settings: with other settings than the game's, a world's realtime lights lit nothing in the game.
The World Publisher and the Avatar Publisher keep the shader variants of the GPU Resident Drawer, which the game draws static objects with: without them, a world's scenery stayed invisible in the game.
The example world's television no longer jumps the video back several times in a row: the video of the player who started it gives the time, and the others catch up with it at most every 8 seconds.
Play mode works in a new project: the SDK brings the default avatar and the controller tooltips, and imports into the project the XR samples and the TextMesh Pro resources the player needs.
In Play mode, as in the game, your scene's cameras and EventSystems are off: you see through the player's eyes, and the sliders of panels can be dragged.
The Play mode player no longer has a missing script.
In Play mode, Shift+R respawns you, as in the game.
The World Publisher and the Avatar Publisher build for Vulkan, the game's graphics API, whatever the project's settings: a world built with Direct3D showed pink.
The World Publisher compiles a world's scripts once, first, to one WebAssembly module (scripts/client.wasm) for every platform, which players' games and servers run in their interpreter. wamrc, fluxverify and the Linux ARM64 platform are gone, and the SDK is much smaller.
No more creator key: worlds are no longer signed, there is no key to export or keep and no manifest.sig. manifest.json (format 4) still lists every file with its size and SHA-256.
Worlds published with an older SDK must be published again with this one.
Two threads of a world's scripts that reach a class at the same time no longer see its static fields empty: the second waits for the first to set them up.
In Play mode, as in the game, the watchdog counts only your scripts' own code: the editor's work during a call no longer stops them, and a call of a script to the game that takes a second or more is named in the Console.
The SDK is now three packages installed from the NodeWorld registry in Unity's Package Manager, and updated from there: NodeWorld SDK Worlds to make a world, NodeWorld SDK Avatars to make an avatar, both with NodeWorld SDK Base.
NodeWorld SDK Worlds comes with an example world to import, with a portal, a mirror, objects everyone grabs, a television and more, and NodeWorld SDK Avatars with the game's default avatar, ready to publish, and the setup of an avatar step by step.
Scripts reach only the objects of their world: the avatars, portals, photo cameras and voices NodeWorld puts in the world's scene while it runs are no longer found, changed or hit by a raycast.
Scripts can no longer read the keys and the button of the menu (Esc, Tab, P, Shift+R, Y on the left controller), use layer 31, draw a camera on the player's screen or put a screen canvas above the client's: the player can always open the menu, respawn and leave.
FL# scripts compile with nothing to install: the compiler and its tools come with the SDK and run on the .NET runtime of the Unity Editor, on Windows and Linux, and the world config no longer asks for their paths.
Create, NodeWorld, FL# Scripts Folder in the Project window makes the folder of a world's scripts, and Visual Studio and Rider know the FL# API there: completion, the API's documentation and the compiler's errors.
The World Publisher also compiles the world's scripts for Linux ARM64 servers, checks the machine code of all four platforms it builds — Windows, Linux, Linux ARM64 and Quest — right after compiling, and keeps the output folder on your computer instead of in the world's files.
A world without FL# scripts can be published: leave Flux Sharp Sources of its NW World Config empty.
The SDK, the FL# API and its library are under the MIT License, and the SDK lists the software of others it ships with their licenses.
FL# scripts reach the internet with .NET's HttpClient and ClientWebSocket, and load images with Texture.LoadFromUrl and ImageConversion.LoadImage; on players' devices each site goes through the player's choice; Web.LoadString is gone.
FL# scripts run heavy work on several threads with the real System.Threading and System.Threading.Tasks (Thread, the thread pool, Task.Run, Parallel, lock, the concurrent collections); the world API stays on the main thread, and MainThread.Post / await MainThread.Yield() bring work back to it.
New Pulse package: worlds can make their lights and materials react to their music, with a tablet that players hold to tune it.
Every public type and member of the SDK has its description, shown by your code editor and in the SDK reference of docs.nodeworldvr.com.
While a player types in a text field, the menu's or a world's, FL# scripts receive no key, and the VR keyboard types in uGUI input fields as well as TextMeshPro ones.
In Play mode with keyboard and mouse, a click that starts on a screen canvas of your world (Screen Space Overlay) no longer also clicks or picks up what is behind it.
Your worlds are signed with your own creator key, made at your first build outside your projects: the World Publisher shows its fingerprint, exports and imports it, and has an 18+ world box; the signer and signing key paths of the world config are gone, and worlds published with an older SDK must be published again.
FL# scripts make and change meshes at runtime, give them to mesh filters and mesh colliders, and read their data back, without copying their arrays.
Networking.Instantiate spawns copies of an object marked with the new Network Template component for every player of the room, with their scripts, synced state and owner, and Networking.Destroy removes them.
Object batches move, turn, scale, show or hide and color thousands of objects in one go, and instanced meshes draw thousands of copies of a mesh without GameObjects.
A player's script can send a network event to the same script on the server, for example to ask the world's server scripts for a portal.
After each build, the World Publisher tells you which components, event calls and animation events of your world are not allowed: players' games load the world without them.
Pulse: the tablet's controls keep no calls to the old system anymore (its FL# scripts drive them), so building a world with it shows nothing under Content check.