디펜스 게임 만들기 [Grid & Gizmo]
회사에서 2D 게임만 만들다보니 3D를 다루는 법을 잊을까봐 3D 게임을 만들어 보도록 한다.
기획
게임 종류 : 디펜스게임
1. 대전 게임 형식
2. 서로 유닛을 보내어 싸움.
3. 라이프를 서로 뺏어 올 수 있으며, 라이프가 0되는 플레이어가 패배.
일단 디펜스 게임을 만들기 위해선
몬스터, 맵, 플레이어가 필요하다.
맵은 몬스터가 출발 방향에서 도착 방향까지 가야하며, 도착 지점에 도달할 시 라이프를 마이너스 시켜준다.
도착 지점까지는 무수한 타워들이 있을 것이며, 그 타워가 만든 길을 따라 몬스터는 도착지점까지 최소거리를 연산하고 움직여야한다.
일단, 맵을 만들어 본다.
맵을 만들기 전, 최소 거리를 만들기 위해 존재하는 맵을 조각조각 나누어 조각에 가중치를 두어 계산한다. A* 알고리즘을 이용하면 될거 같다.
우선 프로젝트를 생성한다. 2021년 유니티는 오랜만에 사용하는데, shader이나 그래픽적으로 획기적으로 발전했다고 하니 이번에 만들면서 공부해보자.
우선 Node를 만든다. Node는 조각의 한 부분을 이루는 요소라고 생각하자.
using UnityEngine;
public class Node
{
public Vector3 worldPosition;
public int gridX, gridY;
public Node(Vector3 pos, int x, int y)
{
worldPosition = pos;
gridX = x;
gridY = y;
}
}
각 Node는 좌표를 갖고 있으며, [x,y]배열의 위치를 갖게 된다. 즉 위의 Node 는 pos라는 월드 좌표와 x축과 y축에 있는 Node인 것이다.
이 노드를 Scene에 가상으로 그려본다.
using System;
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
public class Grid : MonoBehaviour
{
Vector2 gridSize;
Node[,] grid;
float nodeRadius; //노드 반지름
float nodeDiameter; //노드 지름
int gridXCount, gridYCount; //Grid X축 Node 갯수, Grid Y축 Node 갯수
private void Awake()
{
nodeRadius = 0.5f;
nodeDiameter = nodeRadius * 2f;
gridSize = new Vector2(30, 30);
gridXCount = Mathf.RoundToInt(gridSize.x / nodeDiameter);
gridYCount = Mathf.RoundToInt(gridSize.y / nodeDiameter);
}
private void Start()
{
CreateGrid();
}
private void CreateGrid()
{
grid = new Node[gridXCount, gridYCount]; // [30,30]
Vector3 worldBottomLeft = transform.position - new Vector3((gridSize.x * 0.5f), 0, (gridSize.y * 0.5f));
for (int x = 0; x < gridXCount; x++)
{
for (int y = 0; y < gridYCount; y++)
{
Vector3 worldPosition = worldBottomLeft + new Vector3((x * nodeDiameter + nodeRadius), 0, (y * nodeDiameter + nodeRadius));
grid[x, y] = new Node(worldPosition, x, y);
}
}
}
private void OnDrawGizmos()
{
Gizmos.DrawWireCube(transform.position, new Vector3(gridSize.x, 1f, gridSize.y));
if(grid != null)
{
foreach(var node in grid)
{
Gizmos.color = Color.white;
Gizmos.DrawCube(node.worldPosition, Vector3.one * nodeDiameter);
}
}
}
}
Grid는 격자라는 뜻인데, 맵을 격자처럼 쪼개어 Node를 담고 있다.
위의 WorldBottomLeft라는 값으로 시작 지점을 지정한다.
Node는 정중앙이 기준점이기 때문에 Node의 반지름만큼 y축과 x축을 이동 시켜 모서리 방향을 맞춰줘야한다. 출발 Node를 기점으로 지름만큼씩 이동시켜주며 Node를 만들어 Gizmos 를 만들어 준다.
그러면 이런 그림의 모양이 만들어진다.
특이점에 게임 카메라에는 아무것도 안뜨는데, Gizmo를 알아볼려면
https://docs.unity3d.com/kr/530/ScriptReference/Gizmos.html
Unity - 스크립팅 API: Gizmos
Success! Thank you for helping us improve the quality of Unity Documentation. Although we cannot accept all submissions, we do read each suggested change from our users and will make updates where applicable. 닫기
docs.unity3d.com
들어가 알아보자. Gizmo는 개발을 돕기위해 시각적으로 Unity에서 지원하는 그림도구일 뿐이기에 오브젝트로 생성되지 않는다.
시간이 될때 조금씩 만들어 보겠다. 나름 재밌는듯