2023년 12월 28일 목요일

Unity - 3인칭 캐릭터 이동

 


3D 캐릭터가 3인칭 기준으로 이동하는 방법을 알아보자 




먼저 카메라 회전으로 마우스 움직임이 있을 경우, 

Clamp함수로 최대 최소 각도를 정하여 회전을 제한 하고

Lerp함수로 카메라의 움직임을 부드럽게 만들어준다.

(rotation = newRot 해도 상관없음)




그리고 3인칭 카메라를 아무 오브젝트의 자식으로 만들고 최상위 transform.position을

카메라를 따라가게 하고 싶은 오브젝트의 Position으로 덮어버리면 된다.




캐릭터를 이동시킬때 좌우나 앞뒤 버튼을 동시에 눌렀을 때

안움직이게 해놓고 누른 방향키대로 어느 방향으로 가야하는지

처리하기 쉽게 방향벡터를 생성해준다.




나아가려는 방향을 카메라가 보고있는 rotation Y의 각도만큼 회전시켜서
카메라 기준으로 움직이게 한다.
캐릭터도 마찬가지로 해당 방향으로 바라보게 회전시킨다.



어떤 방향키라도 눌렀을 경우 캐릭터 상태를 Walk로 변경하고
애니메이션의 트리거를 사용하여 캐릭터를 걷는 모션으로 전환한다.










2023년 12월 27일 수요일

Unity - Fbx 모델 적용법

 



에셋스토어에서 임포트하면 모델, 애니메이션, 사운드 

전부 딸깍 한번에 가져와지는데

에셋 스토어에 없는 외부 3D 모델 파일을 가져올 땐

 텍스쳐와 Material, 애니메이션 등 처리해야 하는 문제가 생긴다.







먼저 사이트에 들어가서 아무 애니메이션이 담긴 모델을 가져온다.

선택한 애니메이션이 이동한다면, 옆쪽에 잇는 In Place를 체크하여 위치를 고정시킨다.




사이트가 문제인건지 FBX가 원래 그런건지 모르겠지만
파일 하나에 애니메이션 하나밖에 못 담는다.
그래서 모델파일 따로 애니메이션 따로 가져오기 위해
With Skin에서 애니메이션들은 None Skin으로 다운받아서 유니티에 가져온다.






처음 가져온 상태로 Scene에 집어넣으면 석고마냥
텍스처가 없는걸 볼 수 있다. 




일단 가져온 파일의 최상위를 선택하면 Inspecter에 여러 세팅이 보이는데

그 중 Rig라는 탭에서 애니메이션 타입을 휴머노이드로 바꿔준다.









다음 Material 탭에서 Extract Textures 버튼으로 텍스처를 빼준다.




그럼 잘 적용되어 있는 모습을 볼 수 있다.






애니메이션까지 적용하려면 파일 안쪽에 내장되어있는 애니메이션이나
따로 다운받은 애니메이션 파일 안에 애니메이션 클립이 있는데



이를 씬에 있는 모델에 끌어다 놓으면 컨트롤러가 알아서 생긴다. 



이제 다른 애니메이션들도 추가하여 디버깅해보자 



+애니메이션이 바뀔 때 마다 위치가 어딘가로 움직인다면


Apply Root Motion 을 체크해제 하면 된다.







2023년 12월 18일 월요일

Unity TeamProject - Survival Game 2

 



게임 메인화면 구현,
제목과 시작버튼을 적당한 위치에 배치 후
배경요소는 게임에서 쓰였던 프리펩들을 끌어와 
스크립트와 AI 모든걸 빼서 장식품으로 사용함



게임의 자원이나 엔티티들은 terrain 위에 랜덤으로 스폰되는데,

주위에 다른 오브젝트가 있을 경우, 다른 위치를 찾아서 스폰된다.



인벤토리를 열어서 장착 가능한 아이템일 경우, 장착, 해제

버튼들이 나타나고 장착 버튼을 눌렀을 경우 플레이어 화면에서

장비를 들고 있는 모습을 볼 수 있다.



특정 도구로 특정 레이어의 자원을 때릴 경우, 자원에게 데미지를 줄 수 있으며

오브젝트가 부셔지면 자원이 드랍된다.



드랍된 아이템을 바라보고 E버튼을 누르면 인벤토리 안에 들어가고
조합이나 건설을 통해 인벤토리 내 아이템들을 사용하여 행동을 할 수 있다.


건축 Ui를 열어 건설하고 싶은 오브젝트를 선택하여
재료를 확인하고, 재료가 충분할 경우 아이템을 소모하여 설치 가능



건물을 설치하기 전엔 반투명한 청사진 프리펩을 이용하여
어디에 설치 할건지 조정 가능하다.
마우스 휠을 돌리면 물체가 돌아가고, 바라보는 방향에 지형이나
충돌 가능한 물체가 있을 경우 그 위에 붙여서 설치 가능하게 해두었다.




설치한 건물은 그림자와 빛 영향을 받으며 Structure 태그를 부여하였음

건물 중에 모닥불과 작업대는 주변에 있을 경우, Collision Trigger을 사용하여

플레이어가 제작 가능 및 요리 가능한 상태로 만들기 위해 변수를 true로 변경한다.



요리한 음식을 사용 버튼을 눌러 플레이어의 허기 값을 채우고
허기가 음수가 되면 체력이 계속 떨어지게 된다.



모닥불의 트리거와 너무 가까워졌을 때, 플레이어는 초당 10의 데미지를 받는다.


체력이 없어졌을 때 게임 오버 화면

메인 메뉴 버튼을 누르면 시작 화면으로 넘어간다.








