내가 유니티를 이용하여 처음으로 인벤토리를 만들 때는 사각형 모양의 틀을 하나만들어서 위치를 하나하나 알맞게 조정하고 x, y값을 항시 살펴보며 작업했다. 그러다 문득 떠오른 생각이 자동으로 위치값을 맞춰주는 편리한 기능이 없을까 의문이 들었다. 시간이 지난 후 찾아보니 정말 있었기에 이 부분에 대해서 설명하고자 한다. Grid Layout이란? 자식 레이아웃 요소를 격자무늬로 위치 시키는 것이다. 이런식으로 Grid Layout틀을 만들어주고 자식요소에 Image파일을 넣어 복사한다면 격자무늬 형식으로 나타난다. 오른쪽 테두리를 넘어서면 아래쪽 첫번 째부터 다시 그려진다. 사용법 우선 나는 이미지를 Grid라는 이름으로 만들었다. 이미지 컬러의 알파 값을 0으로 설정한 뒤 투명한 색의 일정한 틀을 만들..
TIL
오늘은 캐릭터의 제어를 담당하는 클래스를 상속받는 키의 입력 제어 클래스를 만들었다. 하지만 부모의 Awake를 호출해야하는 상황이 왔는데 override 라는 개념은 알았지만 정확히 어떻게 사용해야할지 몰랐다. 그래서 이 부분에 대하여 개념을 살펴보고자 한다. 부모 클래스 Awake의 호출을 못하는 상황 현재 부모의 클래스를 상속받은 PlayerInputController 클래스가 있다. Awake에 내가 사용하고 싶은 기능들을 넣고 실행을 하면 뭔가 둘다 호출이 되면서 잘될 것같다. 하지만 상속을 받은 자식클래스에서만 Awake가 호출이되고 부모의 Awake는 호출되지 않는다. 이러한 결과로 인해 자식클래스에서 부모의 Awake를 직접 호출해줘야 한다. 해결법 우선 부모의 Awake에 virtual를..
오늘은 캐릭터와 관련된 정보들을 어떻게 효율적으로 사용할지 고민했다. 그리하여 나온 결론은 클래스를 따로 만들어서 캐릭터터와 관련된 데이터를 선언해 놓을 클래스를 하나 제작하기로 했다. 하지만 여기서 문제가 발생했다. 다른 cs파일에서 사용을 하려고 했지만 사용이 불가능했다. 그 이유는 직렬화를 안했기 때문이다. 그래서 오늘은 직렬화의 개념을 파악하려고 한다. "직렬화" 란? 데이터 구조나 오브젝트 상태를 Unity 에디터가 저장하고 나중에 재구성할 수 있는 포멧으로 자동 변환해주는 프로세스를 말한다. 여기서 변환과정은 오브젝트를 연속된 바이트로 변환해주는 과정을 말한다. 요약하자면 객체(데이터)의 정보를 지속적으로 보존하고 사용하기 위해 일련의 변환과정을 거친다는 것이다. 사용법 이 사진은 오늘 내가 ..
이번 팀프로젝트에서 몬스터를 소환하는 기능을 목표로 설정하고 구현했었다. 몬스터 소환은 반복되어야 했기 때문에 함수를 원하는 시간에 실행될 수 있는 지연함수 기능을 사용해야만했다. 그래서 Invoke와 Coroutine중 무엇을 써야할까 고민하다가 둘다 비슷한 기능 같아서 Invoke기능을 사용했고 결과로 반복적인 함수호출을 구현할 수 있었다. 프로젝트가 끝난 후 그냥 기능이 비슷하다고 넘어간 Invoke와Coroutine의 개념을 확실히 하고 싶어서 개념을 정리하고자 한다. Invoke 와 Coroutine은 똑같은 지연함수라고 생각할 수 있다. 그래서 둘 중 하나를 골라서 마음대로 쓰고 있을 수 있는데 둘은 개념이 다르다. 1. Invoke와 Coroutine의 개념 Invoke - 시간을 지연시키고..
오늘 팀프로젝트를 무사히 마무리하고 팀원들과 각자 코드를 어떻게 구현했는지 공유하는 시간을 가지고 있었다. 그때 팀원 한분이 내 코드를 보고 Prefab관리를 ScriptableObject로 하면 관리가 굉장히 수월하고 효율도 좋다해서 코드 리뷰가 끝나자마자 이 기능에 대해 알아보았다. 1. ScriptableObject란? 클래스 인스턴스와는 별도로 대용량의 데이터를 관리할 수 있는 데이터 컨테이너다. 데이터를 저장하는 Prefab이 있는 경우 유용하다. 그 이유는 Prefab을 인스턴스화 할때마다 해당 데이터의 자체 사본이 생성되기 때문이다. 여기서 자체 사본이 생성되기 때문에 메모리 효율도 좋고 유용하다고 나온다. 그럼 자체 사본이 생성된다는게 무슨 말일까? 2. 내 코드와 ScriptableObj..
1. 문제점 오늘 팀원이 제작한 코드 중 끊임없이 나오는 몬스터들을 미리 감지하는 기능이 있었다. 이 코드를 이해하고 여기서 기능을 더 추가하려고 했지만 처음보는 기능들이 있어서 이해가 어려웠다. 그래서 오늘은 어떤 방식으로 상대방을 감지하는지 알아보려고한다. 2. LayerMask란? 32비트의 int형으로 구성되있다. 예를 들어 000000000000~.....0, 총 32개의 비트로 나타낼 수 있다. 쉽게 설명하자면 만약에 Enemy라는 Layer값을 가진 Prefab이 있다면 Enemy정보를 총 32개의 비트 중 하나에 넣는 것이다. 3. RaycastHit란? 게임오브젝트의 위치에서 인자값을 넣어준 방향과 설정한 범위 내에서 물체가 있는지 없는지 충돌감지를 해주는 기능이다. 캐스트는 Layer로..
OnCollision, OnTrigger 가 무엇인가? 공통적으로 충돌과 관련된 기능을 구현하고 싶을 때 사용하는 메소드다. 그럼 공통된 기능이니깐 아무거나 써도 되지 않을까? 생각할 수 있지만 엄연히 둘은 다른 목적을 가지고 있다. Collision Collision은 물리 연산을 하기 때문에 무언가에 부딪혀서 물리적 반응이 나와야 할 때 사용한다. 예를 들어 공이 바닥에 닿으면 튕겨나가는 것을 말한다. Trigger Trigger는 물리연산을 하지않는다. 그래서 물체가 어딘가에 관통하여 지날갈 때나 부딪혔을 때 사라져야할 경우 사용한다. 총알과 관련된 기능을 예를 들 수 있다. Collision 기능 OnCollisionEnter(Collision) - 두 물체가 부딪혔을 때 OnCollisionSt..
deltaTime이란? 마지막 프레임이 완료된 후 경과한 시간을 초 단위로 반환하는 기능 프레임은 무엇인가? 애니메이션과 같은 연속된 사진 중 정지된 사진 한장을 프레임이라고 한다. 그래서 초당 몇 프레임을 뽑아낼 수 있는지를 나타내는 단어가 FPS 즉, Frames Per Second(초당 프레임) 다. 위에 두 개념을 보고 완벽하게 이해하기란 쉽지않다. 그래서 쉬운 예로 설명하고자 한다. 1. 10FPS가 가능한 컴퓨터 2. 120FPS가 가능한 컴퓨터 이렇게 두 개의 컴퓨터가 있다고 가정해보자. 1번 컴퓨터는 성능이 너무 안좋아서 실제 시간 10초가 지나야만 게임캐릭터가 한걸음 움직인다. 2번 컴퓨터는 성능이 좋아서 실제시간 1초만 지나도 게임캐릭터가 한걸음 움직인다. 하지만 결국 두 컴퓨터는 모두..