[{"data":1,"prerenderedAt":-1},["ShallowReactive",2],{"skill:01M6CBGHXR2CM7WDVJCSM6K7D4":3,"skill-same:01M6CBGHXR2CM7WDVJCSM6K7D4":88},{"skillNo":4,"name":5,"nameZh":6,"description":6,"descriptionZh":6,"repositoryFullName":7,"ownerLogin":8,"ownerAvatarUrl":9,"ownerAccountNo":10,"ownerDisplayName":11,"repositoryNo":12,"starsCount":13,"licenseSpdxId":14,"licenseFileUrl":6,"sourceHtmlUrl":15,"categories":16,"keywords":17,"publishedAt":20,"linkOnly":21,"markdownContent":22,"markdownBody":22,"frontMatter":23,"refName":24,"commitSha":25,"skillDirectory":26,"forksCount":13,"repositoryHtmlUrl":27,"repositoryHomepageUrl":6,"ownerHtmlUrl":28,"ownerBlogUrl":6,"ownerDescription":29,"updatedAt":30,"install":31,"resources":44},"01M6CBGHXR2CM7WDVJCSM6K7D4","12-input-settings",null,"devwinsoft\u002Fdevian","devwinsoft","https:\u002F\u002Favatars.githubusercontent.com\u002Fu\u002F22570160?v=4","01M6C6RR8W05NH8NPKQNCE3Q72","maoshy","01M6C6RRDJ5TJJCZXRTY801YDH",0,"MIT","https:\u002F\u002Fgithub.com\u002Fdevwinsoft\u002Fdevian\u002Fblob\u002Fmain\u002Fskills\u002Fdevian-unity\u002F50-mobile-package\u002F11-input-system\u002F12-input-settings\u002FSKILL.md",[],[18,19],"settings","12 input settings","2026-11-10 10:12:30",false,"# 12-input-settings\n\nStatus: ACTIVE\nAppliesTo: v11\nType: Component Specification\n\n## 목적\n\n`InputSettings`는 **InputManager의 프로젝트 단위 설정**을 외부 ScriptableObject `.asset`으로 분리한 데이터 컨테이너이다.\n\n- InputManager가 `Resources.Load\u003CInputSettings>(InputSettings.ResourcesPath)`로 고정 경로에서 로드\n- 프로젝트\u002F빌드별 입력 설정을 에셋 단위로 관리\n- `Assets\u002FResources\u002FDevian\u002FInputSettings.asset` 고정 위치\n\n---\n\n## 범위\n\n### 포함\n\n- `InputSettings` — ScriptableObject, 입력 설정 데이터 컨테이너\n\n### 제외\n\n- 입력 수집\u002F정규화\u002F발행 로직 (→ `10-input-manager`)\n- 입력 소비\u002F콜백 (→ `11-input-controller`)\n\n---\n\n## 네임스페이스\n\n```csharp\nnamespace Devian\n```\n\n---\n\n## 핵심 규약 (Hard Rule)\n\n### 1. ScriptableObject 기반\n\n- `CreateAssetMenu`로 프로젝트 내 `.asset` 파일 생성\n- `menuName = \"Devian\u002FMobilePackage\u002FInput Settings\"`\n- `ResourcesPath = \"Devian\u002FInputSettings\"` (Resources.Load 경로)\n- `DefaultResourcesAssetPath = \"Assets\u002FResources\u002FDevian\u002FInputSettings.asset\"`\n\n### 2. 필드 목록\n\n| 필드 | 타입 | 기본값 | 용도 |\n|------|------|--------|------|\n| `_asset` | `InputActionAsset` | null | Unity InputActionAsset 참조 |\n| `_gameplayMapName` | `string` | `\"Player\"` | Gameplay ActionMap 이름 |\n| `_uiMapName` | `string` | `\"UI\"` | UI ActionMap 이름 |\n| `_moveKey` | `string` | `\"Player\u002FMove\"` | Move 축 Action 키 |\n| `_lookKey` | `string` | `\"Player\u002FLook\"` | Look 축 Action 키 |\n| `_expectedButtonKeys` | `string[]` | empty | 버튼 Action 키 배열 |\n\n### 3. 읽기 전용 프로퍼티\n\n모든 필드는 `public` 읽기 전용 프로퍼티로 노출한다. setter 없음.\n\n### 4. InputManager 연동\n\n- InputManager는 `Resources.Load`로 고정 경로에서 로드 (`ensureSettings()` 패턴)\n- `_outputEnabled`는 인스턴스별 런타임 토글이므로 InputManager에 잔류\n\n---\n\n## API 시그니처\n\n```csharp\n[CreateAssetMenu(fileName = \"InputSettings\", menuName = \"Devian\u002FMobilePackage\u002FInput Settings\")]\npublic class InputSettings : ScriptableObject\n{\n    public const string ResourcesPath = \"Devian\u002FInputSettings\";\n    public const string DefaultResourcesAssetPath = \"Assets\u002FResources\u002FDevian\u002FInputSettings.asset\";\n\n    public InputActionAsset Asset { get; }\n    public string GameplayMapName { get; }\n    public string UIMapName { get; }\n    public string MoveKey { get; }\n    public string LookKey { get; }\n    public string[] ExpectedButtonKeys { get; }\n}\n```\n\n---\n\n## Editor 기능\n\n### Refresh Expected Button Keys\n\n`InputSettingsInspector` 커스텀 인스펙터에 **\"Refresh Expected Button Keys\"** 버튼을 제공한다.\n\n**동작:**\n1. `InputActionAsset`의 모든 ActionMap을 스캔\n2. `action.expectedControlType == \"Button\"` 인 액션만 수집\n3. key 포맷: `\"Map\u002FAction\"` (예: `\"Player\u002FAttack\"`)\n4. 중복 제거 (`StringComparer.Ordinal`)\n5. Ordinal 정렬\n6. 64개 초과 시 64개까지만 적용 + 경고 로그\n7. `_expectedButtonKeys` 배열을 완전 덮어쓰기\n8. 내부 버튼 맵 재빌드는 InputManager.OnEnable() 초기화 시 자동 수행\n\n**Play Mode:** Play Mode에서 비활성화된다.\n\n### Install\u002FEnsure VirtualGamepad Bindings\n\n`InputSettingsInspector`에 **\"Install\u002FEnsure VirtualGamepad Bindings\"** 버튼을 제공한다.\n\n**동작:**\n1. `MoveKey`, `LookKey` 값을 읽어 해당 Action을 해석\n2. Action에 `\u003CVirtualGamepad>\u002Fmove`, `\u003CVirtualGamepad>\u002Flook` 바인딩이 없으면 추가\n3. 이미 존재하면 아무 것도 안 함\n4. Undo 지원 + `AssetDatabase.SaveAssets()`\n\n**Play Mode:** Play Mode에서 비활성화된다.\n\n---\n\n## 파일 경로\n\n| 타입 | 경로 |\n|------|------|\n| InputSettings | `com.devian.foundation\u002FSamples~\u002FMobilePackage\u002FRuntime\u002FInput\u002FInputSettings.cs` |\n| InputSettingsInspector | `com.devian.foundation\u002FSamples~\u002FMobilePackage\u002FEditor\u002FInput\u002FInputSettingsInspector.cs` |\n\n---\n\n## DoD (Definition of Done)\n\n- [ ] `namespace Devian` 사용\n- [ ] ScriptableObject 상속\n- [ ] CreateAssetMenu 어트리뷰트 적용\n- [ ] 6개 필드 + 읽기 전용 프로퍼티\n- [ ] InputManager가 `Resources.Load\u003CInputSettings>(InputSettings.ResourcesPath)`로 로드\n- [ ] InputManager에서 기존 6개 SerializedField 제거됨\n- [ ] `_outputEnabled`는 InputManager에 잔류\n- [ ] `InputSettingsInspector` — Refresh, VirtualGamepad 버튼 제공\n- [ ] UPM ↔ UnityExample 동일\n\n---\n\n## Reference\n\n- Parent: `..\u002F00-overview\u002FSKILL.md`\n- InputManager: `..\u002F10-input-manager\u002FSKILL.md`\n",{},"main","8cb5bd877a3a7004867d2f55697cb9e4ff2f1734","skills\u002Fdevian-unity\u002F50-mobile-package\u002F11-input-system\u002F12-input-settings","https:\u002F\u002Fgithub.com\u002Fdevwinsoft\u002Fdevian","https:\u002F\u002Fgithub.com\u002Fdevwinsoft","Kim Hyong Joon","2026-04-12 18:44:10",{"source":7,"skillName":5,"commands":32,"prompt":42,"zipAvailable":43},[33,36,39],{"tool":34,"command":35},"npx","npx skills add devwinsoft\u002Fdevian --skill 12-input-settings",{"tool":37,"command":38},"bunx","bunx skills add devwinsoft\u002Fdevian --skill 12-input-settings",{"tool":40,"command":41},"pnpm","pnpm dlx skills add devwinsoft\u002Fdevian --skill 12-input-settings","安装技能，技能地址：https:\u002F\u002Fgithub.com\u002Fdevwinsoft\u002Fdevian\u002Fblob\u002Fmain\u002Fskills\u002Fdevian-unity\u002F50-mobile-package\u002F11-input-system\u002F12-input-settings\u002FSKILL.md",true,[45,51,55,59,64,68,72,76,80,84],{"path":46,"resourceType":47,"resourceTypeDesc":48,"sizeBytes":49,"sourceHtmlUrl":50},"bootstrap.md","REFERENCE","参考文档",5577,"https:\u002F\u002Fgithub.com\u002Fjiayaoqijia\u002Fcryptoskill\u002Fblob\u002Fmain\u002Fskills\u002Fchains\u002Fmystenlabs-sui-ts-sdk-backend\u002Fbootstrap.md",{"path":52,"resourceType":47,"resourceTypeDesc":48,"sizeBytes":53,"sourceHtmlUrl":54},"evals\u002Fevals.json",5860,"https:\u002F\u002Fgithub.com\u002Fjiayaoqijia\u002Fcryptoskill\u002Fblob\u002Fmain\u002Fskills\u002Fchains\u002Fmystenlabs-sui-ts-sdk-backend\u002Fevals\u002Fevals.json",{"path":56,"resourceType":47,"resourceTypeDesc":48,"sizeBytes":57,"sourceHtmlUrl":58},"executors.md",5037,"https:\u002F\u002Fgithub.com\u002Fjiayaoqijia\u002Fcryptoskill\u002Fblob\u002Fmain\u002Fskills\u002Fchains\u002Fmystenlabs-sui-ts-sdk-backend\u002Fexecutors.md",{"path":60,"resourceType":60,"resourceTypeDesc":61,"sizeBytes":62,"sourceHtmlUrl":63},"LICENSE","许可证",11357,"https:\u002F\u002Fgithub.com\u002Fjiayaoqijia\u002Fcryptoskill\u002Fblob\u002Fmain\u002Fskills\u002Fchains\u002Fmystenlabs-sui-ts-sdk-backend\u002FLICENSE",{"path":65,"resourceType":47,"resourceTypeDesc":48,"sizeBytes":66,"sourceHtmlUrl":67},"publishing.md",5065,"https:\u002F\u002Fgithub.com\u002Fjiayaoqijia\u002Fcryptoskill\u002Fblob\u002Fmain\u002Fskills\u002Fchains\u002Fmystenlabs-sui-ts-sdk-backend\u002Fpublishing.md",{"path":69,"resourceType":47,"resourceTypeDesc":48,"sizeBytes":70,"sourceHtmlUrl":71},"signing.md",7085,"https:\u002F\u002Fgithub.com\u002Fjiayaoqijia\u002Fcryptoskill\u002Fblob\u002Fmain\u002Fskills\u002Fchains\u002Fmystenlabs-sui-ts-sdk-backend\u002Fsigning.md",{"path":73,"resourceType":47,"resourceTypeDesc":48,"sizeBytes":74,"sourceHtmlUrl":75},"SOURCE.md",334,"https:\u002F\u002Fgithub.com\u002Fjiayaoqijia\u002Fcryptoskill\u002Fblob\u002Fmain\u002Fskills\u002Fchains\u002Fmystenlabs-sui-ts-sdk-backend\u002FSOURCE.md",{"path":77,"resourceType":47,"resourceTypeDesc":48,"sizeBytes":78,"sourceHtmlUrl":79},"sponsorship.md",8383,"https:\u002F\u002Fgithub.com\u002Fjiayaoqijia\u002Fcryptoskill\u002Fblob\u002Fmain\u002Fskills\u002Fchains\u002Fmystenlabs-sui-ts-sdk-backend\u002Fsponsorship.md",{"path":81,"resourceType":47,"resourceTypeDesc":48,"sizeBytes":82,"sourceHtmlUrl":83},"transactions.md",7823,"https:\u002F\u002Fgithub.com\u002Fjiayaoqijia\u002Fcryptoskill\u002Fblob\u002Fmain\u002Fskills\u002Fchains\u002Fmystenlabs-sui-ts-sdk-backend\u002Ftransactions.md",{"path":85,"resourceType":47,"resourceTypeDesc":48,"sizeBytes":86,"sourceHtmlUrl":87},"TRUST.auto.yaml",2182,"https:\u002F\u002Fgithub.com\u002Fjiayaoqijia\u002Fcryptoskill\u002Fblob\u002Fmain\u002Fskills\u002Fchains\u002Fmystenlabs-sui-ts-sdk-backend\u002FTRUST.auto.yaml",[89,95,103,111,120,127],{"skillNo":90,"name":91,"nameZh":6,"description":6,"descriptionZh":6,"repositoryFullName":7,"ownerLogin":8,"ownerAvatarUrl":9,"ownerAccountNo":10,"ownerDisplayName":11,"repositoryNo":12,"starsCount":13,"licenseSpdxId":14,"licenseFileUrl":6,"sourceHtmlUrl":92,"categories":93,"keywords":94,"publishedAt":20},"01M6CBX3K2JJV38ANHVGCAT8A0","devian","https:\u002F\u002Fgithub.com\u002Fdevwinsoft\u002Fdevian\u002Fblob\u002Fmain\u002Fskills\u002Fdevian\u002FSKILL.md",[],[91],{"skillNo":96,"name":97,"nameZh":6,"description":6,"descriptionZh":6,"repositoryFullName":7,"ownerLogin":8,"ownerAvatarUrl":9,"ownerAccountNo":10,"ownerDisplayName":11,"repositoryNo":12,"starsCount":13,"licenseSpdxId":14,"licenseFileUrl":6,"sourceHtmlUrl":98,"categories":99,"keywords":100,"publishedAt":20},"01M6CBX210BFMM8AMN770J9WY8","90-project-archive","https:\u002F\u002Fgithub.com\u002Fdevwinsoft\u002Fdevian\u002Fblob\u002Fmain\u002Fskills\u002Fdevian\u002F80-tools\u002F90-project-archive\u002FSKILL.md",[],[101,102],"archive","90 project archive",{"skillNo":104,"name":105,"nameZh":6,"description":6,"descriptionZh":6,"repositoryFullName":7,"ownerLogin":8,"ownerAvatarUrl":9,"ownerAccountNo":10,"ownerDisplayName":11,"repositoryNo":12,"starsCount":13,"licenseSpdxId":14,"licenseFileUrl":6,"sourceHtmlUrl":106,"categories":107,"keywords":108,"publishedAt":20},"01M6CBWZSGRR9R3YJZB3177667","30-env-management","https:\u002F\u002Fgithub.com\u002Fdevwinsoft\u002Fdevian\u002Fblob\u002Fmain\u002Fskills\u002Fdevian\u002F80-tools\u002F30-env-management\u002FSKILL.md",[],[109,110],"management","30 env management",{"skillNo":112,"name":113,"nameZh":6,"description":6,"descriptionZh":6,"repositoryFullName":7,"ownerLogin":8,"ownerAvatarUrl":9,"ownerAccountNo":10,"ownerDisplayName":11,"repositoryNo":12,"starsCount":13,"licenseSpdxId":14,"licenseFileUrl":6,"sourceHtmlUrl":114,"categories":115,"keywords":116,"publishedAt":20},"01M6CBWYD3TGWBQV7V35551THF","19-page-push-send","https:\u002F\u002Fgithub.com\u002Fdevwinsoft\u002Fdevian\u002Fblob\u002Fmain\u002Fskills\u002Fdevian\u002F80-tools\u002F20-operation\u002F19-page-push-send\u002FSKILL.md",[],[117,118,119],"push","page","19 page push send",{"skillNo":121,"name":122,"nameZh":6,"description":6,"descriptionZh":6,"repositoryFullName":7,"ownerLogin":8,"ownerAvatarUrl":9,"ownerAccountNo":10,"ownerDisplayName":11,"repositoryNo":12,"starsCount":13,"licenseSpdxId":14,"licenseFileUrl":6,"sourceHtmlUrl":123,"categories":124,"keywords":125,"publishedAt":20},"01M6CBWWRQ05A7604GHJKTPJTF","18-page-savedata","https:\u002F\u002Fgithub.com\u002Fdevwinsoft\u002Fdevian\u002Fblob\u002Fmain\u002Fskills\u002Fdevian\u002F80-tools\u002F20-operation\u002F18-page-savedata\u002FSKILL.md",[],[118,126],"18 page savedata",{"skillNo":128,"name":129,"nameZh":6,"description":6,"descriptionZh":6,"repositoryFullName":7,"ownerLogin":8,"ownerAvatarUrl":9,"ownerAccountNo":10,"ownerDisplayName":11,"repositoryNo":12,"starsCount":13,"licenseSpdxId":14,"licenseFileUrl":6,"sourceHtmlUrl":130,"categories":131,"keywords":132,"publishedAt":20},"01M6CBWVH4S2VF1V7B2GBTESCT","17-page-deobfuscate","https:\u002F\u002Fgithub.com\u002Fdevwinsoft\u002Fdevian\u002Fblob\u002Fmain\u002Fskills\u002Fdevian\u002F80-tools\u002F20-operation\u002F17-page-deobfuscate\u002FSKILL.md",[],[118,133],"17 page deobfuscate"]