분류 전체보기 39

오브젝트 풀링

클래스는 참조타입, 즉 컴포넌트는 참조타입이다. 따라서 힙영역에 할당되며 가비지컬렉터가 시간이 지나고 아무것도 가리키고(즉 null을 가리키는)놈들을 찾아서 해제시킨다. 그 때 가비지컬렉터는 바로바로 해제하는게 아닌 시간이 좀 지난뒤 해제한다. 그 때 유니티의 BohemGC는 비압축 방식이라 힙영역의 메모리를 정렬시키지 않기 때문에 메모리의 단편화가 발생한다. 이점을 해결하기 위해 나온 패턴이 오브젝트 풀링이다. 예시코드를 보자. public class BulletObjectPool : MonoBehaviour { // 오브젝트 풀링 : 빈번한 생성과 파괴는 연산적으로 비효율적이기 때문에 예상하여 미리 만들어두고 활성화/비활성화 함으로서 관리하는 패턴. // 1.일단 미리 만들어둘 놈들을 담아둘 콜렉션(..

디자인패턴 2023.10.05

어댑터 패턴

어댑터 패턴이란? 110볼트를 220볼트로 사용해야할 떄 돼지코를 써서 하듯이 어떠한 행위에 대한 컴포넌트를 만들고 이를 적용시킬 게임오브젝트에 붙여서 사용하는 것. 예시로 장애물이 있을 때 장애물은 피격이 가능한 장애물이 있을수 있고 불가능한 장애물이 있을 수 있다. 이 때 피격이란 어댑터 스크립트를 피격이 가능한 장애물에 붙여서 피격이 가능하도록 만든 것을 예시로 들 수 있다. public class Switch : MonoBehaviour { public List interactionObjList = new List(); private List interactableList = new List(); public void Interaction() { // interactionObj.GetCompone..

디자인패턴 2023.10.03

전략패턴

전략패턴이란 전략패턴이란 행위를 갈아끼우는 패턴이다. 예를 들어 플레이어가 공격이라는 행위가 있을 때 플레이어는 검을 휘두르거나, 총을 쏘는 등 여러가지 공격 행위가 존재할 수 있을 것이다. 그 때 if문이나 switch문으로 행위를 나누는 것이 아닌, 플레이어가 행위 변수를 가지고 있고 추상클래스나 인터페이스로 정의한 공격 행위 클래스들을 갈아끼우는 형식이다. 예시코드 public abstract class TrapStrategy { protected Trap trap; public TrapStrategy(Trap trap) { this.trap = trap; } public abstract void Active(); } public class DefaultTrapStrategy : TrapStrate..

디자인패턴 2023.09.27

추상클래스와 인터페이스

추상클래스란? 객체를 생성할 수 없고, 상속받은 자식으로부터 기능들을 구현해야 하는 클래스. 인터페이스란? 다중상속이 허용되지 않는 C#에서 객체지향 프로그래밍을 더 강력하게 사용하기 위한 것으로 추상 클래스 보다 높은 수준의 추상 멤버로만 구성된 클래스 클래스의 다중상속을 막은 이유 몬스터를 상속받는 슬라임과 드래곤이 있을 때 둘다 몬스터의 추상함수를 구현했다고 가정하고 슬라임과 드래곤을 둘 다 상속받는 슬라임 드래곤이 있을 경우 위에서 구현한 추상함수는 어떤걸 사용하는 것인지 모르기 때문에 다중상속을 막아둔 것이다. 추상클래스와 인터페이스의 차이점 추상클래스는 확장이 목표, 인터페이스는 그 기능의 구현이 목표 즉 상속은 확장, 인터페이스는 실체화라고 생각하면 편하다. 인터페이스 사용예시 예를 들어 인..

C# 2023.09.25

컴포넌트

컴포넌트란? 유니티에서 script를 작성하면 자동으로 MonoBehaviour를 상속받는다. MonoBehaviour의 부모를 찾아가다보면 Component로부터 상속받았다는 것을 알 수 있다. 컴포넌트여야지만 게임오브젝트의 인스펙터창에 존재할 수 있다. 즉, 이 말은 유니티가 제공하는 콜라이더, 트랜스폼 등등이 컴포넌트라는 것을 알 수 있다. 실제로 이들의 부모를 타고 들어가보면 Component를 상속받은 것을 확인할 수 있다. 예시 만약 몬스터와 플레이어가 공격, 히트라는 기능을 가져야 할 때 상속을 받아서 사용하는 것이 아닌 공격, 히트를 컴포넌트로 (부품으로)만들어 부착하는 형식 구조도

Unity 2023.09.21

[유니티] Physics

Physics란? 물리와 관련된 함수들이 미리 들어있는 집합이다. 자주 사용해본 함수 OverlapSphere 기능 : 구의 중심점과 반지름이 주어지면 그 범위 안에 존재하는 콜라이더들의 배열을 리턴해주는 함수. 사용 예시 : 몬스터나 플레이어가 자신의 주변의 적을 탐지하는 기능을 구현할 때 사용. 예시 코드 Raycast 기능 : 보이지 않는 광선을 쏜 뒤 물리적 충돌을 감지하는 함수. 한번 충돌하면 바로 리턴된다. 사용 예시 : 광선을 쏴 부딪힌 물체의 정보를 가져올 때 사용. 예시 코드

Unity 2023.09.19

ScriptableObject

ScriptableObject는 유니티에서 제공해주는 데이터 컨테이너이다. 데이터 영역에 할당되며 [CreateAssetMenu]란 어트리뷰트를 통해 생성할 수 있다. 데이터 영역에 할당되어 있는 놈이기 때문에 여러 개의 사본을 생성하지 않고 하나의 데이터를 사용하는 경우에 유용하다. 사용예시 나는 ScriptableObject를 이용해 스킬 구조를 짰었다. ScriptableObject는 직렬화 및 역직렬화가 가능하기 때문에 따로[System.Searizable] 어트리뷰트를 붙여주지 않아도 인스펙터 창을 통해 변수들을 확인할 수 있다. 그래서 스킬 So는 스킬이미지, 스킬옵션, 스킬오브젝트를 가지고 있고 미리 세팅을 해두어 사용하였다. 또한 데이터영역에 존재하기 때문에 동일한 스킬을 사용하는 유닛이 ..

C# 2023.09.08

유니티 ui와 게임오브젝트 클릭 나누기

게임을 개발할 때 UI의 터치와 게임 내의 터치를 구분하고 싶을 때가 있다. 예를 들어 강화버튼만 클릭되어야 하는데 게임 내 터치도 돼 공격을 실행한다던지 말이다. 이러한 경우에 UI와 게임오브젝트의 클릭을 나누어 줘야 하는데 그 때 사용되는 기능이 바로 EventSystem.current.ispointerovergameobject()이다. 반환타입은 bool타입으로 UI쪽이 클릭되었다면 true를 리턴한다. 이를 통해 UI클릭과 게임 내 클릭이 동시클릭되는 것을 제한해줄 수 있다.

Unity 2023.09.05