WASM CCK Changelog
TL;DR: This page tracks every CVR Preview.N-WASM.M (and now Release-WASM.M) CCK build released on the closed-testing branch. Each entry shows the developer-posted changelog and the Steam build ID when available. Steam branch keys are redacted; branch names and build IDs are preserved. Entries tagged [verified] or [unposted] are observations from cross-checking the package contents against the developers’ chat posts.
At a glance
Section titled “At a glance”| Version | Build ID | Headline |
|---|---|---|
| Preview.11.WASM.1 | — | First drop. Wasm module auto-downloaded + method-call into WASM via [ExternallyVisible]. |
| Preview.11-WASM.2 | — | Local testing + Play Mode testing fix, menu item to create WasmBehaviour. |
| Preview.11-WASM.3 | — | Interactable ↔ WASM method calls actually work. |
| Preview.11-WASM.4 | 20022802 | Brought in develop changes, fixed WasmScriptingBridge initialization. |
| Preview.11-WASM.5 | 20023329 | OnBecameVisible/Invisible events hooked, LocalPlayer GetPosition/GetRotation. |
| Preview.11-WASM.6 | — | Fixed world builds corrupting lightmap data. Added project descriptor, possible Linux support. |
| Preview.12-WASM.8 | — | CCKWasmProjectDescriptor component ships. Verbose Wasm build toggle. |
| Preview.12-WASM.9 | — | Regenerated binder links. |
| Preview.12-WASM.10 | (NAK 20249206) | LocalPlayer Get/Set properties; source generator fixes. |
| Preview.12-WASM.12 | — | Portal events, bound CustomRenderTexture / Texture2DArray / Texture3D. Reflection-free WasmBehaviour init. |
| Preview.12-WASM.13 | 20599241 | Fixed serialization of List<Object> and List<WasmBehaviour>. |
| Preview.12-WASM.14 | 20599241 | Permissions system introduced. Binding exceptions forwarded into VM. Struct serialization. |
| Preview.12-WASM.15 | — | Editor attributes omitted from WASM module unless UNITY_EDITOR_ATTRIBUTES define is set. |
| Preview.13-WASM.16 | 20913710 | WasmBehaviour with Instantiate/AddComponent/GetComponent. CVR Input API. FileStorage dir creation. |
| Preview.13-WASM.17 | 20940079 | Fix VR inputs + FileStorage nullptr file. |
| Preview.13-WASM.18 | 21097861 | GraphicsBuffer, GeometryUtility, CVRCamera bindings. Content-context scripting defines. |
| Preview.13-WASM.18.1 | — | Newtonsoft.Json assembly conflict fix. |
| Preview.16-WASM.18.1 | — | Fix uploading in Unity 2022 versions. |
| Preview.16-WASM.19 | — | Unity.Mathematics added. Multi-partial serializable types. Reflection-free behaviour. |
| Preview.16-WASM.20 | — | Inheritance chains to WasmBehaviour + Object.Instantiate reflection-free fixes. |
| Preview.16-WASM.20.1 | — | Game events fix. |
| Preview.16-WASM.20.2 | — | All WasmBehaviour events fix. |
| Preview.16-WASM.21 | — | Serialization rework + test framework. UnityEvent serialization on WasmBehaviours. |
| Preview.22-WASM.22 | 22346714 | WorldPermissions API. User-Identity gate on Username/UserId. Handle manager rework. Fuel → epoch interruption. |
| Preview.27-WASM.23 | 22724834 | Prop collision exclude-layer APIs. |
| Preview.27-WASM.24 | 22727107 | WasmUtils API (context queries). Unity-side binding exception logging. |
| Preview.27-WASM.25 | 22791065 | LocalPlayer IgnoreCollision, SetHeadHiddenCamera, Respawn. WorldSettings API. Removed dead FileStorage permission stubs. |
| Preview.27-WASM.26 | 22792582 | LocalPlayer SetPositionAndRotation, SignalDiscontinuity. Networking server-time methods. |
| Preview.27-WASM.27 | 22810120 | Breaking: CVR APIs properties → Get*() methods. CVR.Avatar bindings live. Username freed from User-Identity gate. |
| Release-WASM.28 | — | First Release-tagged WASM CCK. All exceptions wrapped in ScriptException with source file/line, offending line preview, and per-frame call stack. Runtime module bumped 0.0.65 → 0.0.66. |
| Release-WASM.29 | — | Fix: exception handling broke on projects with a lot of code. Runtime module 0.0.66 → 0.0.67. |
| Release-WASM.30 | — | Fix: Unity math types were broken. Runtime module 0.0.67 → 0.0.68. |
| Release-WASM.31 | 23402374 | First surface change since .28. Bound JointSpring, WheelCollider, WheelFrictionCurve, WheelHit, and the RequireComponent attribute. Reworked Unity event rewiring for properties on the target Behaviour. Runtime module 0.0.68 → 0.0.71. |
| Release-WASM.32 | — | CCK base version 4.0.0 → 4.0.1. Serializer overhaul: proper Unity fake-null handling, references now carry a .Value wrapper. New preview-filename generator (PreviewNumber). CVRLineRendererHelper [AddComponentMenu] label fix. Runtime module 0.0.71 → 0.0.72. |
| Release-WASM.33 | — | Hotfix. Serializer’s return on null became continue — lists with a null element were truncating at the null (silent save-data corruption). Build processor pre-serializes every WasmBehaviour once into a dict instead of inline per target. CCK-editor only — runtime module stays at 0.0.72. |
All Preview.27-WASM.2x builds shipped on the feature_wasm Steam branch. Earlier builds preceded the consolidation to this branch. Release-WASM.28 is the first build to drop the Preview.N prefix in its filename — CCK_4.0.0_Release-WASM.28.unitypackage — signalling graduation from preview branding even though the underlying APIs are still under active design.
4.0.0-Preview.11.WASM.1
Section titled “4.0.0-Preview.11.WASM.1”First public-testing drop.
Dev post:
- Added
CVRDataStorecomponent (not bound to anything; modder-only). TimeSinceAFKadded toCVRParameterStream.DisplayGroupDetailPageadded toCVRInteractable.- Pano preview in build panel.
- Portal capture reworked for new depth portal panoramics.
- VRAM usage validation skipped for Worlds.
- Fixed
CVRInteractableconflicting network-id autofix. - Upload procedure tweaks (per-file server-side status, new upload endpoint supporting variable updates / partial uploads).
- Refactored test mode so content is processed before lifetime events.
- Fixed LTCGI adapter error with latest LTCGI.
WASM:
- Fixed testing in Play Mode.
CVRInteractablecan method-call into WASM: invokeTriggerScriptEventon yourWasmBehaviourwith the method name; methods must carry[ExternallyVisible].- WASM module now auto-downloaded and extracted into
%APPDATA%(%LOCALAPPDATA%/ChilloutVR/CVRBuildTools/in later versions).
[verified] Ships with Wasmtime 22.0.0 (Packages/Wasmtime.22.0.0/). Native libs for Windows, Linux, macOS-x64, macOS-arm64.
4.0.0-Preview.11-WASM.2
Section titled “4.0.0-Preview.11-WASM.2”Dev post:
- Fixed not being able to local-test or Play-Mode-test Worlds due to original scenes being unloaded.
- WASM:
MenuItemto createWasmBehaviourfrom basic template.
4.0.0-Preview.11-WASM.3
Section titled “4.0.0-Preview.11-WASM.3”Dev post:
- WASM: updated module so using Interactable actually works.
4.0.0-Preview.11-WASM.4
Section titled “4.0.0-Preview.11-WASM.4”Branch: WASM · Build ID: 20022802.
Dev post:
- Delay
EnvConfigto prevent a crash when switching build target during editor startup. - WASM: Potentially fixed world builds not initializing WASM correctly (local testing + normal uploads).
[verified] Brought WasmScriptingBridge initialization back online (referenced by later events code).
4.0.0-Preview.11-WASM.5
Section titled “4.0.0-Preview.11-WASM.5”Branch: WASM · Build ID: 20023329.
Dev post:
OnBecameVisibleandOnBecameInvisiblehooked up.LocalPlayer.GetPosition()andGetRotation()added.
4.0.0-Preview.11-WASM.6
Section titled “4.0.0-Preview.11-WASM.6”Dev post:
- Fixed world builds corrupting lightmapping data of the target scene.
- WASM: Added project descriptor component. Possible Linux support (untested).
4.0.0-Preview.12-WASM.8
Section titled “4.0.0-Preview.12-WASM.8”Skipping 7 (never shipped publicly per the archive).
Dev post:
- WASM: Fixed
CCKWasmProjectDescriptor— add to content root for debugging toggle, forced script inclusion, project-defines, external project directory override. - More Linux support fixes.
- “Verbose Wasm Build” option added.
4.0.0-Preview.12-WASM.9
Section titled “4.0.0-Preview.12-WASM.9”Dev post:
- WASM: Regenerated links with fixed
WasmBinder. Updated module version.
4.0.0-Preview.12-WASM.10
Section titled “4.0.0-Preview.12-WASM.10”Branch: NAK (temporary) · Build ID: 20249206.
Dev post:
LocalPlayer.Get/SetVelocityadded.LocalPlayer.Get/Setproperties (position, rotation, velocity).- Serializer source-generator fixes:
- Namespaced
WasmBehaviours now work. - Instance auto-properties no longer confuse the serializer.
- Fixed AssetBundle build failure caused by “unserializable types” in the generated shadow class.
- Namespaced
[context] This temporarily shipped on a NAK branch because the WASM branch build config had regressed.
4.0.0-Preview.12-WASM.12
Section titled “4.0.0-Preview.12-WASM.12”Skipping 11.
Dev post:
OnPortalCreated(Portal portal)andOnPortalDestroyed(Portal portal)events.- Bound
CustomRenderTexture,Texture2DArray,Texture3D. - Reworked WasmBehaviour initialization, deserialization, and method calling — no longer requires reflection on the module side.
- Added
Enable Reflectiontoggle on the project descriptor for escape hatch.
4.0.0-Preview.12-WASM.13
Section titled “4.0.0-Preview.12-WASM.13”Branch: WASM · Build ID: 20599241.
Dev post:
- Fixed serialization of
List<Object>andList<WasmBehaviour>.
4.0.0-Preview.12-WASM.14
Section titled “4.0.0-Preview.12-WASM.14”Branch: WASM · Build ID: 20599241 (reused).
Dev post:
- Permissions system introduced. Some existing behaviour broke intentionally (e.g.
Instantiateon props/avatars); most was unintentional because default permissions weren’t appropriate for every binding yet. - Exceptions thrown from bindings no longer kill the VM — they’re forwarded into the guest and thrown there.
- Struct serialization added (was overlooked).
- Fixed
[SerializeField]attribute not working properly.
4.0.0-Preview.12-WASM.15
Section titled “4.0.0-Preview.12-WASM.15”Dev post:
- Fixed serialization of
sbytefailing. - Unity Editor-only attributes (
ColorUsage,HideInInspector,Property,Space,Tooltip,Header) are no longer included in the built WASM module — gated behindUNITY_EDITOR_ATTRIBUTESdefine for opt-in.
4.0.0-Preview.13-WASM.16
Section titled “4.0.0-Preview.13-WASM.16”Branch: WASM · Build ID: 20913710.
Dev post:
WasmBehaviourhandling withInstantiate,AddComponent,GetComponent.- Fixed
GetComponentnot returning an object whose actual type matched the retrieved component. CVRInputAPI added. WASM has its own input module; world and self-avatar scripts can set inputs.- Fixed
FileStoragenot creating its working directories.
4.0.0-Preview.13-WASM.17
Section titled “4.0.0-Preview.13-WASM.17”Branch: WASM · Build ID: 20940079.
Dev post:
- Fixed VR inputs not working with the WASM input module.
- Fixed
FileStoragereturning a file with a null pointer.
4.0.0-Preview.13-WASM.18
Section titled “4.0.0-Preview.13-WASM.18”Branch: WASM · Build ID: 21097861.
Dev post:
- Fixed
GraphicsBufferbindings (needed for compute shaders). - Added
GeometryUtilitybindings. - Added
CVRCamerabindings. - Added defines for running Avatar / Prop / World contexts (
CVR_SCRIPTING_CONTEXT_{AVATAR,PROP,WORLD}).
4.0.0-Preview.13-WASM.18.1
Section titled “4.0.0-Preview.13-WASM.18.1”Dev post:
- Fixed
Newtonsoft.Jsonassembly bundled in CCK conflicting with otherNewtonsoft.Jsonassemblies.
4.0.0-Preview.16-WASM.18.1
Section titled “4.0.0-Preview.16-WASM.18.1”Dev post:
- Fixed uploading in Unity 2022 versions.
4.0.0-Preview.16-WASM.19
Section titled “4.0.0-Preview.16-WASM.19”Dev post:
Unity.Mathematicsadded to the WASM module.- Fixed serializable types with multiple partial definitions breaking the module.
- Fixed the “reflection must be enabled” requirement for several runtime paths.
4.0.0-Preview.16-WASM.20
Section titled “4.0.0-Preview.16-WASM.20”Dev post:
- Fixed behaviours that don’t directly inherit
WasmBehaviournot working. - Fixed
Object.Instantiatenot having the no-reflection fixes.
4.0.0-Preview.16-WASM.20.1
Section titled “4.0.0-Preview.16-WASM.20.1”Dev post:
- Fixed game events not working.
4.0.0-Preview.16-WASM.20.2
Section titled “4.0.0-Preview.16-WASM.20.2”Dev post:
- Fixed all
WasmBehaviourevents not working.
4.0.0-Preview.16-WASM.21
Section titled “4.0.0-Preview.16-WASM.21”Dev post:
- Reworked serialization. Test framework in place to catch regressions.
UnityEventserialization onWasmBehaviours — usable only inside your own code, intended for drag-and-drop prefabs that non-WASM users can hook up.- Fixed
GetComponentmethods without the no-reflection fix.
4.0.0-Preview.22-WASM.22
Section titled “4.0.0-Preview.22-WASM.22”Branch: WASM · Build ID: 22346714.
Dev post:
- Added
ISerializableCallbackReceiver(OnBeforeSerialize / OnAfterDeserialize) events. WorldPermissionsAPI added. Query current permissions, request changes once per session.OnWorldPermissionsChangedWasmBehaviour event.UserIdandUsernamegated behind User Identity permission.- File Storage gated behind File Storage / Read Raw Files / File Storage Limit permissions.
- World file-storage path moved to
AppData\Local\ChilloutVR\WorldData\[guid]\LocalStorage. - Network players now handled by DarkRift client ID instead of player GUID hash.
- World Permissions UI added (World Details menu → Permissions). Worlds can prompt once per session via
WorldPermissions.RequestPermissions(...). - Handle management for WASM access manager rebuilt.
- VM limiting switched from Wasmtime fuel → epoch interruption (better performance).
- Serialization refactor to simplify implementation and remove magic numbers.
4.0.0-Preview.27-WASM.23
Section titled “4.0.0-Preview.27-WASM.23”Branch: feature_wasm · Build ID: 22724834.
Dev post:
- Three new Prop APIs exposed (for World use):
SetCollisionExcludeLayers(LayerMask mask)GetCollisionExcludeLayers()ResetCollisionExcludeLayers()- (Also built for Avatars, but not yet bound properly.)
4.0.0-Preview.27-WASM.24
Section titled “4.0.0-Preview.27-WASM.24”Branch: feature_wasm · Build ID: 22727107.
Dev post:
WasmUtilsAPI:CVRScriptObjectContext GetObjectContext()CVRScriptScopeContext GetScopeContext(UnityEngine.Object unityObject)CVRScriptOwnerContext GetOwnerContext()
- Unity-side logging when an exception is thrown in a bound binding — reports the binding class so you don’t need to wrap every guest call in try/catch.
4.0.0-Preview.27-WASM.25
Section titled “4.0.0-Preview.27-WASM.25”Branch: feature_wasm · Build ID: 22791065.
Dev post:
- Added to LocalPlayer (World-only):
IgnoreCollision(Collider collider, bool ignore)— wrapsPhysics.IgnoreCollisionagainst all player colliders.SetHeadHiddenCamera(Camera camera, bool hideHead)— the head-hiding system will hide the local player’s head when the passed camera’sOnPreCullfires.Respawn().
- New WorldSettings API (World-only):
SetPropVisibility(bool),SetPlayerVisibility(bool)(same effect asCVRWorld.SetPlayerPropVisibilityandSetPlayerRemotePlayerVisibility). - Removed dead
CanUseFileStorageandRequestUseFileStoragestubs fromFileStorage.
[verified] The current CCK shim (CVR.CCK.Wasm/Scripting/Links/APIs/CCKStubs/FileStorageCCK.cs) carries no CanUseFileStorage / RequestUseFileStorage helpers. Call WorldPermissions.Request(new WorldPermissions { FileStorageApiAllowed = true, ... }) and gate on WorldPermissions.CurrentPermissions.FileStorageApiAllowed in OnWorldPermissionsChanged.
4.0.0-Preview.27-WASM.26
Section titled “4.0.0-Preview.27-WASM.26”Branch: feature_wasm · Build ID: 22792582.
Dev post:
- Added to LocalPlayer (World-only):
SetPositionAndRotation(Vector3 position, Quaternion rotation, bool updateGround = false)— more efficient and predictable than back-to-backSetPosition/SetRotation. SetupdateGround = trueto recalculate ground/platform attachment.SignalDiscontinuity()— call after moving the player. Dynamics on the avatar and remote-player interpolation skip the in-between movement, producing a seamless “snap” for local and remote viewers.
- Added to Networking:
long GetServerStartTime()— Unix timestamp (ms) when the server started.long GetServerUptime()— server uptime (ms).
4.0.0-Preview.27-WASM.27
Section titled “4.0.0-Preview.27-WASM.27”Branch: feature_wasm · Build ID: 22810120.
“This build contains a bunch of breaking changes to existing APIs. As mentioned before, because we are still in the initial design & development phase, these sort of changes will occur quite often and usually require a recompile and touchup when APIs change.”
Breaking — properties → Get*() methods. Reason stated by the team: make marshalling cost obvious; the convention applies to CVR-provided APIs only, not UnityEngine/library ones. A further refactor is under discussion: postfixing all CVR APIs with Api (e.g. PlayerApi, AvatarApi, PropApi, PortalApi, CloneApi) to avoid naming conflicts with UnityEngine.Avatar and the CVRAvatar component.
Prop refactor:
| Old | New |
|---|---|
Spawner property | GetSpawner() |
RootObject property | GetRootObject() |
RootTransform property | GetRootTransform() |
Name property | GetName() |
ContentId property | GetContentId() |
Player refactor:
| Old | New |
|---|---|
UserId | GetUserId() |
Username | GetUsername() |
NetworkId | GetNetworkId() |
GameObject | GetGameObject() |
VoicePoint | GetVoicePoint() |
ViewPoint | GetViewPoint() |
Avatar refactor:
| Old | New |
|---|---|
Wearer | GetWearer() |
RootObject | GetRootObject() |
RootTransform | GetRootTransform() |
Name | GetName() |
ContentId | GetContentId() |
Also added on Avatar: SetCollisionExcludeLayers(LayerMask), GetCollisionExcludeLayers(), ResetCollisionExcludeLayers().
Other changes:
CVR.AvatarAPI and bindings now hooked up. Example:Avatar localAvatar = LocalPlayer.PlayerObject.GetWornAvatar();.- Fixed lifetime checks not functioning properly since the access-manager handle rework.
- Removed
Usernamefrom User Identity world-permission gate —GetUsername()no longer requiresAccessUserIdentity.GetUserId()still does. - Fixed Avatar / Prop / Player bindings not being wrapped in exception interop.
- Tweaked error logging on binding exceptions to report the binding class.
4.0.0-Release-WASM.28
Section titled “4.0.0-Release-WASM.28”First build released as CCK_4.0.0_Release-WASM.28.unitypackage (no Preview.N prefix). Branch and Build ID were not posted in the announcement.
Dev post:
-
Exceptions now possibly make sense.
-
All exceptions are now wrapped in a
ScriptExceptionwhich provides a betterToString. Output now includes the source file path, line number, the offending source line, and a per-frame call stack:KeyNotFoundException: Given key was not present in the dictionaryat Namespace.Script.DoUpdate (C:/Projects/Game/Assets/Script.cs:45)'int value = dict[key];'at Namespace.Script.Update (C:/Projects/Game/Assets/Script.cs:23)'DoUpdate();'
[verified] Diffing CCK_4.0.0_Preview.27-WASM.27.unitypackage against CCK_4.0.0_Release-WASM.28.unitypackage:
-
The only meaningful CCK source change is in
Assets/CVR.CCK.Wasm/CCK/Editor/WasmBuildUtility.cs:private const string CCKWasmModuleVersion = "0.0.65";private const string CCKWasmModuleVersion = "0.0.66";The CCK is just pinning the new runtime module version. The exception-wrapping logic itself lives in the auto-downloaded WASM module (
%LOCALAPPDATA%/ChilloutVR/CVRBuildTools/), not in the CCK package — so there is noScriptException.csin the package source to look at. -
All other content-hash differences (~194
*Links.csfiles plusRegisterLinks.TMPro.cs) are binder regeneration artifacts. Line-by-line they’re identical to WASM.27; only file metadata moved. -
No files were added or removed between WASM.27 and WASM.28 — file count holds at 1135 entries on both sides.
[unposted] The package nomenclature changed from CCK_4.0.0_Preview.27-WASM.27.unitypackage to CCK_4.0.0_Release-WASM.28.unitypackage. The dev announcement did not call this out, but it’s the first build in the archive without a Preview.N prefix.
4.0.0-Release-WASM.29
Section titled “4.0.0-Release-WASM.29”Posted 2026-12-05 by Exterrata. No branch or Build ID given.
Dev post:
- Fixed the exceptions stuff breaking when your project has too much code.
This is a follow-up fix to the ScriptException work shipped in WASM.28 — large guest modules tripped up the new exception wrapper.
[verified] Diffing CCK_4.0.0_Release-WASM.28.unitypackage against CCK_4.0.0_Release-WASM.29.unitypackage:
-
The only changed file is
Assets/CVR.CCK.Wasm/CCK/Editor/WasmBuildUtility.cs:private const string CCKWasmModuleVersion = "0.0.66";private const string CCKWasmModuleVersion = "0.0.67"; -
Zero
*Links.csregeneration this time — the binder surface is byte-for-byte identical to WASM.28 (e.g.AnimatorLinks.cshash is unchanged). 0 files added, 0 removed; 1135 entries on both sides. The fix lives entirely in the runtime module0.0.67, which the CCK pins.
4.0.0-Release-WASM.30
Section titled “4.0.0-Release-WASM.30”Posted 2026-12-05 by Exterrata (≈3 hours after WASM.29). No branch or Build ID given.
Dev post:
- Fixed a lot of issues with Unity math types being broken.
Targets the Unity.Mathematics types (float3, quaternion, etc.) added to the module back in Preview.16-WASM.19 — marshalling between guest and host had regressions.
[verified] Diffing CCK_4.0.0_Release-WASM.29.unitypackage against CCK_4.0.0_Release-WASM.30.unitypackage:
-
Identical shape to the .28 → .29 step. Only
WasmBuildUtility.cschanges:private const string CCKWasmModuleVersion = "0.0.67";private const string CCKWasmModuleVersion = "0.0.68"; -
Zero binder regen, 0 files added/removed, 1135 entries. Fix is in runtime module
0.0.68.
[observed] WASM.28, .29, and .30 are all pure runtime-module bumps (0.0.66 → 0.0.67 → 0.0.68). The CCK package source is functionally inert across the three except for the one-line version pin — which means the Bindings Surface snapshot tagged for WASM.28 remains accurate for .29 and .30. WASM.31 (below) is the first build since .28 to actually change the bound surface.
4.0.0-Release-WASM.31
Section titled “4.0.0-Release-WASM.31”Branch: feature_wasm · Build ID: 23402374. Posted by NotAKid.
Dev post:
- Bound the following types:
UnityEngine.JointSpringUnityEngine.WheelFrictionCurveUnityEngine.WheelCollider
- Bound the
UnityEngine.RequireComponentattribute. - Reworked Unity event rewiring to correctly handle cases where the target property exists on the target
Behaviouritself. This really only mattered for targetingenabled; several unsupported events will now no-op instead of rewiring into a broken state.
[verified] Diffing CCK_4.0.0_Release-WASM.30.unitypackage against CCK_4.0.0_Release-WASM.31.unitypackage:
- 3 files added:
Scripting/Links/WasmBinder/UnityEngine/JointSpringLinks.cs(auto-generated; registered viaJointSpringLink.BindFunctionsinRegisterLinks.UnityEngine.cs).Scripting/Links/WasmBinderManual/UnityEngine/WheelColliderLinksManual.cs(hand-written — also whereWheelFrictionCurveis bound, which is why there’s no separateWheelFrictionCurvefile).Scripting/Links/WasmBinderManual/UnityEngine/WheelHitLinksManual.cs(hand-written — the structWheelCollider.GetGroundHitreturns; not named in the dev post but shipped alongside).
- So the bound surface gains 4 types (
JointSpring,WheelCollider,WheelFrictionCurve,WheelHit), not 3 — see Bindings Surface, now 285 → 289. - Meaningful source changes beyond the regen:
WasmBuildProcessor.cs(the event-rewiring rework),BindingManager.cs+TypeMap.cs+WasmAccessManager.cs(registration/access for the new types and theRequireComponentattribute),RegisterLinks.UnityEngine.cs/RegisterLinks.CVR.cs, and a new CCK componentCVRWheelController.cs(CVR.CCK/Scripts/Components/) that consumesWheelFrictionCurve. - 126
*Links.csregenerated — type IDs shift when new types are inserted, so the binder re-emits. 0 files removed; entries 1135 → 1138. - Runtime module pinned
0.0.68→0.0.71(skipped0.0.69/0.0.70, internal iterations).
[observed] WheelCollider and WheelHit are bound as manual shims (*LinksManual.cs), like Debug / GameObject / GraphicsBuffer / Object — the source generator can’t auto-bind them (WheelCollider has overloaded/out-param methods such as GetGroundHit(out WheelHit)). RequireComponent is an attribute, not a callable type, so it doesn’t appear in the type list but is now recognised by the build’s component-requirement validation.
4.0.0-Release-WASM.32
Section titled “4.0.0-Release-WASM.32”No Build ID posted in the announcement. Dev post not retained verbatim — reconstructed from the package diff against WASM.31.
Observed changes (full list from diffing CCK_4.0.0_Release-WASM.31.unitypackage against CCK_4.0.0_Release-WASM.32.unitypackage):
-
CCK base version
4.0.0→4.0.1. InAssets/CVR.CCK/Scripts/CVRCommon.cs:public const string BaseVersion = "4.0.0";public const string ReleaseType = ReleaseTypes.Release /*+ ".26"*/;public const string BaseVersion = "4.0.1";public const string ReleaseType = ReleaseTypes.Release;public const int PreviewNumber = 1;The old static property
CCK_UNITYPACKAGE_NAMEwas replaced with aGetUnityPackageName(bool isWasm = false)method that adds a_WASMsuffix when called from the WASM tooling and a.<PreviewNumber>suffix forPreviewrelease types. So the next preview-tagged build could ship asCCK_WASM_4.0.1_Preview.1.unitypackageinstead of the historicalCCK_4.0.0_Preview.N-WASM.M.unitypackageshape. The currentReleasebuilds keep theCCK_4.0.0_Release-WASM.<n>.unitypackagefilename becauseReleaseType == Releasetakes the no-preview-number branch. -
WasmSerializerrewritten for Unity null-equality semantics. Object-typed fields now go through:bool isNull = obj is UnityEngine.Object unityObj ? unityObj == null : obj == null;data.AddRange(BitConverter.GetBytes(isNull));if (isNull) return;(Note the
returnhere — WASM.33 below changes it tocontinue.) The previous implementation cast directly toUnityEngine.Objectand usedobj == null, which silently passed Unity’s destroyed-but-not-null sentinel through serialization. -
WasmSerializedObjectrestructured (~40 line diffs). References are now wrapped — see the build processor change below for evidence. -
WasmBuildProcessor.csreference rewiring. TheserializedObject.references[i]array now exposes wrapped entries with a.Valueproperty; the rewrite code goes:Object reference = serializedObject.references[i];if (reference is WasmBehaviour && replacementMap.TryGetValue(reference.GetInstanceID(), out (Type, WasmRuntimeBehaviour) runtimeBehaviour))serializedObject.references[i] = runtimeBehaviour.Item2;object reference = serializedObject.references[i].Value;if (reference is WasmBehaviour b && replacementMap.TryGetValue(b.GetInstanceID(), out (Type, WasmRuntimeBehaviour) runtimeBehaviour))serializedObject.references[i].Value = runtimeBehaviour.Item2;The cast widens to
object, the instance ID is read off the resolvedWasmBehaviour b, and the assignment goes through.Value. Reads of the field by a downstream consumer (the runtime that loads the serialized object) need the same.Valueindirection. -
CVRLineRendererHelpermenu-label fix:[AddComponentMenu("ChilloutVR/CVR Leg")][AddComponentMenu("ChilloutVR/CVR Line Renderer Helper")]A copy-paste-from-
CVRLegtypo from an earlier release. -
WasmSourceGenerator.dllupdated (binary; can’t textual-diff). Likely tracks the new.Valuewrapper and the serializer changes. -
Hash-differs-but-line-identical (regen noise):
RegisterLinks.UnityEngine.cs,RegisterLinks.CVR.cs,TypeMap.cs,WheelColliderLinksManual.cs,WheelHitLinksManual.cs,CVRParameterStream.cs,CCK_CVRParameterStreamEditorEntries.cs. No code change. -
Runtime module pinned
0.0.71→0.0.72(single increment this time). -
127
*Links.csregenerated. 0 files added, 0 removed; entries hold at 1138.
[observed] The binding surface is unchanged from WASM.31 — no *Links.cs added or removed. The Bindings Surface page tagged for WASM.31 (289 types) is still accurate.
4.0.0-Release-WASM.33
Section titled “4.0.0-Release-WASM.33”Hotfix on top of WASM.32. No Build ID posted; dev post not retained verbatim.
Observed changes (2 files, line-identical diff):
-
WasmSerializer.cs—return→continuebug fix. WASM.32’s null-handling usedreturninside the per-element loop bodies of array/list serialization paths:if (isNull) return;if (element == null) return;if (isNull) continue;if (element == null) continue;With
return, the first null element in a list aborted the entire serialization — every subsequent element silently never got written. Any save data with a null inside an array would be truncated at the null.continueskips just that element. This is the single most user-visible change of .32/.33 — anyone whose save data appeared to be losing entries after upgrading to .32 had this bug. -
WasmBuildProcessor.cs— pre-serialize all behaviours once, then look up. Was:// Pass eventContext to serializerdst.serializationData = WasmSerializer.SerializeBehaviour(src as IWasmSerialized, eventContext);inline at each target. Now:
Dictionary<int, WasmSerializedObject> serializedData = new();foreach (WasmBehaviour behaviour in GetAllComponents<WasmBehaviour>())serializedData[behaviour.GetInstanceID()] = WasmSerializer.SerializeBehaviour(behaviour as IWasmSerialized, eventContext);...dst.serializationData = serializedData[src.GetInstanceID()];Each behaviour is serialized exactly once and reused. Removes redundant work and any chance of inconsistency between targets if serializer state was non-deterministic.
[verified] Runtime module pin stays at 0.0.72 — WasmBuildUtility.cs is untouched. WASM.33 is purely a CCK-editor patch; no new runtime build needed to consume the fixes.
[observed] Binding surface unchanged from WASM.31/.32. Bindings Surface page snapshot remains accurate.
Unposted structural changes (observed)
Section titled “Unposted structural changes (observed)”Diffing CCK_4.0.0_Preview.11.WASM.unitypackage vs CCK_4.0.0_Release-WASM.28.unitypackage surfaces reorganisations the per-build posts didn’t call out. File counts: Preview.11 ships 1069 entries, Release-WASM.28 ships 1135. Net +138 added and −72 removed outside the auto-generated WasmBinder/*Links.cs set.
Native runtime
Section titled “Native runtime”- Wasmtime upgraded 22.0.0 → 34.0.2 at some point between Preview.12 and Preview.27. Along with the upgrade, the native-library path shape changed:
Packages/Wasmtime.X.X.X/runtimes/<platform>/native/<lib>(Preview.11) →Packages/Wasmtime.X.X.X/runtimes/<platform>/<lib>(thenative/segment was dropped). - Native targets reshuffled. Preview.11 shipped four desktop targets (
linux-x64,osx-x64,osx-arm64,win-x64). Release-WASM.28 ships onlywin-x64plus a brand-newandroid-aarch64target — Linux and both macOS desktop libraries were dropped during the upgrade. System.Runtime.CompilerServices.Unsafe6.1.2 is shipped as a sibling package underPackages/.
Editor reorg
Section titled “Editor reorg”- Editor scripts relocated:
Assets/CVR.CCK.Wasm/Editor/→Assets/CVR.CCK.Wasm/CCK/Editor/.WasmBuildProcessor.csandWasmBuildUtility.csboth moved. CCKWasmProjectDescriptorsplit into runtime + editor: the component itself now lives atCCK/CCKWasmProjectDescriptor.cs(runtime type, can be attached to scene objects), and its inspector lives atCCK/Editor/CCKWasmProjectDescriptorEditor.cs.- New in
CCK/Editor/Templates/:WasmBehaviorTemplate.cs.template— the file behindAssets > Create > CVR Wasm Behavior (C#). - New in
CCK/Editor/:SkipValidation.cs,WasmMenuItems.CreateWasmBehavior.cs.
Scripting layer
Section titled “Scripting layer”Scripting/Unsafe/folder removed entirely. Its contents either moved or were obsoleted:Unsafe/WasmBehaviour.cs→Scripting/WasmBehaviour.cs(one folder up).Unsafe/ExternallyVisibleAttribute.cs→Scripting/Attributes/ExternallyVisibleAttribute.cs. Despite being present from the start, the author-facing doc didn’t highlight it until Preview.27-WASM.24.Unsafe/SerializerShadowClass.cs,SerializationHelpers.cs,WasmSerializationData.csdeleted — replaced by the Roslyn source generator (see below).Unsafe/WasmScripting.Unsafe.asmdefretired; the active asmdef is nowScripting/Links/UnsafeUtils/WasmScripting.UnsafeUtils.asmdef.
WasmSourceGenerator.dllships underScripting/— a Roslyn source generator that emits the companionpartialfor eachWasmBehavioursubclass, plugged into serialization. Preview.11 had a similarly namedWasmSourceGenerators.dll(plural) which was retired in favour of the singular file.WasmVMsplit into a true partial:WasmVMEvents.cs→WasmVM.Events.cs. The events half is where all thescripting_call_*export lookups and dispatch methods live.- New supporting types under
Scripting/:IWasmSerialized.cs,WasmBehaviourInfo.cs,WasmSerializedObject.cs,EventDispatch.cs, andUnityEventSerializationContext.cs(backs theUnityEventserialization shipped in Preview.16-WASM.21). EventForwarder/*classes (OnAnimatorIKForwarder,OnRenderImageForwarder,OnAudioFilterReadForwarder,OnCollisionStayForwarder,OnTriggerStayForwarder, etc.) added underScripting/EventForwarder/to bridge Unity events that need specific dispatch shapes.
Linking and bindings
Section titled “Linking and bindings”- Bindings subfolder introduced:
Scripting/Links/APIs/*Bindings.cs→Scripting/Links/APIs/Bindings/*Bindings.cs. Many new bindings landed alongside the move:AvatarBindings,AvatarPointBindings,FileStorageBindings,LocalPlayerBindings,NetworkingBindings,PermissionsBindings,PlayerBindings,PortalBindings,PropBindings,UtilBindings,WasmUtilsBindings,WorldBindings,WorldSettingsBindings. The relocation likely happened during the Preview.16 → Preview.22 consolidation. - CCKStubs relocated:
Scripting/Links/CCKStubs/→Scripting/Links/APIs/CCKStubs/, matching the Bindings relocation. New stubs added on the way:AvatarCCK,CVRCameraCCK,CVRInputCCK,NetworkingCCK,PortalCCK,PropCCK,ProxyExtensions,WasmUtilsCCK,WorldCCK,WorldPermissionsCCK,WorldSettingsCCK. The original four (AvatarPointCCK,FileStorageCCK,LocalPlayerCCK,PlayerCCK) carried across. WasmBinderManual/folder added alongsideWasmBinder/. Hand-written binder shims for things that can’t be auto-generated live here:DebugLinksManual.cs,GameObjectLinksManual.cs,GraphicsBufferLinksManual.cs,ObjectLinksManual.cs. The auto-generated*Links.csfiles inWasmBinder/are companion partials.UnsafeUtilsadded:Scripting/Links/UnsafeUtils/(Span ↔ NativeArray helpers for binder code) with its own asmdef.- New runtime helpers under
Scripting/Links/:WasmStubs.cs(replaces the now-removedWasiStubs.cs),WasmBindingUtils.cs,WasmInstantiationHelper.cs(backs the no-reflectionObject.Instantiatepath from Preview.16-WASM.20),WasmAccessDeniedException.cs,WasmAccessManager.HandleManagement.cs(the access-manager handle rework from Preview.22-WASM.22), andCVRScriptContext.cs. Scripting/Links/APIs/gained:BufferReaderWriter.cs,CVRScriptContextEnums.cs,FileStorageManager.cs,WasmNetworkManager.cs,WorldPermissionsManager.cs. The three-axis permission/context model (CVRScriptObjectContext,CVRScriptScopeContext,CVRScriptOwnerContext) lives inCVRScriptContextEnums.cs.
CCK side (outside CVR.CCK.Wasm/)
Section titled “CCK side (outside CVR.CCK.Wasm/)”- Newtonsoft.Json renamed:
Scripts/Dependencies/Newtonsoft.Json/Abi.Newtonsoft.Json.dll→CVR.Newtonsoft.Json.dll. This is the underlying fix the Preview.13-WASM.18.1 announcement referenced. - New rendering primitives:
Scripts/Components/Abstract/CVRRenderComponent.cs,Scripts/Components/CVRMaterialDataProvider.cs,Scripts/Components/CVRRenderController.cs, plus inspector editors underScripts/Editor/GUI/Components/CCK_CVRMaterialDataProvider/andCCK_CVRRenderController/. - New validation steps:
Scripts/Editor/Validation/Steps/AudioImportSettingsStep.cs,BrokenMonoBehavioursStep.cs,ParticlePrewarmStep.cs, andRootSteps/ProjectSetupStep.cs. - New editor utilities:
Scripts/Editor/Hacks/AudioValidationUtils.cs,SceneHierarchyExpansionHack.cs. - Old CCK Lua stubs removed: the entire
Scripts/Editor/Scripting/LuaStubs/Common/library/folder (CVR_CCK.lua,CVR.lua,CVR_Network.lua,FinalIK.lua,RCC.lua,System.lua,TextMeshPro.lua,UnityEngine_AI.lua,UnityEngine_UI.lua,UnityEngine.lua, plus the_CVRGlobals.lua,_CVRSpecial.lua,_globals.luaautocompletion roots) is gone. The Lua scripting reference stubs are no longer shipped inside the CCK package. - Removed:
Scripts/Editor/GUI/Components/CCK_CVRBlitter/CCK_CVRBlitterEditorEntries.cs— folded into the main blitter editor. - New shader include:
Assets/Shaders/CVRGlobals.cginc— global CVR shader macros for content shaders.
Preview.27-WASM.27 → Release-WASM.28 specifically
Section titled “Preview.27-WASM.27 → Release-WASM.28 specifically”Zero structural changes. The whole-package diff is:
- One real source change:
WasmBuildUtility.csbumpsCCKWasmModuleVersionfrom0.0.65to0.0.66. - 195 binder files show hash differences but line-identical content (regen artefacts).
- 0 files added, 0 files removed; 1135 entries on both sides.
- Dev post sections quote the developer announcements from CVR’s closed-testing channel, preserved as the builds shipped. There is no upstream official changelog file for the WASM CCK; these posts are the only linear record.
- [verified], [unposted], and [correction] tags mark observations that don’t come from the dev posts but from inspecting the shipped builds and the current decompile. Where the post and the shipped bits disagree, the bits win and the disagreement is called out.
- Steam branch keys are intentionally omitted. Branch names (
WASM,NAK,feature_wasm) and Build IDs are preserved.
Related
Section titled “Related”- API Conventions — the current state the refactors converged on.
- Architecture — what the runtime looks like today.
- Validator — interactive check against the current surface snapshot.