feat: 창고 환경 빌더 (외벽 + 선반 랙)
SinoWMS/Setup Warehouse 메뉴: 외벽 4면 + 랙 4줄을 콜라이더 포함 배치. 중앙/사이 통로로 캐릭터가 이동, 벽·랙에 막힘. Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
This commit is contained in:
@@ -0,0 +1,76 @@
|
||||
using UnityEditor;
|
||||
using UnityEditor.SceneManagement;
|
||||
using UnityEngine;
|
||||
|
||||
namespace SinoWms.EditorTools
|
||||
{
|
||||
/// <summary>
|
||||
/// 캐릭터가 돌아다닐 창고 환경(외벽 + 선반 랙)을 구성한다.
|
||||
/// 메뉴 <b>SinoWMS/Setup Warehouse</b>. 바닥(Ground)은 PlaygroundSetup에서 생성된 것을 사용한다.
|
||||
/// 모든 오브젝트에 콜라이더가 있어 캐릭터가 통과하지 못한다.
|
||||
/// </summary>
|
||||
public static class WarehouseSetup
|
||||
{
|
||||
private const float Half = 25f; // 바닥 50x50 기준 절반
|
||||
private const float WallH = 3f;
|
||||
private const float WallT = 0.5f;
|
||||
|
||||
[MenuItem("SinoWMS/Setup Warehouse")]
|
||||
public static void Setup()
|
||||
{
|
||||
var root = GameObject.Find("Warehouse") ?? new GameObject("Warehouse");
|
||||
|
||||
// ---- 외벽 4면 ----
|
||||
var walls = ChildContainer(root, "Walls");
|
||||
var wallMat = MakeMaterial(new Color(0.78f, 0.78f, 0.82f));
|
||||
MakeBox(walls, "Wall_N", new Vector3(0, WallH / 2, Half), new Vector3(2 * Half, WallH, WallT), wallMat);
|
||||
MakeBox(walls, "Wall_S", new Vector3(0, WallH / 2, -Half), new Vector3(2 * Half, WallH, WallT), wallMat);
|
||||
MakeBox(walls, "Wall_E", new Vector3(Half, WallH / 2, 0), new Vector3(WallT, WallH, 2 * Half), wallMat);
|
||||
MakeBox(walls, "Wall_W", new Vector3(-Half, WallH / 2, 0), new Vector3(WallT, WallH, 2 * Half), wallMat);
|
||||
|
||||
// ---- 선반 랙 (Z축으로 길게, 중앙 통로 비움) ----
|
||||
var racks = ChildContainer(root, "Racks");
|
||||
var rackMat = MakeMaterial(new Color(0.85f, 0.45f, 0.15f)); // 주황(창고 랙 느낌)
|
||||
float[] rows = { -16f, -8f, 8f, 16f };
|
||||
const float rackH = 2.5f, rackDepth = 1.5f, rackLen = 36f;
|
||||
foreach (float x in rows)
|
||||
{
|
||||
string side = x < 0 ? "L" : "R";
|
||||
MakeBox(racks, $"Rack_{side}{Mathf.Abs(x):0}",
|
||||
new Vector3(x, rackH / 2, 0f),
|
||||
new Vector3(rackDepth, rackH, rackLen), rackMat);
|
||||
}
|
||||
|
||||
EditorSceneManager.MarkSceneDirty(root.scene);
|
||||
Selection.activeGameObject = root;
|
||||
Debug.Log("[WarehouseSetup] 완료. Play 후 캐릭터로 통로를 돌아다녀 보세요.");
|
||||
}
|
||||
|
||||
private static GameObject ChildContainer(GameObject parent, string name)
|
||||
{
|
||||
var t = parent.transform.Find(name);
|
||||
if (t != null) return t.gameObject;
|
||||
var go = new GameObject(name);
|
||||
go.transform.SetParent(parent.transform, false);
|
||||
return go;
|
||||
}
|
||||
|
||||
private static void MakeBox(GameObject parent, string name, Vector3 pos, Vector3 scale, Material mat)
|
||||
{
|
||||
if (parent.transform.Find(name) != null) return; // 이미 있으면 건너뜀
|
||||
|
||||
var box = GameObject.CreatePrimitive(PrimitiveType.Cube); // BoxCollider 포함
|
||||
box.name = name;
|
||||
box.transform.SetParent(parent.transform, false);
|
||||
box.transform.localPosition = pos;
|
||||
box.transform.localScale = scale;
|
||||
box.GetComponent<Renderer>().sharedMaterial = mat;
|
||||
}
|
||||
|
||||
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: e7789607004404110a0cbb35327f9a2c
|
||||
Reference in New Issue
Block a user