{"id":15160715,"url":"https://github.com/geonhanlee/scenestack","last_synced_at":"2025-09-30T12:30:47.446Z","repository":{"id":174878691,"uuid":"631967098","full_name":"GeonhanLee/SceneStack","owner":"GeonhanLee","description":"SceneStack is a multi-scene management system with URP CameraStack support.","archived":true,"fork":false,"pushed_at":"2023-06-14T03:12:30.000Z","size":1550,"stargazers_count":7,"open_issues_count":0,"forks_count":0,"subscribers_count":1,"default_branch":"main","last_synced_at":"2024-09-27T23:21:02.915Z","etag":null,"topics":["multi-scene","scene","scene-management","tool","unity","unity-editor","urp"],"latest_commit_sha":null,"homepage":"","language":"C#","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":null,"status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/GeonhanLee.png","metadata":{"files":{"readme":"README.md","changelog":null,"contributing":null,"funding":null,"license":null,"code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":null,"support":null,"governance":null,"roadmap":null,"authors":null,"dei":null,"publiccode":null,"codemeta":null}},"created_at":"2023-04-24T12:43:52.000Z","updated_at":"2024-04-04T06:03:01.000Z","dependencies_parsed_at":null,"dependency_job_id":"d2268bff-677c-4724-9610-b91fd8642cbd","html_url":"https://github.com/GeonhanLee/SceneStack","commit_stats":{"total_commits":71,"total_committers":2,"mean_commits":35.5,"dds":0.05633802816901412,"last_synced_commit":"db35b6aa23faa73fdd71c7751a75a86778498281"},"previous_names":["geonhanlee/scenestack"],"tags_count":2,"template":false,"template_full_name":null,"repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/GeonhanLee%2FSceneStack","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/GeonhanLee%2FSceneStack/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/GeonhanLee%2FSceneStack/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/GeonhanLee%2FSceneStack/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/GeonhanLee","download_url":"https://codeload.github.com/GeonhanLee/SceneStack/tar.gz/refs/heads/main","host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":234737799,"owners_count":18879179,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2022-07-04T15:15:14.044Z","host_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub","repositories_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories","repository_names_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repository_names","owners_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners"}},"keywords":["multi-scene","scene","scene-management","tool","unity","unity-editor","urp"],"created_at":"2024-09-26T23:21:15.356Z","updated_at":"2025-09-30T12:30:42.106Z","avatar_url":"https://github.com/GeonhanLee.png","language":"C#","funding_links":[],"categories":[],"sub_categories":[],"readme":"# SceneStack\nSceneStack is a multi-scene management system with URP CameraStack support.\n\n## Features\n- Multi-scene management\n- URP Camera Stacking support\n  - Find and add all overlay cameras across scene to the base camera.\n  - Removes annoying cross-Scene reference warnings by referencing overlay cameras from another scene.\n\n## Usage\n\n### UI Scene\nUsing SceneStack, UI camera \u0026 canvas can be managed in separate scenes.  \n![image](.github/assets/UISceneHierarchy.png)\n\nYou can create a UI scene by these steps.\n1. Create a Scene.\n2. Add a UI camera with Render Type - Overlay and Culling Mask - UI.  \n3. Add a canvas with Screen Space - Camera and set Render Camera to your UI camera.\n\nFor more information of this usage, please refer to the `UISceneSample` sample project in the package’s details panel.\n\n## Guide\n\n### Getting started\n#### 0. Prerequisites\nSceneStack requires Unity 2022.x+ and URP with camera stack support.\n#### 1. Install from a Git URL\nAdd the following line to the dependencies section of your project's manifest.json file.\n```json\n\"com.malcha.scenestack\": \"git+https://github.com/GeonhanLee/SceneStack.git?path=/Packages/SceneStack\"\n```\n#### 2. Namespace\nAdd `using Malcha.SceneStack;`\n\n### SceneStackSO\nYou can create your own `SceneStack` with `SceneStackSO` in the editor.\n\nCreate `SceneStackSO` using the menu `Assets \u003e Create \u003e SceneStack \u003e Create SceneStack`.  \n![image](.github/assets/CreateSceneStackMenu.png)  \nAssign your scene to the base scene field in the inspector.  \nYou can also add overlay scenes as a stack.  \n![image](.github/assets/SceneStackInspector.png)\n\n`SceneStackSO` gives you warning in the inspector if base scene is missing or some scenes in the `SceneStack` are not in build.  \n![image](.github/assets/SceneStackInspectorWarning.png)\n\n### Configure SceneStack in runtime\nYou can clone `SceneStack` from your `SceneStackSO`.\n```cs\npublic SceneStack ExampleCloneSceneStack(SceneStackSO so)\n{\n  return so.CloneSceneStack();\n}\n```\nor you can construct your own `SceneStack` without `SceneStackSO`.\n```cs\nSceneStack stack = new SceneStack(\"BaseScene\");\n// stack.baseScene = new SceneData(\"BaseScene\"); is also ok.\nstack.overlayScenes = new List\u003cSceneData\u003e\n{\n  new SceneData(\"Assets/SampleScenes/UIOverlaySceneA.unity\"),\n  new SceneData(\"UIOverlaySceneB\"),\n  new SceneData(\"SampleScenes/UIOverlaySceneC\")\n};\n```\nYou can fill the class `SceneData`'s constructor with the name or path of the scene as [`SceneManager.LoadScene`](https://docs.unity3d.com/ScriptReference/SceneManagement.SceneManager.LoadScene.html).\n\n### CameraStack\nOverlay cameras in scenes included in the `SceneStack` will be added to base camera when `SceneStack` is loaded.  \n![image](.github/assets/OverlayCamerasHierarchy.png)  \nThe order of cameras in camera stack is equivalent to the order of belonged scene in the `SceneStack`.  \n![image](.github/assets/CameraStackInspector.png)  \n\n### Open SceneStack in editor mode\nYou can open your `SceneStack` in editor mode by clicking the button on `SceneStackSO`,  \n![image](.github/assets/SceneStackOpenButton.png)\n\nor right click the `SceneStackSO` in the project window and select `Open Scene Stack` menu.  \n![image](.github/assets/SceneStackOpenMenu.png)\n\n\n### Load SceneStack in runtime\nYou can load `SceneStack` using a static class, `SceneStackLoader` in runtime.\n```cs\npublic void ExampleLoadSceneStackSO(SceneStackSO so)\n{\n  SceneStackLoader.LoadSceneStack(so);\n}\npublic void ExampleLoadSceneStack(SceneStack ss)\n{\n  SceneStackLoader.LoadSceneStack(ss);\n}\n```\n\n### SceneStackCanvasSorter \nThe raycast order of canvas across multiple scenes with same sorting order is not guranteed.  \nTo fix this, `SceneStackCanvasSorter` sets the `sortingOrder` of a canvas to the index of a scene which belongs to.\n\nAdd `SceneStackCanvasSorter` component to your canvas object.  \n![image](.github/assets/SceneStackCanvasSorter.png)\n\n### SceneStackCameraSorter\nCamera is sorted in the camera stack with an index of its belonged scene.  \nIf you want to sort the cameras in the same scene, use the `SceneStackCameraSorter` component.\n\nAdd `SceneStackCameraSorter` component to your Camera object and modify Sorting Order in the inspector window. The lower sorting order is rendered first.  \n![image](.github/assets/SceneStackCameraSorter.png)\n\n## Internal Operations\n\n### SceneStackSOManager\n`SceneStackSOManager` Reserializes all `SceneStackSO` by `ReserializeAllSceneStackSO()`.\n\nThe method is called when below occurs.  \n1. `ExitingEditMode`\n2. `OnPreprocessBuild`\n3. `OnPostprocessAllAssets` : when SceneAsset is imported / deleted / moved\n\n`ReserializeAllSceneStackSO()` automatically saves dirtied `SceneAssetSO` when called.  \nThis is because `AssetDatabase.ForceReserializeAssets()` serializes before the modification is applied.\n\n### SceneStackWarningSuppressor\n`SceneStackWarningSuppressor` removes annoying warnings on the editor by removing cross scene references when entering/exiting playmode.  \n\nIt also selects and deselects camera when entering/exiting playmode to remove the error message below.  \nhttps://forum.unity.com/threads/indexoutofrangeexception-in-urp.1306230\n\n\n## Limits \u0026 To-Do\nThe list below is not currently supported.\n- Multiple base camera (e.g. split screen, render texture)\n- Async scene loading\n\n## Credits \u0026 Similar Projects\nSceneStack is heavily inspired by these projects. \n- [Eflatun.SceneReference](https://github.com/starikcetin/Eflatun.SceneReference)\n  - Unlike `Eflatun.SceneReference`, SceneStack doesn't generate a Scene GUID to Path Map. Instead, SceneStack reserializes all `SceneStackSO`.\n  - SceneStack doesn't provide SceneReference API to user.\n- [CarterGames/MultiScene](https://github.com/CarterGames/MultiScene)\n## License\nThis project is licensed under the terms of the MIT License.\nRefer to the [LICENSE.md](./Packages/SceneStack/LICENSE.md) file.","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fgeonhanlee%2Fscenestack","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fgeonhanlee%2Fscenestack","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fgeonhanlee%2Fscenestack/lists"}