본문 바로가기

분류 전체보기

[03] 인벤토리 기능 인벤토리에는 무슨 기능이 있어야 할까? 그걸 떠올리기 위해 특정 상황을 생각해보자. 가장 먼저 흔한 상황은 아이템을 획득하는 상황이다. 아이템을 획득하면, 인벤토리의 빈 슬롯에 아이템이 들어가서 자리잡게 된다. 그렇다면 인벤토리는 슬롯이 비어있는지 확인하는 기능이 필요할 것이고, 슬롯에 아이템을 추가하는 기능이 필요하다. 그러니 가장 먼저 떠오르는 인벤토리의 기능으로는 두가지가 있다. 1. 슬롯이 비어있는지 확인 2. 슬롯에 아이템을 추가. 슬롯이 비어있는지 확인하는 것은 간단하다. 우리는 인벤토리를 List으로 구성했으므로, 인벤토리 길이만큼 돌면서 슬롯에 있는 아이템의 ID를 확인해보면 된다. 이렇게 하면 비어있는 것 말고도 특정 아이템이 있는지, 있다면 어느 위치에 있는지에 대한 정보를 알 수 있다.. 더보기
[02] 아이템 슬롯 우선 프리팹을 Resources 폴더에 넣어서, 아이템 ID를 통해 생성하는 것으로 하자. 최근 유니티는 큰 게임 개발에서 Addressable Asset System인가로 Resource 매니저를 대신한다는데, 게임이 그렇게 커질 것 같지는 않으므로 작게 들어가겠다. public void DropItemToField(int id) { //ID 받아와서 필드 내에 prefab 드롭함 if(id == 0) { Debug.Log("그런 아이템은 없다."); return; } else { string itemPrefabFile = $"{itemPrefabPath}{id.ToString()}"; GameObject itemPrefab = Resources.Load(itemPrefabFile) as GameObj.. 더보기
[01] 아이템 데이터베이스 팀 프로젝트에서 아이템 - 인벤토리 관련을 만드는 역할을 맡았다. 우선 순서는 아이템을 다른 사람이 편하게 추가할 수 있는 DB를 만드는 것. .csv파일을 아이템 데이터베이스로 활용하여 다른 팀원들이 쉽게 수정할 수 있도록 만들어보자. .csv파일은 여러가지로 만들 수 있지만, 역시 가장 편한것은 엑셀과 메모장이라고 생각한다. 간단하게 확인할 때는 메모장으로, 작성할 때는 엑셀로 쓰는 것이 편하다. 임시로 몇가지 아이템을 만들어서 .csv 파일로 저장해보자. 인코딩은 UTF-8을 사용할 것이다. 엑셀의 첫 번째(열 이름) 행에는 분류가 들어가고, 각각 ID에 의해 지정될 것이다. 그 뒤에는 아이템의 특성들이 나열되어있다. 작성한 이후 유니티의 Asset-Resources 폴더에 넣어주자. ※ 폴더 이름.. 더보기
[11] Battle Scene 턴 페이즈에서 사용할 TMP-Button들. 각 기능은 아직 만들지 않았다. 우선은 버튼만 만들고, 나중에 배치하자. 그 다음은 덱과 핸드, 사용할 Hand[0]의 카드 위치를 지정해놓자. 또, 카드들의 숫자와 이미지(Sprite)를 [CreateAssetMenu(fileName = "NewCardData")], ScriptableObject를 통해 데이터베이스처럼 만들어준다. 헷갈린 부분. Class 전체를 에디터에서 입력할 수 있게 받아오려면 SerializeField가 아니라 Serializable로 선언해야한다. [Serializable] 특성은 인스턴스를 직렬화하는 기능으로, MonoBehaviour로 선언한 클래스를 에디터에서 값을 수정할 수 있는 것처럼 아래 인스턴스 변수에 접근할 수 있게 .. 더보기
[10] 게임 구조 설계 겸 튜토리얼 장면 만들기 서버 제작이 잠시 보류된 상태니, 혼자서도 플레이 할 수 있도록 게임 구조를 만들어보자. 어차피 튜토리얼때문에 만들어야 한다. 우선, 게임은 게임 - 라운드 - 턴의 순서로 포함되어있다. 게임이 시작하면 사용할 덱과 카드들을 나눈다. 라운드가 시작하면 이번 라운드에 사용할 카드를 뽑는다. 이 카드가 사용이 끝나면 다음 카드를 뽑고 다음 라운드가 된다. 턴은 한 라운드에서 행동하는 사람이 바뀔 때마다(배팅을 진행할 때마다) 변화한다. 라운드마다 턴은 초기화된다. 그러니 우선적으로 필요한 함수는 게임 시작, 라운드 시작, 턴 교체에 대한 함수다. 이 셋을 만들어놓자. 게임 시작 public void StartGame() { InitGame(); } //게임 시작 전 초기화, 덱과 카드, 칩과 배팅 등을 초기.. 더보기
Rokoko 조작 직접 모션캡처 슈트를 입고, Rokoko Studio를 사용해서 애니메이션 클립.fbx를 잔뜩 찍었다.(슈트의 착용감은 별로) 여러가지 동작을 녹화한 이후, 우측 상단의 Exports를 통해 fbx 파일을 만든다. 또, 이렇게는 동작만 가져온 셈이 되므로, 움직일 캐릭터가 있어야한다. 위의 캐릭터를 사용해 진행하자. 다운받은 링크는 위와 같다. ※ Rokoko Studio에서도 캐릭터 모델링을 불러와서 진행할 수는 있지만, 유료버전에서만 사용 가능한 기능이므로 유니티에서 두 파일을 Import하여 실행한다. 애니메이션 클립 파일과 모델링.fbx파일을 모두 가져온 이후 해야하는 것은 Rig에서 Humanoid로 변경해주는 것. 이걸 해야 인간형태로 찍은 뼈대와 연동할 수 있다. 그 이후는 아바타 컨트롤러를.. 더보기
[09] Coroutine과 Thread의 차이점 (공부 후 재작성) [08]에서 코루틴을 통해 비동기적 메소드로 서버를 돌리려고 시도했지만, 이런 저런 이유들로 안됐다. 결국은 Accept -> BeginAccept로 가는 방식을 사용해서 해결하기로 마음먹었지만, 의문이 생겼다. Coroutine도, Thread도 비동기적으로 실행되는 것처럼 보이는데, 왜 둘은 다른가? -> 둘 다 동시 실행처럼 보이지만, 사실 Coroutine는 스케쥴링(순서 알잘딱)에 의한 지연실행에 불과하기 때문. 매 프레임을 기준으로 코루틴을 확인하는 과정을 해줄 뿐이다. 그래서 만약 코루틴의 과정에 문제가 생긴다면, 메인 동작도 영향을 받는다.(결국은 순차적 실행이기 때문에, 앞의 작업이 완료되지 않으면 뒤로 가지 못한다.) -> 참고자료 https://planek.tistory.com/36 .. 더보기
[08] UI와 Scene, 스크립트 정리 + 서버 의문 게임을 플레이 할 방을 들어가는 것까지의 게임 구조도를 정리해보았다. 현재 구현된 것은 Loading에서 Home으로 가는 것, 종료, 서버 접속까지이다. 기존에 만들어놓은 Scene과 기능들이 따로 놀고 있는 느낌이 있어, 위의 구조도를 기반으로 재정렬하자. Loading에서 플레이어의 데이터를 검사하고, 없다면 새로운 계정을 생성한다. 이 과정은 데이터베이스가 만들어지고 나서 구현할 문제이므로, 일단은 플레이할 때마다 임시 프로필을 부여받아 Home에 접속하는 것으로 하자. 그 이후 Home에서 서버 접속을 시도한다. 처음 로딩 화면이다. 지금은 다음 Scene을 로딩하는 기능밖에 없지만, 나중에 플레이어의 데이터를 불러오고, 데이터가 없다면 플레이어 데이터를 새로 생성하는 장면이다. 그 다음은 Ho.. 더보기