Split a C# file into Unity 6.5+ and pre-Unity 6.5 variants. Use when a file needs different implementations for different Unity versions due to API changes (e.g., EntityId vs int, GetEntityId vs GetInstanceID).
79
100%
Does it follow best practices?
Run evals on this skill
Adds up to 20 points to the overall score
View guide
Passed
No findings from the security scan
Split a C# source file into two variants: one for Unity 6.5+ (UNITY_6000_5_OR_NEWER) and one for older versions (pre-Unity 6.5).
Unity 6.5 introduced breaking changes including:
EntityId replaces int for instance IDs (GetEntityId() replaces GetInstanceID())EditorUtility.EntityIdToObject(EntityId) replaces EditorUtility.InstanceIDToObject(int)EntityId <-> int conversions are marked [Obsolete(..., true)] (compile error)When a file needs different code for these Unity versions, split it into two files following the project convention.
| File | Purpose | Preprocessor Guard |
|---|---|---|
FileName.cs | Unity 6.5+ (newer version) | #if UNITY_6000_5_OR_NEWER |
FileName.pre-Unity.6.5.cs | Pre-Unity 6.5 (older version) | #if !UNITY_6000_5_OR_NEWER |
For files that also have Editor/Runtime variants, combine the guards:
| File | Guard |
|---|---|
FileName.Editor.cs | #if UNITY_EDITOR && UNITY_6000_5_OR_NEWER |
FileName.Editor.pre-Unity.6.5.cs | #if UNITY_EDITOR && !UNITY_6000_5_OR_NEWER |
FileName.Runtime.cs | #if !UNITY_EDITOR && UNITY_6000_5_OR_NEWER |
FileName.Runtime.pre-Unity.6.5.cs | #if !UNITY_EDITOR && !UNITY_6000_5_OR_NEWER |
Read $ARGUMENTS (the target file path). Identify which parts need version-specific code.
Common differences between Unity 6.5+ and pre-6.5:
| Unity 6.5+ | Pre-Unity 6.5 |
|---|---|
EntityId | int |
EntityId.None | 0 |
go.GetEntityId() | go.GetInstanceID() |
EditorUtility.EntityIdToObject(entityId) | EditorUtility.InstanceIDToObject(instanceID) |
ObjectRef.InstanceID is EntityId | ObjectRef.InstanceID is int? |
Update the original .cs file to contain only the Unity 6.5+ version:
UNITY_6000_5_OR_NEWEREntityId, GetEntityId(), etc.Create the .pre-Unity.6.5.cs file with the pre-6.5 version:
!UNITY_6000_5_OR_NEWERint, GetInstanceID(), etc.Both files must:
#nullable enable#endif matching the opening #ifRun assets-refresh tool to let Unity generate .meta files and recompile.
IMPORTANT: Do NOT manually create .meta files. Unity auto-generates them after assets-refresh or any AssetDatabase.Refresh() call.
Check for compilation errors using console-get-logs tool.
Given GameObjectUtils.Runtime.cs with #if !UNITY_EDITOR that uses both EntityId and int with #if UNITY_6000_5_OR_NEWER inside:
Before (single file with nested #if):
#if !UNITY_EDITOR
// ...
#if UNITY_6000_5_OR_NEWER
public static GameObject? FindByInstanceID(EntityId instanceID) { ... }
#else
public static GameObject? FindByInstanceID(int instanceID) { ... }
#endif
#endifAfter (two clean files):
GameObjectUtils.Runtime.cs:
#if !UNITY_EDITOR && UNITY_6000_5_OR_NEWER
// ...
public static GameObject? FindByInstanceID(EntityId instanceID) { ... }
#endifGameObjectUtils.Runtime.pre-Unity.6.5.cs:
#if !UNITY_EDITOR && !UNITY_6000_5_OR_NEWER
// ...
public static GameObject? FindByInstanceID(int instanceID) { ... }
#endifExisting examples of this pattern in the codebase:
Runtime/Data/ObjectRef.cs / ObjectRef.pre-Unity.6.5.csRuntime/Data/GameObjectRef.cs / GameObjectRef.pre-Unity.6.5.csRuntime/Utils/GameObjectUtils.Editor.cs / GameObjectUtils.Editor.pre-Unity.6.5.csTests/Editor/Tool/Assets/AssetsPrefabCreateTests.cs / AssetsPrefabCreateTests.pre-Unity.6.5.cse0a24ef
If you maintain this skill, you can claim it as your own. Once claimed, you can manage eval scenarios, bundle related skills, attach documentation or rules, and ensure cross-agent compatibility.