ThreeKingdomsSlingshot/Assets/Scripts/Runtime/Board.cs

79 lines
3.4 KiB
C#
Raw Normal View History

using UnityEngine;
namespace TKS
{
/// <summary>전장 가장자리 벽 표식. 캐스트 질의에서 벽으로 판정한다.</summary>
public class BoardWall : MonoBehaviour
{
}
/// <summary>전장(바닥·테두리·4면 벽 콜라이더).</summary>
public class Board : MonoBehaviour
{
public Vector2 Size { get; private set; }
public Rect Rect
{
get { return new Rect(-Size.x * 0.5f, -Size.y * 0.5f, Size.x, Size.y); }
}
public void Build(Vector2 size)
{
Size = size;
float w = size.x;
float h = size.y;
var bg = ProceduralSprites.NewSprite(transform, "Background", ProceduralSprites.Square, new Color(0.17f, 0.24f, 0.17f), 1f, -20);
bg.transform.localScale = new Vector3(w, h, 1f);
// 아군·적군 진영 구분용 옅은 띠
var enemyHalf = ProceduralSprites.NewSprite(transform, "EnemyHalf", ProceduralSprites.Square, new Color(0.45f, 0.2f, 0.2f, 0.18f), 1f, -19);
enemyHalf.transform.localScale = new Vector3(w, h * 0.5f, 1f);
enemyHalf.transform.localPosition = new Vector3(0f, h * 0.25f, 0f);
var mid = ProceduralSprites.NewSprite(transform, "MidLine", ProceduralSprites.Square, new Color(1f, 1f, 1f, 0.12f), 1f, -18);
mid.transform.localScale = new Vector3(w, 0.04f, 1f);
// 테두리
var borderColor = new Color(0.85f, 0.75f, 0.45f);
const float t = 0.12f;
MakeBorder("BorderTop", new Vector2(0f, h * 0.5f + t * 0.5f), new Vector2(w + t * 2f, t), borderColor);
MakeBorder("BorderBottom", new Vector2(0f, -h * 0.5f - t * 0.5f), new Vector2(w + t * 2f, t), borderColor);
MakeBorder("BorderLeft", new Vector2(-w * 0.5f - t * 0.5f, 0f), new Vector2(t, h), borderColor);
MakeBorder("BorderRight", new Vector2(w * 0.5f + t * 0.5f, 0f), new Vector2(t, h), borderColor);
// 벽 콜라이더 (바깥쪽 1 단위 두께)
const float wallT = 1f;
MakeWall("WallTop", new Vector2(0f, h * 0.5f + wallT * 0.5f), new Vector2(w + wallT * 2f, wallT));
MakeWall("WallBottom", new Vector2(0f, -h * 0.5f - wallT * 0.5f), new Vector2(w + wallT * 2f, wallT));
MakeWall("WallLeft", new Vector2(-w * 0.5f - wallT * 0.5f, 0f), new Vector2(wallT, h));
MakeWall("WallRight", new Vector2(w * 0.5f + wallT * 0.5f, 0f), new Vector2(wallT, h));
}
void MakeBorder(string name, Vector2 pos, Vector2 size, Color color)
{
var sr = ProceduralSprites.NewSprite(transform, name, ProceduralSprites.Square, color, 1f, -17);
sr.transform.localPosition = pos;
sr.transform.localScale = new Vector3(size.x, size.y, 1f);
}
void MakeWall(string name, Vector2 pos, Vector2 size)
{
var go = new GameObject(name);
go.transform.SetParent(transform, false);
go.transform.localPosition = pos;
var col = go.AddComponent<BoxCollider2D>();
col.size = size;
go.AddComponent<BoardWall>();
}
public Vector2 ClampInside(Vector2 p, float radius)
{
var r = Rect;
float x = Mathf.Clamp(p.x, r.xMin + radius, r.xMax - radius);
float y = Mathf.Clamp(p.y, r.yMin + radius, r.yMax - radius);
return new Vector2(x, y);
}
}
}