Free SKILL.md scraped from GitHub. Clone the repo or copy the file directly into your Claude Code skills directory.
npx versuz@latest install ivanmurzak-unity-mcp-unity-mcp-plugin-claude-skills-unity-version-splitgit clone https://github.com/IvanMurzak/Unity-MCP.gitcp Unity-MCP/SKILL.MD ~/.claude/skills/ivanmurzak-unity-mcp-unity-mcp-plugin-claude-skills-unity-version-split/SKILL.md---
name: unity-version-split
description: "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)."
argument-hint: "[path to the .cs file that needs splitting]"
---
# Unity Version Split
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).
## When to Use
Unity 6.5 introduced breaking changes including:
- `EntityId` replaces `int` for instance IDs (`GetEntityId()` replaces `GetInstanceID()`)
- `EditorUtility.EntityIdToObject(EntityId)` replaces `EditorUtility.InstanceIDToObject(int)`
- Implicit `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 Naming 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` |
## Step-by-Step Process
### Step 1 — Read the Source File
Read `$ARGUMENTS` (the target file path). Identify which parts need version-specific code.
### Step 2 — Identify the Split Points
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?` |
### Step 3 — Create the Two Files
1. **Update the original `.cs` file** to contain only the Unity 6.5+ version:
- Set the preprocessor guard to include `UNITY_6000_5_OR_NEWER`
- Use `EntityId`, `GetEntityId()`, etc.
2. **Create the `.pre-Unity.6.5.cs` file** with the pre-6.5 version:
- Set the preprocessor guard to include `!UNITY_6000_5_OR_NEWER`
- Use `int`, `GetInstanceID()`, etc.
Both files must:
- Start with `#nullable enable`
- Have the same copyright header as the original
- Use the same namespace and class name (partial classes)
- End with `#endif` matching the opening `#if`
### Step 4 — Refresh Assets
Run `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.
### Step 5 — Verify
Check for compilation errors using `console-get-logs` tool.
## Example
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):**
```csharp
#if !UNITY_EDITOR
// ...
#if UNITY_6000_5_OR_NEWER
public static GameObject? FindByInstanceID(EntityId instanceID) { ... }
#else
public static GameObject? FindByInstanceID(int instanceID) { ... }
#endif
#endif
```
**After (two clean files):**
`GameObjectUtils.Runtime.cs`:
```csharp
#if !UNITY_EDITOR && UNITY_6000_5_OR_NEWER
// ...
public static GameObject? FindByInstanceID(EntityId instanceID) { ... }
#endif
```
`GameObjectUtils.Runtime.pre-Unity.6.5.cs`:
```csharp
#if !UNITY_EDITOR && !UNITY_6000_5_OR_NEWER
// ...
public static GameObject? FindByInstanceID(int instanceID) { ... }
#endif
```
## Reference Files
Existing examples of this pattern in the codebase:
- `Runtime/Data/ObjectRef.cs` / `ObjectRef.pre-Unity.6.5.cs`
- `Runtime/Data/GameObjectRef.cs` / `GameObjectRef.pre-Unity.6.5.cs`
- `Runtime/Utils/GameObjectUtils.Editor.cs` / `GameObjectUtils.Editor.pre-Unity.6.5.cs`
- `Tests/Editor/Tool/Assets/AssetsPrefabCreateTests.cs` / `AssetsPrefabCreateTests.pre-Unity.6.5.cs`