feat: 탑다운 캐릭터 이동 플레이그라운드

- PlayerController: WASD/방향키 이동 + 진행방향 회전 (새 Input System)
- CameraFollow: 위에서 비스듬히 따라가는 카메라
- PlaygroundSetup: 바닥+캐릭터+카메라 자동 구성 메뉴

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
This commit is contained in:
jklee
2026-06-14 20:00:45 +09:00
parent de5a40678e
commit 065355f63a
7 changed files with 173 additions and 0 deletions
+81
View File
@@ -0,0 +1,81 @@
using UnityEditor;
using UnityEditor.SceneManagement;
using UnityEngine;
using SinoWms.Player;
namespace SinoWms.EditorTools
{
/// <summary>
/// 캐릭터 이동 확인용 최소 플레이그라운드를 구성한다.
/// 메뉴 <b>SinoWMS/Setup Playground Scene</b> 실행 후 Play → WASD/방향키로 이동.
/// </summary>
public static class PlaygroundSetup
{
[MenuItem("SinoWMS/Setup Playground Scene")]
public static void Setup()
{
// 바닥
var ground = GameObject.Find("Ground");
if (ground == null)
{
ground = GameObject.CreatePrimitive(PrimitiveType.Plane);
ground.name = "Ground";
ground.transform.localScale = new Vector3(5f, 1f, 5f); // 50x50
ground.GetComponent<Renderer>().sharedMaterial = MakeMaterial(new Color(0.5f, 0.55f, 0.6f));
}
// 플레이어
var player = GameObject.Find("Player");
if (player == null)
{
player = GameObject.CreatePrimitive(PrimitiveType.Capsule);
player.name = "Player";
player.transform.position = new Vector3(0f, 1.1f, 0f);
// CharacterController와 기본 CapsuleCollider 충돌 방지
var capCol = player.GetComponent<CapsuleCollider>();
if (capCol != null) Object.DestroyImmediate(capCol);
var cc = player.AddComponent<CharacterController>();
cc.height = 2f;
cc.radius = 0.5f;
cc.center = Vector3.zero;
player.AddComponent<PlayerController>();
player.GetComponent<Renderer>().sharedMaterial = MakeMaterial(new Color(0.2f, 0.5f, 1f));
// 정면 표시용 작은 큐브(어느 쪽을 보는지)
var nose = GameObject.CreatePrimitive(PrimitiveType.Cube);
nose.name = "Nose";
Object.DestroyImmediate(nose.GetComponent<BoxCollider>());
nose.transform.SetParent(player.transform, false);
nose.transform.localScale = new Vector3(0.25f, 0.25f, 0.4f);
nose.transform.localPosition = new Vector3(0f, 0.3f, 0.5f);
nose.GetComponent<Renderer>().sharedMaterial = MakeMaterial(new Color(1f, 0.85f, 0.3f));
}
// 카메라 (탑다운 추적)
var cam = Camera.main;
if (cam == null)
{
var camGo = new GameObject("Main Camera") { tag = "MainCamera" };
cam = camGo.AddComponent<Camera>();
}
var follow = cam.GetComponent<CameraFollow>() ?? cam.gameObject.AddComponent<CameraFollow>();
follow.SetTarget(player.transform);
cam.transform.position = player.transform.position + new Vector3(0f, 12f, -8f);
cam.transform.LookAt(player.transform.position);
Selection.activeGameObject = player;
EditorSceneManager.MarkSceneDirty(player.scene);
Debug.Log("[PlaygroundSetup] 완료. Play 후 WASD/방향키로 캐릭터를 움직여 보세요.");
}
/// <summary>URP 환경에서 분홍색으로 안 보이도록 URP/Lit 머티리얼 생성.</summary>
private static Material MakeMaterial(Color color)
{
var shader = Shader.Find("Universal Render Pipeline/Lit") ?? Shader.Find("Standard");
return new Material(shader) { color = color };
}
}
}
@@ -0,0 +1,2 @@
fileFormatVersion: 2
guid: 6a6e35879fd6146759034c5dab7c4afd