저번에 본 작업을 하는 것보다 젯 브레인으로 리펙토링 하고 이러는데 더 많은 시간을 쓴 듯싶다. 사실상 이번 편이 진전한 진도다. 저번 편은 시행착오한 거다. 이전 포스트는 잊어 주라.
일단은 랜덤하게 큐브를 흩뿌리는 걸 재생 버튼을 누르지 않고도 만들어야 한다. 이 노드들을 일일이 내가 다 만들 수는 없는 법이기 때문이다.
[ContextMenu (string a)] 기능을 활용할 생각이다.
이 게임 만들려고 맘 먹은지 2년이 되어간다. 물론 유니티랑 블렌더 공부를 병행하면서 진행을 했기 때문에 실재로는 1년 정도 개발 기간으로 잡아야 하지만 슬슬 집에 빌붙어서 먹고 사는 건 한계에 온 듯싶다. 내년에는 수익을 내서 독립해서 나와야 할 듯싶다.
이거 블로그 쓰는 걸로는 한달에 5000원 정도 벌고 있어서 이걸로는 한계가 있다.
젯브레인 라이더가 코드 리펙토링을 한 뒤로 이게 생겼는데 실제 실행에는 문제가 없다. 오류가 실행하려고 하면 사라져 버리기 때문이다. 머가 문제인지 너무 코딩을 한지 오래돼서 기억이 잘 나지 않는다. 일단 일지에 적어 놓는다. 언젠간 문제가 될 수도 있느니 말이다.
우선 큐브를 흩 뿌리는 걸 만들어야 한다. 한 35개 정도 노드가 등장하는데 모양을 타원형이나 이런 걸로 만들고 지우는 거 까지 고려하면 한 50개 정도 랜덤 하게 만들어 주면 될 듯싶다. 이것도 꽤 많이 시행착오를 하며 최적 값을 알아 내야 겠다.
using UnityEngine;
namespace NodeMap
{
public class MakingNodes : MonoBehaviour {
[SerializeField] GameObject _cube;
[ContextMenu ("MakeRandomNodes")]
public void MakeRandomNodes (){
if (_cube == null) return;
var pos = Vector3.zero;
Instantiate (_cube, pos, Quaternion.identity);
}
}
}
젯브레인으로 리팩터링을 하면서 죄다 네임스페이스를 쓰고 내부에서만 쓰는 멤버 변수의 경우에는 _바를 쓰도록 했기 때문에 앞으로 쭉 이 코딩 스타일로 가야 할 듯싶다.
하나 생성하는데 성공했다. 저번에 여기까지 했었나. 이제 진짜 랜덤 하게 많이 생성되도록 해야겠다.
어떻게 만들어야 할까. 일단 랜덤한 백터들을 생성한 리스트를 하나 만든다. 그다음에 그 리스트를 돌려서 노드들을 인스탄시 에이트 해주면 될 듯싶다. 노드들 간에 식별자가 있으면 여로 모로 좋을 테니까 이름에 1번 2번 이런 식으로 붙이면 좋을 듯싶다.
namespace NodeMap
{
public class MakingNodes : MonoBehaviour {
[SerializeField] GameObject cube;
[ContextMenu ("Make Random Nodes")]
public void MakeRandomNodes (){
if (cube == null) return;
var vector3S = new List<Vector3>();
var pos = Vector3.zero;
Instantiate (cube, pos, Quaternion.identity);
}
}
}
똑같은 건데 젯 브레인에서는 이런 식으로 하라고 하신다.
으음...
public class MakingNodes : MonoBehaviour {
[SerializeField] GameObject cube;
[SerializeField] private int nodeNumber = 50;
[SerializeField] private int halfSize = 20;
[ContextMenu ("Make Random Nodes")]
public void MakeRandomNodes (){
if (cube == null) return;
var randomVector3List = new List<Vector3>List <Vector3>();
for (int i = 0; i < nodeNumber; i++)
{
var pos = new Vector3 (Random.Range(-halfSize, halfSize), 0f, Random.Range(-halfSize, halfSize));
Instantiate (cube, pos, Quaternion.identity);
}
}
}
루프 두 번 돌릴 거 없어서 이런 게 만들긴 했는데 군집성이 좀 필요할 듯싶긴 하다. 군집성을 만들어 주려면 좀 복잡한 코팅이 필요할듯 싶긴하다. 일단 그냥 이건 수동으로 만들어준다. 물론 게임이 나오고 콘텐츠를 많이 찍어내야 할 시점이 오면 군집성을 띠도록 코드를 만들 생각이다. 일단은 수동으로 적절히 이동을 시켜주고 이번엔 서로 연결해 주는 걸 자동화하도록 하자.
최소한 가장 가까운 노드로 2개를 뻗는 게 필요할 듯싶다. 나머지는 수동으로 조절하도록 하자.
완전 하드 코어 한 로그라이크가 아니라 본진에 있을 때는 저장을 할 수 있는 정도의 로그라이크를 해야겠다. 물론 로그라이크 모드도 준비해 놓는다.
아이콘의 경우에는 블렌더로 3D로 만들 생각이다. 어차피 위에서 보면 2D가 되니 말이다.
비슷하게 만들었다. 이게 길을 만들어야 할 듯싶다. 노드를 이어야 하는 이걸 일일이 있는 거는 막일니 어느 정도 자동화된 메커니즘이 필요할 듯싶다. 오고 가는 게 있어야 하니 가장 가까운 두 개의 노드를 잇는 걸로 해야겠다. 그렇게 하고 나머지는 수동으로 조절하면 될 듯싶다.
음...
연결하는 거는 좀 복잡하고 선택의 문제가 좀 들어가기 때문에. 일단 최소 길 막대 두 개씩 주고 수동으로 연결해야겠다. 연결된 노드들을 담는것만 자동으로 해야 겠다. 그리고 연결 노드 리스트에 최소 두 개가 들어가 있는지 체크하는 것만 만들면 될 듯싶다.
오브젝트들은 블렌더로 만들어야겠다. 이동하고 이동하면서 색 변하고 완료된 건 색 변하는 것까지 해서 만들고 난 다음에 다시 블렌더로 작업하러 가야겠다. 실재로는 3D 오브젝트인데 카메라를 고정해서 2D처럼 보이게 하면 될 듯싶다. 상황에 따라서 회전시켜 3D로 만들 수도 있고 말이다. 이건 나중에 천천히 고려해 보도록 하자.
잠깐만 에셋이 있는 듯싶다. 일단 만들기 시작했느니 그냥 만들어야겠다.
각 노드에 막대기를 십자로 일단 2개씩 주기로 하자.
일단 빈 게임 오브젝트에 몰아넣고 여기에 들어있는 트랜스폼을 추출해서 리스트에 넣은 다음에 프렌스 폼 포지션에다가 가로로 하나 세로로 하나씩 막대를 주고 부족한 걸 고려해서 여분으로 한 10개 정도 한쪽에 몰아서 주면 가져와서 배치를 할 수 있을 듯싶다. 그러려면 프리팹화한 길 게임 오브젝트가 있어야 할 듯싶다.
담아준다. 이게 배치만 하면 될 듯싶다.
그냥 프리 펩을 하나 만들어서 돌리면 될 듯싶다. 이제 수동 배치를 하면 될듯 싶다. 연결된 노드를 알아내는 것은 자동화 해야 할 듯싶다. 단순 반복적인 거니 말이다. 연결된 노드를 만드는거까지만 하고 다시 블렌더로 가서 위에 나온 아이콘들을 만드는 걸 해야 할듯 싶다. 일단은 표절 소리 듣더라도 같은 아이콘으로 만들고 나중에 여유가 생길때 디자인을 고민해 봐야 겠다. 보급은 음식에서 상자로 바꿔도 될듯 싶다. 보급은 식량하고 물자를 하나로 합치고 사기라는 전투 피도로를 따로 만들어야 할듯 싶다.
그럭저럭 구색이 맞춰지는 듯싶다.
3D로 하면 오히려 전략을 짜는 게 더 복잡한 거 같다. 약간 수학적인 걸로 전략을 짜야하는데 이렇게 조망하면 머리가 잘 안 돌아가는 듯싶다. 2D로 하자.
일단 노드에 어떤 로드가 연결되어 있는지 감지하는 게 우선이다. 그리고 돌아간 각도와 길이를 알아내서 그 방향으로 레이 케스트 틀 쏴서 노드를 검출한 뒤에 그걸 연결된 노드로 잡으면 될 듯싶다. 아 그리고 확인 작업이 필요하니까 각 클론들에게 1번부터 이름을 붙여야겠다. 일단 지우고 그런 작업이 있었으니까 처음에는 클론으로 만들어지게 해야 할 듯싶다. 이름을 붙이는 것도 노가 다니까 이것도 자동화를 해야겠다.
각 노드의 특성을 설정해 주는 것은 수동으로 한다. 수동으로 설정해 놓으면 그걸 만들어 놓은 3D 오브젝트로 변환하는 건은 역시나 자동화를 해야겠다. 먼가 진도가 쓱쓱 나가는 느낌이다.
문제는 지금 접하고 있는 오브젝트를 검출에 내는 게 필요한데 충돌 판정 말고 있는 걸 판별하는 함수가 있나 모르겠다. 없으면 레이 케스트를 8발방향으로 쏴서 검출할수도 있긴하다. 일단 알아보고 없으면 레이케스트를 8방향으로 쏘도록 하자.
위에 길을 꼬물꼬물 하는 걸 넣으려면 베이스의 경우에 넓혀 놓는 게 좋을 듯싶다.
using System;
using System.Collections.Generic;
using UnityEngine;
namespace NodeMap
{
public class MakingRoads : MonoBehaviour
{
[SerializeField] private GameObject roadObject;
[SerializeField] private Transform roadManager;
public List<Transform> nodeList;
[ContextMenu ("Set Road on the Nodes")]
private void SetRoadOnNodes()
{
if ((roadObject == null) || (roadManager == null)) return;
nodeList = new List<Transform>List <Transform>();
var nodeCount = transform.childCount;
for (int i = 0; i < nodeCount; i++)
{
var road = transform.GetChild(i);
nodeList.Add(road);
var position = road.position;
Instantiate (roadObject, position , Quaternion.identity,Quaternion.identity, roadManager);
Instantiate (roadObject, position , Quaternion.Euler(0,Quaternion.Euler(0, 90, 0), roadManager);
}
}
}
}
다음 작품은 팀짜서 해야겠다. 일단 돈을 좀 벌어서 사무실도 구하고 말이다.
null check도 추가해 준다. 가끔 실행이 안 되는 경우도 있어서 말이다.
나중에 수정해서 노드와 로드를 만든 걸 반영할 필요가 있다.
거의 모든 코딩은 리스트와 리스트를 반복문으로 돌리는 일을 기본으로 하는 듯싶다.
이게 잘 구현이 안 되는 기능은 일하기가 싫어지는 거 같다. 쉬운 건 금방 일을 하고 싶어 지는데 말이다. 이거까지만 하고 빨리 아이콘 만들러 가야 되는데 말이다.
일단 연결된 로드를 가져오는 걸 만들어야 한다. 피직스의 체크 박스 같은 걸로 만들 수 있는지 해보고 안되면 레이 케스트를 써봐야겠다. 이스 트리거를 켜야 되는지 아닌지도 했갈린다.
일단 눌리면 넣지 않고 이게 맞게 넣어졌는지 확인할 수 있도록 각각 번호를 붙여야 할 듯싶다.
노드뿐만 아니라 로드도 이런 식으로 만들면 될 듯싶다. 단순 반복적인 거는 자동화하니까 한결 편하다.
공무원 준비를 관두게 된 게 R이나 파이썬으로 자료해석을 자동화 할수 있다는 걸 알게 된게 크다. 5급 공무원의 경우에는 표를 주고 수치가 보다 큰지 작은지 같은걸 묻는 게 있는데 엄청나게 대량의 표도 R을 쓰면 순식간에 자동화해서 낼수있는걸 인간이 일일히 암산해서 빠르게 처리하는걸 묻더라. 무슨 통계학 지식을 묻는게 아니라 기계가 더 잘할 수 있는걸 말이다.
대규모 정규전이 아니라 특수전을 담당한다고 해야 할 듯싶다. 침투 입무나 장비 탈취나 요인 구출 같은 임무 말이다. 제공권이 확보가 안되면 헬기를 보내서 강습하는 게 불가능 한데 주로 그런 곳에 파견을 나간다고 보면 될 듯싶다. 지상으로 부터 침투를 해야 하는것 말이다.
로드를 담았으니 노드까지 담는 걸 만들면 될듯 싶다. 먼가 잘 풀리는 듯싶다. 저번에 안됬던 게 코드를 잘못 짜서 그런 듯싶다.
각 로드의 길이가 다르니까 x를 채취하고 돌아간 각도를 추출해서 레이 케스트를 쏴서 노드를 검출해서 리스트에 넣으면 될 듯싶다. 이맵만드는 거 끝나면 콜라보 캐릭터들을 만들어야 한다.
4가지 세력 중에 외세를 선택해서 나라를 팔아먹을 수도 있는 게임이지만 게임 분위기는 약간 병맛으로 갈 생각이다. 너무 사실적으로 묘사하면서 나라를 팔아먹고 민족을 배신하는 게 문제가 될 수 있기 때문이다. 독재를 다루는 트라피코 같은 느낌으로 가는 거다.
스팀 웍스를 읽고 있는데 세금은 적당한 듯싶다. 문제는 역시나 심의비일 듯싶다. 아 그리고 세율이 높은 나라는 좀 더 비싸게 팔고 세율이 낮은 나라는 좀더 낮게 가격을 책정해야 할 듯싶다.
음 멀 잘못했는지 모르겠는데 안된다.
아무것도 검출을 못했고 그나마 검출한 게 바닥이다.
방법을 바꿔서 노드 리스트를 검색해서 본인을 제외하고 그 로드가 연결된 리스트에 있는 걸 담으면 될 듯싶다. 이거 이거 생각보다 난 머리가 잘 돌아가는 듯싶다.
됐다.
이제 아이콘을 만들러 가야겠다.
'턴제제작' 카테고리의 다른 글
3D to 2D [영상] (0) | 2019.11.16 |
---|---|
할당 시스템 (0) | 2019.11.16 |
노드맵 시행착오 (0) | 2019.11.07 |
메뉴 만들기 (0) | 2019.11.07 |
게임 세계관 고민 (2) | 2019.10.26 |
WRITTEN BY