Token导航 LogoToken导航TokenDH.com
开发需要联网github未标认证来源可访问许可证需确认审计通过

unity-scene-assetsUnity scene assets 命令行

Agent Skill

unity-scene-assets 用于处理 GitHub 仓库、Issue、Pull Request 和代码协作信息,适合在 Codex、Claude、Cursor、Gemini CLI 中需要围绕仓库状态、代码变更或协作事项进行整理时使用。可结合来源仓库、安装命令和原始 README 继续核验具体用法。安装前建议确认权限范围、维护状态,以及是否会触发联网、命令执行或文件读写。

总安装

324

周安装

13

GitHub Stars

14

下载量

105
CodexClaudeCursorGemini CLI

安装说明

本站只整理中文说明和来源信息,不托管安装包,也不代用户安装。

GitHub

来源数

2

许可证

unknown

最后核验

2026-05-01

来源状态

来源可访问

安装方式

通过对话安装

复制提示词发给支持本地命令或 Skills 的 AI 助手,先确认命令和权限,再让它执行。

请帮我安装这个 Agent Skill:unity-scene-assets(Unity scene assets 命令行)
来源仓库:https://github.com/nice-wolf-studio/unity-claude-skills
仓库路径:skills/unity-scene-assets
安装命令:
npx skills add https://github.com/nice-wolf-studio/unity-claude-skills --skill unity-scene-assets
安装前请先检查当前环境是否支持对应 CLI,并向我确认将要执行的命令、安装目录、联网范围和文件读写权限;确认后再执行。

命令行安装

复制命令到本机终端执行。该命令会通过 npx skills 从第三方来源获取 Skill;本站只展示命令,不托管安装包,也不自动执行。

skills.shnpx skills
npx skills add https://github.com/nice-wolf-studio/unity-claude-skills --skill unity-scene-assets

简介

unity-scene-assets 用于处理 GitHub 仓库、Issue、Pull Request 和代码协作信息。

  • 适合在 Codex、Claude、Cursor、Gemini CLI 中围绕仓库状态、代码变更或协作事项进行整理。
  • 支持场景资产管理与协作流程的信息处理。
  • 安装前需确认权限范围、维护状态及是否涉及联网或文件操作。
  • 建议参考原始 README 了解具体应用场景与使用限制。

SKILL.md

Scene & Asset Management -- Decision Patterns

Prerequisite skills: unity-foundations/references/prefabs-and-scenes.md (SceneManager API, additive loading), unity-async-patterns (Addressables handle lifecycle, async loading), unity-game-architecture (bootstrap patterns)

These patterns address the most common asset management failures: Claude hardcodes Resources.Load, ignores async loading, and does not account for memory lifecycle.


PATTERN: Scene Architecture Strategy

WHEN: Structuring a project's scenes for a real game (not a prototype)

DECISION:

  • Single scene -- Game jam, prototype, tiny game. Everything in one scene. No loading, no complexity. Outgrow it quickly.
  • Scene-per-level -- Linear progression (platformers, puzzle games). LoadScene(name, LoadSceneMode.Single) between levels. Clean separation but no shared state without DontDestroyOnLoad.
  • Additive scene composition -- Open worlds, persistent HUD, shared systems. A "Boot" or "Persistent" scene stays loaded, gameplay/UI scenes load additively. Most flexible, most complex.

SCAFFOLD (Additive scene coordinator):

using UnityEngine;
using UnityEngine.SceneManagement;

public class SceneCoordinator : MonoBehaviour
{
    [SerializeField] private string persistentSceneName = "Persistent";
    private string _currentContentScene;

    public static SceneCoordinator Instance { get; private set; }

    void Awake()
    {
        if (Instance != null) { Destroy(gameObject); return; }
        Instance = this;
        DontDestroyOnLoad(gameObject);
    }

