Install
$ agentstack add skill-zaffre001-unity-claude-template-make-asset ✓ scanned · ✓ verified — works with Claude Code, Cursor, and more.
Security review
✓ PassedNo issues found. Passed automated security review. · v0.1.0 How review works →
- ✓ Prompt-injection patterns
- ✓ Secret / credential exfiltration
- ✓ Dangerous shell & filesystem operations
- ✓ Untrusted network calls
- ✓ Known-malicious package signatures
What it can access
- ● Network access Used
- ✓ Filesystem access No
- ✓ Shell / process execution No
- ✓ Environment & secrets No
- ✓ Dynamic code execution No
From automated source analysis of v0.1.0. “Used” means the capability is present in the source — more access means more to trust, not that it’s unsafe.
About
Skill: /make-asset
유니티 게임에 필요한 어셋을 즉석에서 제작한다. 인간이 그림·3D 모델 없어도 Claude가 UGUI 프리팹 / 파티클 / 프리미티브 모델 / 스프라이트 임포트 네 가지를 ClaudeBridge로 조립할 수 있다.
이 스킬은 에이전트도 사용자 명령 없이 호출 가능. 예를 들어 솔리테어 게임 로직을 짜다 "카드 프리팹이 필요" 라는 판단이 서면 /make-asset 를 불러 즉시 만든다.
1. 트리거와 인자
/make-asset {kind?} {spec?}
kind는 선택. 없으면 사용자 대화로 결정.
| kind | 용도 | 대표 출력 | |---|---|---| | ui / prefab / button | UGUI 프리팹 | Assets/Prefabs/UI/*.prefab (RectTransform + Image/Text/Button 조합) | | particle / vfx | 파티클 이펙트 | Assets/Prefabs/VFX/*.prefab (ParticleSystem + Renderer) | | model / mesh / placeholder | 프리미티브 조합 임시 모델 | Assets/Prefabs/Models/*.prefab (Cube/Sphere/Cylinder 스케일·부모-자식) | | sprite / icon | SVG 직접 작성 → PNG 래스터화 → Sprite 임포트, 또는 사용자 제공 이미지 임포트 | Assets/Art/Icons/*.png + .svg 원본 보존 + TextureImporter 옵션 |
spec은 자유 서술 (예: "빨간 체크 표시 아이콘 64x64", "카드 한 장. 앞면은 heart A, 뒷면은 파란 패턴", "흰 연기 파티클, 2초 지속").
2. 명세 수집 (모호하면 질문)
요구사항이 분명하지 않으면 먼저 물어본다. 추측으로 진행하지 않는다.
물어볼 체크리스트 (kind별):
UI 프리팹
- 화면 어디에 놓일 것? (전체 화면 덮는 패널 / 버튼 / 작은 위젯)
- 크기 기준 — 디자인 해상도는 얼마? (기본 1920×1080 가정)
- 상태별 비주얼 — Normal / Hover / Pressed / Disabled 모두 필요?
- 텍스트 들어가는가? 폰트는?
- 참조 이미지·목업이 있으면 첨부 부탁 (파일 또는 URL)
파티클
- 효과 성격 (타격, 폭발, 연기, 반짝임, 치유 오라 등)
- 지속 시간, 루프 여부
- 지배색
- 입자 수 규모 (가벼운 반짝임 ~20 / 폭발 ~500)
- 참조 영상·GIF 있으면 요청
프리미티브 모델
- 뭘 나타내려는지 (캐릭터 / 무기 / 건물 / 장애물)
- 대략적 비율·크기 (예: 사람 키 정도, 작은 상자)
- 색 구분이 필요한 부분
- 나중에 실제 모델로 교체할지 여부 (교체 예정이면 프리팹 이름/경로를 그에 맞게)
스프라이트/아이콘
- 경로 두 갈래 — 먼저 어느 쪽인지 판단:
- (A) 심볼·아이콘·도형류 (하트, 별, 체크, X, 화살표, 기어, 다이아몬드, 방패, 카드 슈트 등): Claude가 SVG를 직접 작성하고 PNG로 래스터화해서 임포트. 이미지 요청 불필요.
- (B) 사진·복잡한 일러스트: Claude는 이미지 생성 불가. 사용자에게 파일 또는 URL 요청.
- 목표 픽셀 크기 (기본: 단일 아이콘 256×256, 세트는 128×128)
- 색 팔레트 (지정 없으면 흰색 + 테두리로 placeholder)
- PPU (기본 100), 필터 모드 (기본 Bilinear, 도트풍이면 Point), 압축 (기본 None for tiny icons)
- 해상도 스케일이 필요하면
@2x,@4x변형도 같이 뽑을 것인가
3. 선행 조건 확인
/make-asset은 ClaudeBridge가 돌고 있어야 한다. 다음 순서로 확인:
unity_bridge_status()—editor_running: true면 OK,false면 사용자에게/run editor먼저 돌리라고 안내 또는unity_batch_flush()경로로 전환.- 사용자 쪽에
claude-bridgeMCP가 등록 안 되어 있으면 [scripts/claude-bridge-mcp/README.md](../../scripts/claude-bridge-mcp/README.md) 링크 안내. - MCP가 없고 Filesystem MCP만 있는 환경이면
.claude-bridge/inbox/직접 쓰기 +/run bridge호출로 대체.
4. 제작 패턴
4-1. UGUI 프리팹 — Button 예시
unity_call("Prefab.Open", {path: "Assets/Prefabs/UI/PrimaryButton.prefab"})
# 파일이 없으면 먼저 Asset.CreatePrefab으로 빈 틀 생성 후 Open
unity_call("Component.Add", {path: "/PrimaryButton", type: "UnityEngine.UI.Image"})
unity_call("Component.SetRectTransform", {path: "/PrimaryButton", sizeDelta: [320, 80], pivot: [0.5, 0.5]})
unity_call("Component.SetField", {path: "/PrimaryButton", type: "UnityEngine.UI.Image", field: "color", valueType: "UnityEngine.Color", valueJson: "{\"r\":0.2,\"g\":0.6,\"b\":1,\"a\":1}"})
unity_call("Component.Add", {path: "/PrimaryButton", type: "UnityEngine.UI.Button"})
# 라벨 자식
unity_call("GameObject.Create", {name: "Label", parentPath: null}) # 스테이지 모드라 /PrimaryButton 자동 부모
unity_call("Component.Add", {path: "/PrimaryButton/Label", type: "UnityEngine.UI.Text"})
unity_call("Component.SetRectTransform", {path: "/PrimaryButton/Label", anchorMin: [0,0], anchorMax: [1,1], offsetMin: [0,0], offsetMax: [0,0]})
unity_call("Component.SetField", {path: "/PrimaryButton/Label", type: "UnityEngine.UI.Text", field: "text", valueType: "System.String", valueJson: "\"Click Me\""})
# alignment, fontSize 등 이어서 세팅
unity_call("Prefab.Save", {})
unity_call("Prefab.Close", {})
생성 규칙:
- 파일 경로는
Assets/Prefabs/UI/.prefab - 상태 변형은 Prefab Variant로 (예:
PrimaryButton_Disabled.prefab) —Prefab.CreateVariant사용 - 텍스처/스프라이트가 필요하면 사용자에게 이미지 먼저 요청 (3-4 flow)
4-2. 파티클
unity_call("GameObject.Create", {name: "HitSpark", parentPath: null})
unity_call("Component.Add", {path: "/HitSpark", type: "UnityEngine.ParticleSystem"})
# ParticleSystem의 main/emission 모듈 설정은 SerializedObject 경로이므로 Reflection.Invoke로 호출:
unity_call("Reflection.Invoke", {
typeName: "UnityEngine.ParticleSystem",
methodName: "set_startLifetime", # property setter
targetInstanceId: "",
argTypes: ["UnityEngine.ParticleSystem+MinMaxCurve"],
argsJson: ["{\"mode\":0,\"constant\":1.5}"]
})
# 혹은 Component.SetField로 main/emission 구조체 통째 세팅
# Asset.CreatePrefab으로 저장
unity_call("Asset.CreatePrefab", {goPath: "/HitSpark", prefabPath: "Assets/Prefabs/VFX/HitSpark.prefab"})
unity_call("GameObject.Delete", {path: "/HitSpark"})
파티클은 Unity 직접 API가 복잡하므로 대부분 Reflection.Invoke 또는 구조체 통째 Component.SetField 패턴. 단순한 경우(색, 수명, 방출량)만 이 스킬이 커버하고, 복잡한 커브는 "사용자가 원하는 느낌 설명 → Claude가 근사치 프리팹 생성 → 사용자가 Editor에서 미세 조정"으로 넘긴다.
4-3. 프리미티브 placeholder 모델
unity_call("GameObject.Create", {name: "Enemy", parentPath: null})
# 몸통 — Cube
unity_call("GameObject.Create", {name: "Body", parentPath: "/Enemy"})
unity_call("Reflection.Invoke", {
typeName: "UnityEngine.GameObject",
methodName: "CreatePrimitive",
argTypes: ["UnityEngine.PrimitiveType"],
argsJson: ["\"Cube\""]
}) # (이 방식은 Enemy 자식으로 안 감. 실제로는 primitive 생성 후 SetParent가 더 정석)
# 간편화: Component.Add + MeshFilter/MeshRenderer로 조립하거나,
# 새로운 전용 op "Primitive.Create(parent, kind)"를 C# 쪽에 추가하는 게 깔끔
> TODO: 프리미티브 조립이 잦으면 Primitive.Create { parentPath, kind: Cube|Sphere|Cylinder|Capsule|Plane|Quad, localScale, color } op을 ClaudeBridge에 추가할 것. > 현재는 Reflection.Invoke로 GameObject.CreatePrimitive 호출 후 수동 부모화가 최선.
4-4. 스프라이트 / 아이콘
4-4-A. Claude가 SVG로 직접 그리는 경로 (심볼·도형류)
전체 흐름: SVG 작성 → Sprite.ImportFromSvg op 한 번 → 끝.
Unity Vector Graphics 패키지(com.unity.vectorgraphics)가 SVG 파싱·테셀레이션·Texture2D 렌더를 전담하고, ClaudeBridge 가 PNG 인코딩·저장·Sprite 임포트까지 한 op 안에서 처리한다. ImageMagick / rsvg-convert / qlmanage 같은 외부 바이너리 불필요.
Step 1. SVG 작성. 인라인 문자열로 op 인자에 바로 넣거나, Assets/Art/Icons/.svg 에 Write 툴로 먼저 저장한 뒤 경로만 넘긴다.
예시 — 하트 아이콘 (카드 슈트):
자주 쓰는 도형 패턴:
- 원형 배지: ``
- 둥근 사각형: ``
- 별: ``
- 체크: ``
- X: ``
- 화살표: ``
viewBox는 항상 0 0 100 100 정방형으로 통일. 그 안에서 좌표 사용하면 PNG 크기 바꿔도 동일 형태.
Step 2. 임포트 (한 방).
svg = """..."""
unity_call("Sprite.ImportFromSvg", {
"svgText": svg,
"pngPath": "Assets/Art/Icons/heart.png",
"width": 256,
"height": 256,
"pixelsPerUnit": 100,
"filterMode": "Bilinear", # "Point" = 도트풍
"compression": "None",
"antiAliasing": 4, # MSAA 샘플 (1/2/4/8), 기본 4
"saveSvgSource": True, # heart.svg 도 같이 저장해서 나중에 재편집 가능
})
한 호출 안에서:
- Unity Vector Graphics 가 SVG 파싱 → 테셀레이션 → MSAA 4x로 Texture2D 렌더
Texture2D.EncodeToPNG()→File.WriteAllBytes(pngPath, bytes)AssetDatabase.ImportAsset+TextureImporter(Sprite 타입, PPU, FilterMode, Compression,alphaIsTransparency=true, mipmaps off) 적용
svgText 대신 이미 디스크에 있는 .svg 를 쓰고 싶으면 svgPath: "Assets/Art/Icons/heart.svg" 로 넘긴다. svgText 가 있으면 그쪽이 우선.
한계. Unity Vector Graphics 는 대부분의 SVG 스펙을 지원하지만:
filter,mask, 복잡한 CSS 스타일, 외부 이미지 참조(``) 등은 제한적- 결과가 어긋나면 SVG 를 단순화 (path/polygon/rect/circle + 단색 fill/stroke 중심)
4-4-B. 사용자 제공 이미지 임포트 (사진·일러스트)
# 사용자가 이미지 파일을 Assets/Art/ 아래 드롭하거나 URL 제공.
# URL이면 curl로 받아서 해당 경로로 이동.
# curl -L -o Assets/Art/Icons/player-portrait.png "https://..."
unity_call("Asset.Refresh", {})
# TextureImporter 설정은 현재 Reflection.Invoke 경유 (사진·일러스트는 SVG 스킵)
# 필요해지면 Sprite.ImportTexture(path, ppu, filterMode, compression) 전용 op 추가 고려.
r = unity_call("Reflection.Invoke", {
"typeName": "UnityEditor.AssetImporter",
"methodName": "GetAtPath",
"argTypes": ["System.String"],
"argsJson": ["\"Assets/Art/Icons/player-portrait.png\""]
})
importer_id = json.loads(r["returnJson"])["instanceId"]
unity_call("Reflection.Invoke", {
"typeName": "UnityEditor.TextureImporter",
"methodName": "set_textureType",
"targetInstanceId": str(importer_id),
"argTypes": ["UnityEditor.TextureImporterType"],
"argsJson": ["\"Sprite\""]
})
unity_call("Reflection.Invoke", {
"typeName": "UnityEditor.AssetImporter",
"methodName": "SaveAndReimport",
"targetInstanceId": str(importer_id),
"argTypes": [],
"argsJson": []
})
5. 완료 후
- 생성된 프리팹 경로를 사용자에게 알린다.
- 변경된 어셋에 대해
Asset.Refresh한 번 호출. - 에이전트 내부에서 호출한 경우: 부모 태스크(
/task-start로 선언한 범위)로 돌아가 이 어셋을 이용한 다음 단계 진행.
6. 에이전트 자율 호출 지침
사용자가 직접 /make-asset을 말하지 않아도, 아래 상황에서는 에이전트가 선제적으로 호출한다:
- 스크립트를 작성 중인데 Inspector에 붙일 프리팹이 없을 때 (예:
[SerializeField] GameObject cardPrefab;) - 씬을 조립 중인데 "카드", "버튼", "이펙트" 같은 게임 오브젝트가 참조로 지목됐지만 해당 에셋이
Assets/어디에도 없을 때 - 솔리테어/퍼즐/플랫포머 같은 기본 장르 프로토타입을 만들 때 첫 단계
호출 전 사용자에게:
- "Card 프리팹이 필요한데 없습니다.
/make-asset ui로 간단한 카드 프리팹 만들까요? 이미지 있으면 첨부해 주세요 — 없으면 색 블록으로 임시 생성합니다."
식으로 한 줄만 알리고 진행한다. 무응답 시 기본값(임시 색 블록)으로 제작하되 나중에 교체 가능하도록 파일명·경로를 명시.
7. 금지 사항
- 외부 에셋 스토어에서 자동 다운로드 금지. 라이선스 불명. 사용자가 명시적으로 URL을 주거나 파일을 첨부할 때만 임포트.
.meta파일 직접 편집 금지 (RULES.md RULE-04). 모든 에셋 설정은AssetImporterAPI를 통해.- 심링크 폴더(
Art,Prefabs,Materials등)는 워크트리에선 읽기 전용. 메인 워크트리에서만 생성. 워크트리에서 호출되면 사용자에게 "메인 워크트리로 이동 후 다시 요청" 안내. - 대용량 바이너리(>10MB) 리포지토리 커밋 금지. Git LFS 또는 외부 스토리지 권장.
Source & license
This open-source skill is cataloged on AgentStack and links to its original source — we do not rehost the code.
- Author: zaffre001
- Source: zaffre001/unity-claude-template
- License: MIT
Install and usage instructions live in the source repository linked above.
Reviews
No reviews yet — be the first.
Write a review
Versions
- v0.1.0 Imported from the upstream source.