목록GameEngine/UnityEngine (14)
방프리

이전 연습 프로젝트를 통해 대략 AI를 만드는 방법과 UI 배치 방법에 대해 조금 익숙해졌다. 그래서 이번에는 습작 겸 타이쿤 비슷한 게임을 제작해보기로 했다. 기초적인 플레이어 컨트롤을 만든 후 다른 캐릭터들은 AI가 움직이도록 만들었다. 기존의 switch 방식은 내가 짜면서도 로직이 가끔 헷갈릴 때도 있었고, 무엇보다도 관리가 너무 힘들었다. 그래서 이번에는 방식을 조금 바꿔보기로 했다. 위와 같이 상태에 관련된 클래스들을 따로 만들고 interface인 State를 상속받게 하였다. 그리고 모든 상태들은 StateMachine이 관리하고 각 캐릭터 객체들은 하나의 StateMachine을 가지며 이 StateMachine을 통해 상태가 바뀌는 행동을 할 수 있다. Programming Game A..

https://learn.unity.com/tutorial/update-and-fixedupdate#5c8a4242edbc2a001f47cd63 Update and FixedUpdate - Unity Learn How to effect changes every frame with the Update and FixedUpdate functions, and their differences. This tutorial is included in the Beginner Scripting project. Previous: Awake and Start Next: Vector Maths learn.unity.com 포트폴리오 제작 도중 Ray나 충돌 관련 부분은 FixedUpdate에서 처리하는 것이 좋다고해서 도대체..

몬스터가 행동하는 목록을 enum으로 정리해서 switch문으로 만들어보려고 한다. AI는 코루틴을 통해서 실행하도록 했다. 1순위 행동 : 죽음 서있기 -> 죽음, 추격, 순찰 공격 -> 죽음, 돌아가기 추격 -> 죽음, 공격, 돌아가기 순찰 ->죽음, 돌아가기, 추격 돌아가기 -> 죽음, 추격, 서있기 우선순위 행동으로 변할 때에는 바로 빠져나갈 수 있도록 했다. 서있는 행동에서 순찰 모드로 돌아갈 때 잠시 행동을 멈추기 위해 Invoke 함수를 사용했다.

오늘은 데이터 차트와 대화하는 걸 구현해보았다. 언리얼 엔진을 공부할 때 csv로 구현하는 걸 보고 유니티도 csv로 로딩해보고 싶어 찾아서 적용해보았지만.... 뭐가 문제인지 계속 out of range 오류를 띄운다. 결국 XML로 읽는 방법을 채택... LoadDataBase라는 모든 데이터 시트를 저장하는 클래스를 만든 후 XML 파일을 읽고 Dictionary에 저장하는 코드를 넣었다. 맨 처음에는 이걸 DialogueManager에 데이터 로드를 넣었으나.... 로딩 때 한 번에 데이터를 부르는게 더욱 좋을 것 같아 옮겼다. 대화가 진행 중일 땐 플레이어 컨트롤러를 멈추는게 좋을 것 같아 isAction을 통해 플레이어 움직임을 막았다. 나중에 일시 정지 같은 기능에 이용하면 좋을 것 같다. ..

어제는 이동을 하는 것을 구현했으니 오늘은 공격하는 것을 구현할 것이다. 플레이어 행동 관계를 간단하게 정리하면 공격 모션 -> 죽는 걸 제외하고 모든 상태에서 전환 가능 달리기 모션 -> 죽음, 공격 모션을 제외한 모든 상태에서 전환 가능 그 전에 애니메이션 전환하는 코드가 너무 많아서 한 번 정리하기로 했다. 공격 판정에 대해서는 Animation에 있는 AddEvent를 사용해서 추가했다. 이로써 프레임당 공격 판정이 가능하게 되었다. 이제 Mapmanager를 구현해 이동 범위를 제한하도록 구현했다. 구조체로 최소, 최대값 데이터를 넣을 수 있는 Point를 만든 후 List를 통해 저장했다. enum을 통해 맵의 번호대로 최소, 최대값을 설정할 수 있도록 지정하였다. 플레이어 위치를 제한한 데이..

캐릭터 에셋은 유니티 에셋 스토어에 있는 이 에셋을 사용하였다. 에셋을 Import한 후 애니메이터로 보면 미리 이렇게 설정이 되어 있다. 값을 확인해보면 AnimState의 값에 따라 애니메이션이 이동하는 걸 볼 수 있다. 다른 사람들은 "Horizontal", "Vertical"에 있는 값을 통해 입력 값을 받는 코드를 많이 사용하지만 내 프로젝트의 경우 가는 방향으로 회전해야하기 때문에 키보드 입력을 받는 식으로 제작하였다. 캐릭터의 Transform 위치를 옮기는 것 보다는 Rigid를 옮기는 방식으로 구현하는 것이 최적화에 도움이 된다고 한다. 카메라의 경우 캐릭터가 이동할 때마다 어느 적정 거리를 유지하고, 맵의 끝자락에 도착했을 때 더 이상 움직이지 않도록 설정한다. 맵의 끝에 대한 설정을 ..