    [RuntimeInitializeOnLoadMethod(RuntimeInitializeLoadType.SubsystemRegistration)]
    static void ResetStatic() => Instance = null;

    /// <summary>
    /// Load a content scene additively, unloading the previous one.
    /// The persistent scene stays loaded.
    /// </summary>
    public async Awaitable LoadContentScene(string sceneName)
    {
        // Unload previous content scene
        if (!string.IsNullOrEmpty(_currentContentScene))
        {
            await SceneManager.UnloadSceneAsync(_currentContentScene);
        }

        // Load new content scene
        await SceneManager.LoadSceneAsync(sceneName, LoadSceneMode.Additive);
        _currentContentScene = sceneName;

        // Set active scene for lighting and new object spawning
        SceneManager.SetActiveScene(SceneManager.GetSceneByName(sceneName));
    }
}

GOTCHA: SceneManager.SetActiveScene determines which scene's lighting settings apply and where newly instantiated objects are placed. Forgetting this causes objects spawning in the persistent scene (wrong lightmaps, wrong navmesh). The persistent scene must be in Build Settings at index 0. Every additive scene must also be in Build Settings.


PATTERN: Asset Loading Strategy

WHEN: Choosing how to load assets at runtime

DECISION:

  • Direct references ([SerializeField]) -- Small projects where all assets are always in memory. Simplest. Assets load with the scene. No manual lifecycle management.
  • Resources.Load -- Legacy. Avoid for new projects. The entire Resources folder is indexed at startup (slow) and included in builds (bloated).
  • Addressables -- Medium-large projects, dynamic content, DLC, remote assets. Async, reference-counted, labelable. Requires learning the lifecycle.

SCAFFOLD (AssetReference pattern):

using UnityEngine;
using UnityEngine.AddressableAssets;
using UnityEngine.ResourceManagement.AsyncOperations;

public class EnemySpawner : MonoBehaviour
{
    [SerializeField] private AssetReference enemyPrefabRef; // Assign in Inspector

    private AsyncOperationHandle<GameObject> _handle;

    public async Awaitable<GameObject> SpawnEnemy(Vector3 position)
    {
        // Load the asset (ref-counted -- safe to call multiple times)
        _handle = enemyPrefabRef.LoadAssetAsync<GameObject>();
        var prefab = await _handle.Task;

        return Instantiate(prefab, position, Quaternion.identity);
    }

    void OnDestroy()
    {
        // Release when no longer needed
        if (_handle.IsValid())
            Addressables.Release(_handle);
    }
}

GOTCHA: Resources.Load is synchronous, includes all assets in the Resources folder in the build (even unused ones), and has no unloading strategy. Migration: replace Resources.Load<T>("path") with Addressables.LoadAssetAsync<T>("path"). AssetReference fields in the Inspector let you select Addressable assets without string keys -- prefer these over string-based loading.


PATTERN: Addressables Group Strategy

WHEN: Organizing assets into Addressable groups for build and loading

DECISION:

  • By scene/level -- Level-based games. Load all assets for a level together. Unload when leaving. Clean memory lifecycle.
  • By type -- All characters, all VFX, all audio in separate groups. Good for shared assets used across multiple scenes.
  • By frequency -- Core (always loaded: UI, player, common VFX), On-demand (enemy variants, level-specific), Rare (boss, cutscene, seasonal).

SCAFFOLD (Label-based loading):

using UnityEngine;
using UnityEngine.AddressableAssets;
using UnityEngine.ResourceManagement.AsyncOperations;
using System.Collections.Generic;

public class LevelAssetLoader : MonoBehaviour
{
    private AsyncOperationHandle<IList<GameObject>> _levelAssetsHandle;

    public async Awaitable PreloadLevel(string levelLabel)
    {
        // Load all assets tagged with the level label
        _levelAssetsHandle = Addressables.LoadAssetsAsync<GameObject>(
            levelLabel,
            asset => Debug.Log($"Loaded: {asset.name}")
        );
        await _levelAssetsHandle.Task;
    }

