유니티 34

유니티 - JsonUtility로 Queue 저장하기

게임을 할 때 최근 기록을 10개를 저장하고자 할 때 10개가 꽉차면 가장 먼저 있던 데이터가 빠져나가야한다. 이를 위해선 Queue(큐)가 가장 적절한 구조라 할 수 있다. 하지만 문제는 JsonUtility에선 Queue 가 저장이 안된다. 그렇다면 어찌해야하는가? 유니티 상에서는 큐로 데이터를 관리하다가 Json으로 직렬화하기 전에 List로 바꾸고List를 직렬화 후에 파일로 로컬에 저장을 한다. 일단 큐에 저장할 때 10개의 기록이 다 차있다면 맨 앞의 원소를 빼는 Dequeue를 하고 새로운 데이터를 Enqueue를 해야한다.  그것이 위의 코드이다. 조건에 맞게 큐에 원소를 저장할 수 있는 함수를 넣어두고 큐 -> 리스트 간단하다 ToList() 함수를 이용하면된다. 리스트로 만들면 이를 직..

유니티 2024.06.07

유니티 - 직렬화와 역질렬화 (총편집)

지난 번에 짤막하게 다뤄봤으나 프로젝트를 위해선 제이슨 공부가 더 필요하기에 좀 더 자세히 다뤄보고자 한다. 코드를 작성 시에 값들은 메모리에 흩어져서 산재하고 있는데 흩어져있는 메모리 상의 존재하는 값들을 뽑아서 정리해서 나열하는 것을 직렬화라한다. 과거엔 바이트배열로 만드는 것을 의미했으나 시간이 갈수록 더 넓은 범위로 직렬화를 쓰면서 바이트 배열만 해당되는 것은 아니다. 반대로 정리해둔 값들을 가지고 다시 프로그램이 시작될 때 메모리에 적절한 값을 집어넣어 세팅하는 것을 역직렬화라 한다. 직렬화 흩어져있는 메모리 상의 존재하는 값들을 뽑아서 정리해서 나열하는 것 역직렬화 직렬화된 값들을 가지고 다시 프로그램이 시작될 때 메모리에 적절한 값을 집어넣어 세팅하는 것 단순히 말하자면 정보는 나열하는 것이..

유니티 2024.06.04

유니티 - lerp와 slerp

lerp나 slerp나 결국 보간법이라 두 점을 잇는 방법을 얘기하는 것인데 lerp, slerp 둘다 인자의 의미는 같다. lerp(From, To, Rate)로 From은 출발지, To는 목적지로 생각하면 되고 Rate는 비율로 생각하면 된다. 비율은 [0, 1] 사이의 수로 나타내며 0이 0%, 1이 100%로 0.1은 10%, 0.5는 50%로 이해하면 된다. 그래서 0.4(40%)의 비율은  무엇을 의미하는걸까?lerp(A, B, 0.4f) 를 살펴보자 A를 출발점, B를 도착점으로 봤을때 40퍼센트까지 왔다는 것을 의미한다. (즉 도착까지 60퍼가 남은 거다) lerp의 경우 선형보간이기 때문에 위와 같이 직선으로 출발점, 도착점을 잇고 비율에 따라 위치를 정해주면 된다. 반면 slerp은 구..

유니티 2024.06.03

유니티 - 2D Sprite를 이용한 체력바(게이지바) 구현하기

2D Sprite를 활용하여 체력바(게이지바)를 간단하게 구현하는 방법이 있다.만일 3D 프로젝트라 2D Sprite가 없는 경우엔 패키지에서 설치하도록 하자 먼저 패키지 매니저에서 2D Sprite를 설치한다. 프로젝트 뷰에서 2D - Sprites - Square 생성 UI - Image 로 체력바가 들어갈 이미지를 만듬  만든 Square Sprites를 이미지의 Source Image에 넣어준다. 체력바를 만들것이니 색상을 빨간 색으로 해두면  체력바를 만들 수 있다.  이는 이미지 컴포넌트의 Fill Amount가 1일 때의 모습이다.  만일 Fill Amount가 0이 되면  빈 게이지가 만들어진다. 이 Fill Amount 값을 조절하여 게이지를 구현할 수가 있게 된다. Fill Amount..

유니티 2024.05.30

Unassigned/Null Reference Exception 해결법