2023년 12월 15일 금요일

Unity TeamProject - Survival Game 1

 

https://www.figma.com/


이번 팀 과제에서는 피그마 사이트를 활용하여 회의를 진행했다.

회의에서 정한 프로젝트 주제는 서바이벌 게임으로 

발헤임이나 마크같이 건축과 자원캐기 등 생존에 필요한 기능들을 구현하고

게임 컨셉과 스토리, 이름, 등 부가적인 "재미" 요소를 구상하였음




필수 구현 요소를 통해 역할 배분을 적절히 하였고
이번에 내가 맡은 역할은 건축요소 이다.




개인 개발 작업 들어가기 전, 에셋과 폰트 같은 리소스들을 미리 임포트하여

메인에 머지하여 업로드 하였다.




오늘은 개발 시간이 적은 관계로 건축에 필요한 UI만 대충 틀만 잡아두고
다음에 구현할 내용들을 미리 메모만 하기로 함

건축할 때 건축하려는 위치에 곂치는 구조물이 있는지 체크하는 기능과
인벤토리에 재료가 없을 경우 건설하려는 레시피가 불투명한 색으로 보이는 기능
레시피를 클릭했을 경우, 해당 건축물의 이름과 설명을 출력하는 기능 정도


2023년 12월 13일 수요일

unity tutorial - Tilemap Rpg 2

 


메인 화면, 캐릭터 스탯창, 인벤토리 이렇게 세개가 필수 구현 요소이다.

하지만 큰 화면에 그렇게 따로 두는 방법이 맘에 들지 않아

일반 RPG 게임처럼 설계 해보기로 하였다. 





맵에 드롭 아이템을 떨군 후 충돌 체크로 해당 오브젝트의 정보를
가져오는 방식으로 인벤토리에 저장하는 방식을 구현하였다.




먹은 아이템은 인벤토리에 선언한 List에 저장되며
최대 스택개수와 동일한 아이템이 있는지 체크하여
잘 작동되게 하였다.


이렇게 동일한 아이템에 개수가 추가된다.



인벤토리 각 슬롯마다 Box Collider와 번호를 추가하여
클릭하였을 때 Ray충돌을 활용하여 어떤 슬롯이 눌렸는지
확인 할 수 있다. (버튼 쓰기 싫어서 이렇게 하였음)
+Box Collider 2D는 Ray충돌이 안돼는 문제가 있었음



우클릭 했을 경우 무기는 무기 슬롯에 장착하고 현재 인벤토리 리스트에서 

아이템을 하나 뺀다. 그리고 장착한 장비 아이템을 구별하기 위한 리스트를 

새로 만들어 그쪽에 하나 추가한다.




개수가 0이 된 아이템은 인벤 리스트에 아이템을 넣고 빼는 함수를 호출할 때 마다

전체 리스트를 탐색하여 스택개수가 0인 요소를 찾아서 리스트에서 빼버린다.




아이템 이미지는 임시로 쓴거라 일단 무기랑 방어구이다.

장비한 아이템의 능력치를 반영하여 스탯창도 최신화 시킬 수 있게 하였다.





아이템 코드와 분류 등 아이템에 대한 모든 정보는 ScriptableObject로 저장하여

아이템을 빠르게 불러오거나 전달할 수 있게 하였다.

(가끔 디버깅하다 보면 저장된 정보들이 날라가는 오류가 있음)




인벤토리, 캐릭터 스탯 등 각 플레이어에 대한 정보는 프리펩 한 아바타 안에 넣어서

싱글톤 했던 스크립트에서 갖고 있게 하였다. (다른 스크립트에서 접근할 수 있게)


2023년 12월 11일 월요일

Unity - OnPointerClick



Unity - Scripting API: IPointerClickHandler (unity3d.com)

Raycast는 마우스 클릭만 된다는데 요거는 마우스랑 터치 둘다 된다고 함

unity tutorial - Tilemap RPG 1

 



요구사항을 충족하며 Tilemap을 사용한
픽셀 RPG 게임 틀을 잡아보려고 한다.



저번에 만들어둔 타일맵 예제를 가져와 이번 프로젝트에 적용하였다.




다른 프로젝트에 지금까지 만든 프리펩, 스크립트, 씬 등 여러 옮기고 싶을 땐

Assets->Export 로 .unity파일을 배포하여 다른 프로젝트로 넘어가서

Import Package 해주면 된다.






캐릭터 스탯 변수에서 최대치를 지정하기 위해 Range로 최소 최대값을 고정해두고

나중에 아이템이나 버프 아이템을 먹었을 경우 스탯이 이를 초과하지 않게 방지해뒀다.

+Serializable(직렬화)로 선언하면 awake나 start가 없어도

 Inspecter창에서 변수를 초기화 가능





CameraFollow 스크립트에는 카메라 포지션을 플레이어 캐릭터의 포지션을 가져와
해당 지점으로 지정된 속도만큼 천천히 가까워지도록 만들어 게임같은 느낌을 냈다.



체력바는 아직 쓸 일 없지만
나중에 몬스터 추가할 수 도 있어서 그냥 미리 넣어놨다.

아무튼 오늘은 여기까지 마무리 된 작업들만 기록하고 내일 완성시킬 예정이다.



c++ thread.h

 c++에서 쓰레드 돌릴려면 thread.h 헤더를 쓰면 되는데 이 친구는 쓰레드가 아직 실행 중인지, 아니면 강제 종료하거나 하는 함수가 없어서 조금 아쉬운 애다. std::thread 는 로컬 변수로 선언하든 new 동적 할당을 하든 start 함...