    public void UnloadLevel()
    {
        if (_levelAssetsHandle.IsValid())
            Addressables.Release(_levelAssetsHandle);
    }
}

GOTCHA: Too many small groups create catalog overhead (each group = bundle metadata). Too few large groups force loading unneeded assets. Target 5-20 groups for most projects. Profile with the Addressables Event Viewer (Window > Asset Management > Addressables > Event Viewer) to verify load/unload timing.


PATTERN: Loading Screen Coordination

WHEN: Transitioning between gameplay sections with asset loading

DECISION:

  • AsyncOperation.allowSceneActivation -- Simple fade-to-black. Load to 90%, display loading screen, activate on ready. Single-scene approach.
  • Additive loading screen scene -- Persistent loading UI in its own scene. Better for complex transitions with progress bars and tips.

SCAFFOLD (Scene transition with progress):

public class SceneTransition : MonoBehaviour
{
    [SerializeField] private float minimumLoadScreenTime = 1f; // Prevent flash

    public async Awaitable TransitionTo(string sceneName, System.Action<float> onProgress = null)
    {
        // Show loading screen
        await SceneManager.LoadSceneAsync("LoadingScreen", LoadSceneMode.Additive);

        float startTime = Time.realtimeSinceStartup;

        // Begin loading target scene (paused at 90%)
        var loadOp = SceneManager.LoadSceneAsync(sceneName, LoadSceneMode.Additive);
        loadOp.allowSceneActivation = false;

        // Unload current gameplay scene in parallel
        if (!string.IsNullOrEmpty(_currentContentScene))
        {
            var unloadOp = SceneManager.UnloadSceneAsync(_currentContentScene);
            while (!unloadOp.isDone)
            {
                await Awaitable.NextFrameAsync(destroyCancellationToken);
            }
        }

        // Wait for target to reach 90% (ready to activate)
        while (loadOp.progress < 0.9f)
        {
            // Normalize: AsyncOperation.progress maxes at 0.9 when allowSceneActivation=false
            float normalizedProgress = Mathf.Clamp01(loadOp.progress / 0.9f);
            onProgress?.Invoke(normalizedProgress);
            await Awaitable.NextFrameAsync(destroyCancellationToken);
        }

        // Enforce minimum display time
        float elapsed = Time.realtimeSinceStartup - startTime;
        if (elapsed < minimumLoadScreenTime)
        {
            await Awaitable.WaitForSecondsAsync(
                minimumLoadScreenTime - elapsed, destroyCancellationToken);
        }

        onProgress?.Invoke(1f);

        // Activate the scene
        loadOp.allowSceneActivation = true;
        while (!loadOp.isDone)
            await Awaitable.NextFrameAsync(destroyCancellationToken);

        _currentContentScene = sceneName;
        SceneManager.SetActiveScene(SceneManager.GetSceneByName(sceneName));

        // Unload loading screen
        await SceneManager.UnloadSceneAsync("LoadingScreen");
    }

    private string _currentContentScene;
}

GOTCHA: AsyncOperation.progress maxes at 0.9 when allowSceneActivation = false. Normalize it: Mathf.Clamp01(op.progress / 0.9f). The scene activates immediately when allowSceneActivation is set to true -- there is no additional delay. Use Time.realtimeSinceStartup for minimum load time (not Time.time, which is affected by timeScale).


PATTERN: Asset Lifecycle Coordination

WHEN: Ensuring assets load before gameplay starts and unload when no longer needed

DECISION:

  • Preload on scene enter -- Load all required assets in a loading phase, release on scene exit. Predictable memory, no runtime hitches. Best for level-based games.
  • Lazy load on demand -- Load when first needed, cache reference, release when scene exits. Lower initial load time, possible frame hitches on first use. Best for open worlds.

SCAFFOLD (Asset preloader with progress):

