This page lists changes in Unity 6.4 (6000.4) that can affect existing projects when you upgrade them from Unity 6.3 (6000.3) to Unity 6.4 (6000.4).
Review changes for Unity 6.4 in these areas:
This section outlines recent updates to assets and media that can affect your upgrade experience.
In the Asset Database, artifact dependencies now only trigger a reimport of dependent assets when the dependency’s import result (artifact) actually changes, rather than whenever its source input changes. This change significantly reduces unnecessary reimports.
Previously, any reimport of a dependency triggered reimports of all dependent assets, even if the import produced an identical result. With the new narrower artifact dependency, some ScriptedImporter or AssetPostprocessor classes might no longer run because they previously relied on reimports that are no longer triggered.
For more information on this change, refer to the Narrowing Artifact Dependencies in Unity 6.4 Discussions post.
If changes to an asset don’t propagate through your project as expected, but manually reimporting fixes the issue, you might need to add explicit dependencies. To resolve missing dependencies, use the following APIs:
If your importer uses both the imported result and the source file of another asset, you must register both dependencies. Registering only an artifact dependency is no longer enough.
For example, the following script loads an imported asset and also reads its source file directly, so it must register both an artifact dependency and a source asset dependency:
[ExampleScriptedImporter(1, "example")]
public class ExampleScriptedImporter : ScriptedImporter
{
public string otherAssetPath; // Path to another asset used during the import
public override void OnImportAsset(AssetImportContext ctx)
{
ctx.DependsOnArtifact(otherAssetPath);
var myObj = AssetDatabase.LoadAssetAtPath<MyScriptableObject>(otherAssetPath);
var sourceData = File.ReadAllLines(otherAssetPath);
// Generate output based on myObj and sourceData
// ...
// Fix missing dependency
ctx.DependsOnSourceAsset(otherAssetPath);
}
}
When you have a chain of asset dependencies and your post-processor uses an artifact from earlier in the chain, you must declare a direct dependencyA direct dependency occurs when your project “requests” a specific package version. To create a direct dependency, you add that package and version to the dependencies property in your project manifest (expressed in the form package_name@package_version). More info
See in Glossary on that asset.
For example, if you have:
Model.fbxVariant.prefab (variant of Model.fbx)Nest.prefab (prefab nesting Variant.prefab)If an AssetPostprocessor for Nest.prefab accesses meshThe main graphics primitive of Unity. Meshes make up a large part of your 3D worlds. Unity supports triangulated or Quadrangulated polygon meshes. Nurbs, Nurms, Subdiv surfaces must be converted to polygons. More info
See in Glossary data from Model.fbx, it must register an artifact dependency on Model.fbx. Previously, changes to the mesh triggered a reimport of Nest.prefab through the chain of dependencies. Now, if the change doesn’t affect the output of Variant.prefab (such as moving a vertex in a mesh), Nest.prefab won’t be reimported unless you explicitly declare the dependency.
The following script accesses mesh data from a model nested within a prefabAn asset type that allows you to store a GameObject complete with components and properties. The prefab acts as a template from which you can create new object instances in the scene. More info
See in Glossary variant, so it must register a direct artifact dependency on the asset containing the mesh:
public class Example : AssetPostprocessor
{
void OnPostprocessPrefab(GameObject g)
{
// Post-processor for prefab nesting variant
// Mesh from a model
var mesh = g.GetComponent<MeshFilter>().sharedMesh;
// Import result changed using mesh
// ...
// Fix missing dependency
var meshPath = AssetDatabase.GetAssetPath(mesh);
var meshGUID = AssetDatabase.GUIDFromAssetPath(meshPath);
context.DependsOnArtifact(meshGUID);
}
}
Unity now correctly invokes OnDisable callbacks on components of a GameObjectThe fundamental object in Unity scenes, which can represent characters, props, scenery, cameras, waypoints, and more. A GameObject’s functionality is defined by the Components attached to it. More info
See in Glossary’s descendants when you destroy a GameObject using Object.Destroy.
Previously, OnDisable was only invoked for components on the GameObject itself and its direct children. This change makes Object.Destroy behavior consistent with Object.DestroyImmediate, which has always invoked OnDisable across the entire hierarchy.
If you added workarounds to manually propagate OnDisable to deeper descendants, they will now cause duplicate calls and must be removed.
This section outlines recent updates to graphics that can affect your upgrade experience.
URP Compatibility Mode is now fully removed for custom render passes. The URP_COMPATIBILITY_MODE scripting define you could previously use to convert your project has also been removed. Use the render graph system for your custom render passes instead.
Previously, the SRP Core package had a hard dependency on com.unity.modules.physics. This is now a soft dependency.
com.unity.modules.physics is still enabled by default in Unity projects, but it may now be explicitly disabled. However, if you disable the module, local volumes will no longer work.com.unity.modules.physics, rather than relying on SRP Core to bring it transitively.IVolume interface is now removed. If you have custom volume types, implement volume visualization using the new VolumeGizmoDrawer class.The following updates have been made in the LightShadowCasterMode enum:
NonLightmappedOnly has been renamed to ShadowMask.Everything has been renamed to DistanceShadowMask.Your scriptsA piece of code that allows you to create your own Components, trigger game events, modify Component properties over time and respond to user input in any way you like. More info
See in Glossary will be automatically updated to rename the enum and related variables.
This section outlines recent updates to platform-specific tools and settings that can affect your upgrade experience.
This section outlines recent updates to iOS-specific tools and settings.
The Unity runtime libraries for iOS, iPadOS, tvOS, and visionOS are now aligned for both device and simulator builds. This update introduces several key changes:
XcodeFolder/Libraries/<Unity Runtime Lib> to XcodeFolder/Frameworks/UnityRuntime.framework/UnityRuntime.UnityRuntime.framework is now static instead of dynamic.This alignment ensures the libraries are of the same type and at the same path for both device and SDK. If your build pipeline includes post-processingA process that improves product visuals by applying filters and effects before the image appears on screen. You can use post-processing effects to simulate physical camera and film properties, for example Bloom and Depth of Field. More info post processing, postprocessing, postprocess
See in Glossary scripts that rely on the previous library paths, you might need to update them.
This section outlines recent updates to XR that can affect your upgrade experience.
Deprecated support for HoloLens 2 as a platform and the HoloLens 2 plug-inA set of code created outside of Unity that creates functionality in Unity. There are two kinds of plug-ins you can use in Unity: Managed plug-ins (managed .NET assemblies created with tools like Visual Studio) and Native plug-ins (platform-specific native code libraries). More info
See in Glossary. If your project targets HoloLens 2, migrate to the OpenXR plug-in.