오늘 공부를 하면서 정말 Unassigned와 Null 관련 오류로 많은 곤혹을 치룬 하루였다. Unassigned Reference Exception 먼저 Unassigned의 사례를 보자 UIInventory 스크립트의 inventoryWindow 변수에 값이 할당되지 않았다고 한다. 고로 인스팩터 창에서 할당해주라는 메세지이다.그러면 할당을 해주면 그만인데... 문제는 인스팩터 창에서 분명히 게임 오브젝트를 넣어줬다는 사실이다. 그러면 대체 왜 이런 에러가 발생한걸까? 그 이유는 황당하게도...  전혀 UI와 상관없는 나무 게임오브젝트에 UI Inventory가 부착되어있던 것이다...실수로 스크립트를 추가한 것으로 보인다..  만일 이와 같은 실수를 한 거로 의심될 때 많은 게임오브젝트가 있을 때..

유니티 2024.05.29

유니티 - 대체 인터페이스를 왜 쓰는걸까?

인터페이스라 하면 공통적인 동작을 정의해 두는 것이고 추상화가 가능하고 다중 상속이 가능하고 상속 시 반드시 구현해야한다는 강제성을 가지고 있다. 사실 이렇게만 들으면 대체 왜 쓰는 지 감이 잡히질 않는다. 객체지향적인 코드를 짜려면 우리는 클래스 간의 의존도를 낮춰 결합도를 낮춰야한다. 클래스 간의 의존도가 높게 되면 다른 사람이 어떤 클래스를 수정시에 내가 만든 클래스를 수정하게 될 수도 있다. 즉 다른 하나를 수정하면 남이 만든 다른 클래스도 건들일 수 있다는 것이다. 그렇기에 결합도는 낮추고 코드 내의 응집도를 높여야 한다는 것이다. 응집도를 높이려면 코드 내의 기능들이 그 코드안에서 수행되고 끝날 수 있도록 해줘야한다. 그렇기에 구체적인 클래스를 상속받는 것이 아닌 기능 별로 쪼갠 인터페이스를 ..

유니티 2024.05.28

유니티 -절차적 Skybox 만들기

Assets폴더에 Materials 폴더를 만들고 Skybox 이름의 Material을 생성 쉐이더를 Skybox/Procedural로 변경, Procedural은 절차적이라는 의미이다. 이제 머테리얼을 적용시켜보자  Window - Rendering - Lighting   Environment의 Skybox Material에 아까 만든 Skybox를 넣어 머테리얼을 적용시킴  머테리얼 값을 조절하면서 원하는 Skybox를 만들어보자 해의 크기, 하늘과 땅의 색을 변경해줄 수 있으며Exposure(노출) 값이 커질 수록 쨍한 느낌을 준다.  스카이박스를 설정해준 모습 절차적 스카이박스의 속성에 대한 자세한 정보는 https://docs.unity3d.com/kr/2019.4/Manual/shader-sk..

유니티 2024.05.27

유니티 - 애니메이션

Animation2D Sprite Animation은 이미지를 빠르게 전환시켜 움직이는 거처럼 보이게함, 프레임수가 낮으면 끊겨보일 수 있어 어느정도 프레임을 만들어줘야함2D Bone Animation이나 3D 애니메이션은 스프라이트 방식은 바로바로 바뀐다면 얘는 중간에 보간처리를 하게된다. 그렇기에 스프라이트 방식보단 부드러워보인다. Animation Component간단한 애니메이션에 쓰긴하지만 Animator 컴포넌트를 주로 쓰게 된다. 간단한 상황이 없다시피함... Animator아무것도 안하는 Idle 상태, 뛰는 Run상태 공격하는 Attack 상태 등 애니메이션엔 상태들이 있다. 애니메이터에선 그러한 상태를 정의할 수 있고 상태 간에 왔다갔다 하는 전이(transition)을 정의를 할 수가..

유니티 2024.05.24

유니티 아크탄젠트(Atan2)에 대하여

*해당 포스팅은 스파르타코딩클럽의 강의를 기반으로 작성했습니다* 먼저 아크탄젠트에 대해 알아보기 전에 삼각함수에 대해 알아볼 필요성이 있다.우리가 흔히 알고 있는 공식이다. 삼각함수는 각도를 통해 삼각형들의 변들 간의 비율을 알아낼 수 있는 함수이다. 여기서 우리가 주목해야할 것은 탄젠트이다. 탄젠트의 경우엔 밑변 분의 높이의 값을 가지고 있는데 밑변을 X 값, 높이를 Y 값으로 볼 수도 있다. 그렇게 본다면 탄젠트는 비율이 아닌 좌표로 나타낼 수 있게 된다. 각도를 통해 좌표를 알아낼 수 있다는 것이고 이를 역으로 생각해보면 좌표를 통해 각도 역시 알 수가 있게 된다. 이는 거꾸로 했다하여 탄젠트의 역함수인 arctangent 가 된다. 다시 말하자면 각도를 통해 비율을 구하는 것이 삼각함수이며 이를 ..

유니티 2024.05.13