using UnityEngine;
using UnityEngine.AddressableAssets;
using UnityEngine.ResourceManagement.AsyncOperations;
using System.Collections.Generic;

public class AssetPreloader : MonoBehaviour
{
    private readonly List<AsyncOperationHandle> _handles = new();

    /// <summary>
    /// Preload a list of Addressable keys. Reports progress 0-1.
    /// </summary>
    public async Awaitable Preload(
        IList<string> keys,
        System.Action<float> onProgress = null,
        CancellationToken token = default)
    {
        int loaded = 0;
        int total = keys.Count;

        foreach (string key in keys)
        {
            token.ThrowIfCancellationRequested();

            var handle = Addressables.LoadAssetAsync<Object>(key);
            _handles.Add(handle);
            await handle.Task;

            loaded++;
            onProgress?.Invoke((float)loaded / total);
        }
    }

    /// <summary>Release all preloaded assets.</summary>
    public void ReleaseAll()
    {
        foreach (var handle in _handles)
        {
            if (handle.IsValid())
                Addressables.Release(handle);
        }
        _handles.Clear();
    }

    void OnDestroy() => ReleaseAll();
}

GOTCHA: Releasing an Addressable handle while instantiated objects still reference the loaded asset causes pink/missing materials at best, crashes at worst. Always destroy all instances before releasing the asset handle. Use Addressables.InstantiateAsync instead of manual LoadAssetAsync + Instantiate when you want automatic tracking -- then use Addressables.ReleaseInstance to clean up.


Resources-to-Addressables Migration Checklist

StepAction
1Install Addressables package (com.unity.addressables)
2Open Window > Asset Management > Addressables > Groups
3Create default settings if prompted
4Move assets OUT of Resources/ folders to regular asset folders
5Mark assets as Addressable (Inspector checkbox or drag to group)
6Replace Resources.Load<T>("path") with Addressables.LoadAssetAsync<T>("path")
7Add handle tracking and Addressables.Release() calls
8Replace Resources.LoadAll<T>() with label-based Addressables.LoadAssetsAsync
9Delete empty Resources/ folders
10Test with Addressables Event Viewer to verify no leaks

Keep in Resources: Editor-only assets, test fixtures, assets needed before Addressables initializes (splash screen).

Related Skills

  • unity-foundations/references/prefabs-and-scenes.md -- SceneManager API, additive loading (do not duplicate)
  • unity-async-patterns -- Addressables AsyncOperationHandle lifecycle, async cancellation (do not duplicate)
  • unity-game-architecture -- Boot scene bootstrap, Service Locator for scene management
  • unity-performance -- Memory profiling, Addressables memory tracking

Additional Resources

适合场景

01

用户想查找某类 Agent Skill 时

02

需要根据任务场景推荐可安装能力包时

03

需要对比不同来源的安装命令和来源信息时

能力概览

能力 1

按任务关键词查找相关 Skills

能力 2

展示可复制的安装命令

能力 3

保留来源站点、仓库和原始说明,方便继续核验

能力 4

展示第三方安全扫描或审计结果

安装后应在对应宿主中按原始 README 的触发条件使用;具体调用方式请以来源页面和 README 为准。

平台分布

Codex

35.56%
按下载量换算37

Claude

28.75%
按下载量换算30

Cursor

19.16%
按下载量换算20

Gemini CLI

10.37%
按下载量换算11

安全审计

Gen Agent Trust Hub

通过

Socket

通过

Snyk

通过

权限和风险

需要联网

该 Skill 可能需要联网访问来源站点、仓库或外部 API;具体网络访问范围需要结合源码和 README 复核。

安装前确认

本站仅展示第三方公开信息,不托管安装包,不提供自动安装或运行环境。安装前应自行审查源码、依赖和命令行为。当前只有一个来源,正式发布前建议补源仓库或其他目录站核验。

来源信息

继续浏览同类 Skills