no image
유니티 머신러닝 2(Unity ML-Agents)
자 이번에는 유니티 머신러닝 셋팅이 완료되었으니 바로 예제로 들어가보겠습니다! 가상환경 셋팅이 되지않으셨다면 https://dev-jen.tistory.com/entry/%EC%9C%A0%EB%8B%88%ED%8B%B0-%EB%A8%B8%EC%8B%A0%EB%9F%AC%EB%8B%9D-1Unity-ML-Agents 유니티 머신러닝 1(Unity ML-Agents) 자세한 설명은 유니티 머신러닝 깃 허브에 잘 나와있습니다! https://github.com/Unity-Technologies/ml-agents/blob/develop/docs/Installation.md 유니티 머신러닝 깃허브 기준 설명서 -> docs -> Installation.md 로 들어가시 dev-jen.tistory.com 이 글을..
2024.03.19
no image
유니티 머신러닝 1(Unity ML-Agents)
자세한 설명은 유니티 머신러닝 깃 허브에 잘 나와있습니다! https://github.com/Unity-Technologies/ml-agents/blob/develop/docs/Installation.md 유니티 머신러닝 깃허브 기준 설명서 -> docs -> Installation.md 로 들어가시면 됩니다! 현재 2024년 3월 기준으로 블로그를 작성하였고 다른 블로그를 참고하여도 계속 버전 문제가 커서 유니티 머신러닝 깃허브를 직접 참고하여 블로그를 새로 작성해봅니다! 일단 준비물은 https://github.com/Unity-Technologies/ml-agents GitHub - Unity-Technologies/ml-agents: The Unity Machine Learning Agents T..
2024.03.19
no image
유니티 Unity 보스 드래곤(Boss Dragon) 기획[졸업작품]
이번에 게임 졸업작품을 제작하기전 졸업작품 기획입니다! 이번에 기획을 해보면서 기획도 중요하다는걸 깨달았다 예전에 잠깐 방학에 기획없이 친구들과 작은 게임 프로젝트를 진행했는데 확실히 방향과 틀을 잡고 시작하는것과 그냥 맨땅에 헤딩하는것과는 다르다는걸 느꼈다 게임제작이 기획대로 흘러갈지 모르겠지만 열심히 해보자@@
2024.01.29
no image
유니티 퀘스트2 컨트롤러 셋팅
3D URP로 프로젝트를 생성해주며 Android가 있는 버전으로 프로젝트를 생성해주세요! • Edit - Project Settings 에서 • Install XR Plugin Management 를 설치해줍니다. Open XR을 체크해서 다운로드한뒤 yes버튼을 누르면 다시 프로젝트가 껏다 켜집니다. 기다려주세요! 그리고 노란색 경고 표시를 누르신다음 Fix All을 눌러주시면 됩니다. Open XR 에서 안드로이드를 클릭하신뒤 Oculus Touch Controller Profile을 추가해줍니다. Adroid를 추가하지 않으신분들은 보이지않으실거에요! 추가해주시면 보일겁니다. 그리고 Hand Interaction Poses를 체크해줍니다! 그리고 PC를 클릭해서 똑같이 추가해주고 체크해줍니다. X..
2023.11.24
no image
유니티 URP(Universal Render Pipeline) 설정방법
1. 첫 번째 방법 프로젝트 생성시에 바로 URP를 사용해서 프로젝트를 생성해준다 그러면 Global Volume 과 Readme, UniversalRenderPipelineGlobalSettings 가 생성되는걸 확인할수있다. 2. 두 번째 방법 일반적인 3D로 생성했을시에 URP 적용방법을 알려드리겠습니다. 3D로 생성했을때는 일반적으로 URP에대한 기본 셋팅이 되어있지 않은 상태. Window - Pakage Manager - Pakegaes 에서 Unity Registry를 선택후 - Univeral RP를 다운로드 해준다. URP를 다운받은후 Assets에 오른쪽 클릭을해줍니다. Create - 맨 밑에 있는 Rendering - URP Asset (with Universal Renderer) ..
2023.11.23
Unity 디자인패턴 - 스트래티지 패턴(Strategy Pattern)
스트래티지 패턴 스트래티지 패턴(Strategy Pattern)은 객체 지향 프로그래밍에서 사용되는 디자인 패턴 중 하나로, 알고리즘을 정의하고 이를 캡슐화하여 동적으로 변경할 수 있는 패턴입니다. 이 패턴을 사용하면 알고리즘을 사용하는 클라이언트 코드와 분리하여 각각 독립적으로 변경하고 확장할 수 있습니다. 주로 전략을 변경해야 하는 경우나, 유사한 여러 알고리즘이 존재할 때 유용하게 쓰입니다. 스트래티지 패턴의 구성 요소: 1. 컨텍스트(Context): 전략 객체를 사용하는 역할로, 실제 사용자가 호출하는 메서드가 포함되어 있습니다. 2. 전략(Strategy): 알고리즘을 추상화한 인터페이스나 추상 클래스입니다. 3. 구체적인 전략(Concrete Strategy)L 실제 알고리즘을 구현한 클래스..
2023.08.17
Unity 디자인패턴 - 오브젝트 풀(Object Pool)
오브젝트 풀 오브젝트 풀(Object Pool)은 게임 개발에서 자주 사용되는 디자인 패턴 중 하나로, 오브젝트의 생성과 소멸을 최소화하여 성능을 향상시키는 방법입니다. 주로 게임 내에서 빈번하게 생성되고 삭제되는 오브젝트를 미리 생성해두고, 필요할 때마다 재활용하여 메모리 할당 및 해제 오버레드를 줄입니다. 오브젝트 풀의 구성 요소: 1. 풀(Pool): 미리 생성된 오브젝트들을 보관하고 있는 컨테이너입니다. 2. 오브젝트 생성 및 초기화: 초기에 풀에 포함될 오브젝트를 생성하고 초기화합니다. 3. 오브젝트 재사용: 오브젝트가 필요한 경우, 풀에서 빼내서 사용하고 필요한 상태로 초기화합니다. 4. 오브젝트 반환: 사용이 끝난 오브젝트를 다시 풀에 반환합니다. 오브젝트 풀 패턴의 예시 코드: C# 유니티..
2023.08.17
Unity 디자인패턴 - 싱글톤(Singleton)
싱글톤 패턴 싱글톤(singleton)패턴의 정의는 단순하다. 객체의 인스턴스가 오직 1개만 생성되는 패턴을 의미한다. 싱글톤 패턴을 구현하는 방법은 여러가지가 있지만, 여기서는 객체를 미리 생성해두고 가져오는 가장 단순하고 안전한 방법을 소개하겠다. public class Singleton { private static Singleton instance = new Singleton(); private Singleton() { //생성자는 외부에서 호출을 하지 못하게 private으로 지정. } public static Singleton getInstance() { return instance; } public void Say() { Console.WriteLine("Hello"); } } 싱글톤 패턴은..
2023.08.17
반응형

자 이번에는 유니티 머신러닝 셋팅이 완료되었으니 바로 예제로 들어가보겠습니다!

 

가상환경 셋팅이 되지않으셨다면

https://dev-jen.tistory.com/entry/%EC%9C%A0%EB%8B%88%ED%8B%B0-%EB%A8%B8%EC%8B%A0%EB%9F%AC%EB%8B%9D-1Unity-ML-Agents

 

유니티 머신러닝 1(Unity ML-Agents)

자세한 설명은 유니티 머신러닝 깃 허브에 잘 나와있습니다! https://github.com/Unity-Technologies/ml-agents/blob/develop/docs/Installation.md 유니티 머신러닝 깃허브 기준 설명서 -> docs -> Installation.md 로 들어가시

dev-jen.tistory.com

이 글을 보고 셋팅하고 와주세요!

 

 

에셋 파일에

ML-Agents -> Examples -> Scene 의 3DBall을 들어가서 실행해보시면 자동적으로 학습이 되어있는걸 확인하실수 있습니다.

Model에 학습이 되어있는 모델이 적용되어있습니다

 

저희는 직접 이 친구들을 가지고 학습을 시킬거기때문에

 

config 파일을 들어가셔서

 

ppo 알고리즘으로 제작되어있는 yaml 파일을 찾을겁니다

3DBall 파일을 복붙해서 저는 Test 파일이라고 이름을 지었습니다

2번째줄에 원래는 3DBall이라고 적혀있는데 저는 3DBall_Test라고 수정해줬고 

23번째줄이 원래는 50만번으로 설정되어있지만 저는 36000번만 학습하도록 해보겠습니다!

 

파일을 저장해주시고

3DBall 프리팹으로 들어가셔서 Agent를 클릭합니다. 그리고

Behavior Name을 아까 yaml 파일에서 수정한 3DBall_Test로 설정해주고 Model을 None으로 설정해줍니다!

 

자 이제 학습할준비가 끝났습니다.

아까 준비해둔 가상환경에서

mlagents-learn config/ppo/3DBall_Test.yaml --run-id=3DBall_Test1

이라고 명령어를 쳐줍니다

ppo 파일에 있는 3DBall_Test.yaml 파일을 이용해서 3DBall_Test1 이라는 파일을 만들어서 학습 결과를 result 파일에 저장해줄겁니다! 물론 3만6천번이 끝나야 저장을해줍니다! 50만번도 50만번이 다 돌아야 완전한 저장이 되더라구요!

다 실행되지않는다면 파일만 생성되고 더미 파일들만 생성되는거같습니다.

 

이런식으로 가상환경에 나온다면 성공입니다!

바로 실행을 누르시면

친구들이 빠르게 빠르게 학습을 진행합니다.

보통 1만2천번씩 하면서 중간에 한번씩 멈추더라구요.

 

 

자 이런식으로 3만6천번의 학습이 끝났고 results 파일을 확인해봅니다!

 

이 파일 자체를 유니티로 다시 옮겨줍니다!

 

그러면 3만 6천번을 학습한 Model이 이렇게 나오는데 아까 Model 적용하는법 알려드렸죠?

거기에 적용시키시면 됩니다!

기존에있었던건 아마 50만번을 학습시켜서 저희가 테스트로 제작한건 3만6천번이라 50만번보다는 공을 많이 떨어뜨리게 됩니다!

유니티 머신러닝 예제는 여기까지입니다 감사합니다!

 

반응형
반응형

자세한 설명은 유니티 머신러닝 깃 허브에 잘 나와있습니다!

https://github.com/Unity-Technologies/ml-agents/blob/develop/docs/Installation.md

유니티 머신러닝 깃허브 기준 설명서 -> docs -> Installation.md 로 들어가시면 됩니다!

 

현재 2024년 3월 기준으로 블로그를 작성하였고

다른 블로그를 참고하여도 계속 버전 문제가 커서 유니티 머신러닝 깃허브를 직접 참고하여 블로그를 새로 작성해봅니다!

 

일단 준비물은

https://github.com/Unity-Technologies/ml-agents

 

GitHub - Unity-Technologies/ml-agents: The Unity Machine Learning Agents Toolkit (ML-Agents) is an open-source project that enab

The Unity Machine Learning Agents Toolkit (ML-Agents) is an open-source project that enables games and simulations to serve as environments for training intelligent agents using deep reinforcement ...

github.com

링크로 들어가셔서 

 

초록색 Code 버튼을 눌러 다운로드를 해줍니다!

 

현재 날짜 기준으로

  • Unity(2023.2 이상) 설치
  • Python(3.10.12 이상) 설치

라고 설명서에 나와있으므로 유니티허브를 다운로드해주시고

유니티 2023,2버전 이상과 파이썬 3.10.12 이상버전을 설치해줍니다!

저는 

유니티 2023.2.13f1 버전과 파이썬 3.11 버전을 설치하였습니다!

 

그리고 머신러닝은 가상환경에서 실행해야하기때문에

https://docs.conda.io/projects/conda/en/stable/

Conda에 들어가셔서 다운로드를 해줍니다!

 

모두 다운로드가 완료되었다면

 

검색을 하셔서 Anaconda Prompt (miniconda3) 를 실행해줍니다!

 

 

이런식으로 기본 가상환경 창이 나오는데

아까 맨 처음에 다운받았던 유니티 ml-agents-develop 로 들어가셔서 경로를 설정해줍니다!

저는 2번째라 2라고 적었으니 신경쓰지마세요!

 

경로로 들어가는법

cd C:\Users\Jean\Desktop\ml-agents-develop2\ml-agents-develop

각자의 경로로 들어가시길 바랍니다! 저는 바탕화면에 놔둬서 경로가 이런식으로 됩니다!

Jean은 제 이름이고 Desktop은 보통 바탕화면 입니다.

이 파일의 경로로 설정해주세요!

 

conda create -n mlagents python=3.10.12 && conda activate mlagents

명령어를 사용하여 파이썬 버전을 맞춰주고 conda를 사용하여 mlagents를 사용하여 가상환경을 셋팅해줍니다!

이런식으로 파이썬 버전3.10.12와  mlagents로 가상환경의 기본셋팅이 되었습니다! 

 

더 많은 예제를 다운로드 하고싶으시다면

git clone --branch release_21 https://github.com/Unity-Technologies/ml-agents.git

이 명령어를 사용하시면 됩니다! 저는 사용하지 않겠습니다.

 

자 이제 PyTorch를 설치해야하는데요 윈도우라면

pip3 install torch~=2.2.1 --index-url https://download.pytorch.org/whl/cu121

 

OS라면 GRPC 라이브러리를 설치합니다

pip3 install grpcio

 

둘중 하나만 하시면 돼요! 각자 맞는 운영체제로 다운하시면 됩니다!

 

 

자 이제 파이썬 패키지를 설치해야 합니다

2개의 명령어를 한줄씩 실행해줍니다!

python -m pip install ./ml-agents-envs
python -m pip install ./ml-agents

 

 

밑의 명령어도 실행해줍니다!

python -m pip install mlagents==1.0.0

 

 

마지막으로 파이토치에 필요한것과 나머지 명령어도 실행해주시면 됩니다!

pip3 install torch -f https://download.pytorch.org/whl/torch_stable.html
pip3 install -e ./ml-agents-envs
pip3 install -e ./ml-agents

 

 

이제 셋팅은 끝났습니다!

 

유니티에서 디스크에서 프로젝트 추가를 누르신다음

아까 저희가 지정했던 경로에 Project 파일이 있습니다.

이 프로젝트 파일로 프로젝트 추가를 눌러주시면 됩니다!

 

 

프로젝트가 열리는걸 기다려주세요!

다음 페이지에서 예제 다루는법을 소개하겠습니다!

 

반응형
반응형

 

이번에 게임 졸업작품을 제작하기전 졸업작품 기획입니다!

 

 

 

이번에 기획을 해보면서 기획도 중요하다는걸 깨달았다

예전에 잠깐 방학에 기획없이 친구들과 작은 게임 프로젝트를 진행했는데 확실히 방향과 틀을 잡고 시작하는것과

그냥 맨땅에 헤딩하는것과는 다르다는걸 느꼈다

게임제작이 기획대로 흘러갈지 모르겠지만 열심히 해보자@@

반응형
반응형

3D URP로 프로젝트를 생성해주며 Android가 있는 버전으로 프로젝트를 생성해주세요!

 

 

 

• Edit - Project Settings 에서

• Install XR Plugin Management 를 설치해줍니다.

 

Open XR을 체크해서 다운로드한뒤 yes버튼을 누르면 다시 프로젝트가 껏다 켜집니다.

기다려주세요!

그리고 노란색 경고 표시를 누르신다음

 

Fix All을 눌러주시면 됩니다.

 

Open XR 에서 안드로이드를 클릭하신뒤 Oculus Touch Controller Profile을 추가해줍니다.

Adroid를 추가하지 않으신분들은 보이지않으실거에요! 추가해주시면 보일겁니다.

 

그리고 Hand Interaction Poses를 체크해줍니다!

 

그리고 PC를 클릭해서 똑같이 추가해주고 체크해줍니다.

 

XR Plug-in Management를 다시 들어가셔서 안드로이드도 OpenXR을 체크!

 

Window - Pakage Manager - Unity Registry 클릭!

 

XR Interaction Toolkit 을 설치해줍니다!

 

제목에 보시면 com. 어쩌고 파란색으로 드래그한 부분을 복사해주세요

왼쪽 상단에 + 버튼을 눌러서 Add pakage form git URL을 클릭합니다.

복사한 주소를 넣어서 엔터를 누르시면 최신버전으로 다운받아져요!

그냥 사용하셔도 되지만 최신버전으로 사용하시는걸 추천합니다!

 

Samples 탭에서 2개의 샘플을 설치해줍니다!

1. Starter Assets

2. XR Device Simulator

 

Hands Interaction Demo 는 사용하실분만 다운로드 받아주세요! 위의 2개로도 충분합니다!

 

하이어라키 창에서 새로 추가해줍니다.

XR - XR Origin (VR)

그럼 이런식으로 추가가 됩니다.

Left, Right Controller의 Sorting Group을 삭제해줍니다!

 

Left Controller를 클릭하고 XR Controller 를 들어가 빨간색으로 표시된 곳을 눌러주시고

XRI Default Left Controller 을 클릭해줍니다!

Right Controller도 똑같은 방식으로 Right로 추가해주세요!

그럼 Left와 Right 둘다 기본 설정이 완료 됩니다.

Project 에서

Assets - Samples - XR Interaction Toolkit - 2.5.2 - Starter Assets - Presets -

XRI Default Left Controller 를 클릭한뒤 빨간색으로 표시된곳을 눌러주시면 됩니다!

XRI Default Right Controller 도 똑같은 방식으로 설정해주세요!

 

다시 Edit - Project Settings 를 들어가서

Preset Manager 을 들어가서

각 Controller에대한 이름 적어주세요!

 

빈 오브젝트를 만들어 줍니다 이름은 - XR Manager

하위에다가 Input Action Manager를 생성해주고

원래 있던 XR interaction Manager을 XR Manager에 넣어줍니다!

그리고 Input Action Manager에서 Add Component를 눌러서 Input Action Manager 스크립트를 추가해줍니다!

추가된 Input Action Manager 스크립트에 Element 값을 + 표시를 눌러 값을 하나 추가해줍니다.

 

Project의

Assets - Samples - XR Interaction Toolkit - 2.5.2 - Starter Assets - XRI Default Input Actions를 Element값에 넣어줍니다.

 

그리고 Starter Assets - Prefabs - Controllers 에있는 XR Controller Left를

하이어라키 창에있는 Left Controller 를 클릭해서 XR Controller 스크립트의 맨 밑부분 Model Prefab부분에 끌어당겨줍니다.

Right부분도 똑같이 해주세요!

 

 

그리고 마지막으로

XR Device Simulator 를 하이어라키 창에 추가해줍니다!

 

 

게임을 실행해보면 잘 되네요!

왼쪽 설명란에 버튼을 눌러보시면 잘 실행되는걸 보실수있습니다.

반응형
반응형

1. 첫 번째 방법

프로젝트 생성시에 바로 URP를 사용해서 프로젝트를 생성해준다

 

그러면 Global Volume 과 Readme, UniversalRenderPipelineGlobalSettings 가 생성되는걸 확인할수있다.

 

 

2. 두 번째 방법

일반적인 3D로 생성했을시에 URP 적용방법을 알려드리겠습니다.

 

3D로 생성했을때는 일반적으로 URP에대한 기본 셋팅이 되어있지 않은 상태.

 

Window - Pakage Manager - Pakegaes 에서 Unity Registry를 선택후 - Univeral RP를 다운로드 해준다.

 

 

URP를 다운받은후 Assets에 오른쪽 클릭을해줍니다.

Create - 맨 밑에 있는 Rendering - URP Asset (with Universal Renderer) 클릭

 

그럼 2개의 파이프라인 렌더가 생성되는데 이걸 다시 설정해줘야합니다.

 

Edit - Project Settings… 클릭!

 

Graphics 를 클릭해줍니다.

New Universal Render Pipeline Asset 을 끌어당겨서 적용시켜줍니다.

 

그러면 원래 이랬던 집이

이렇게 핑크색으로 바뀝니다.

 

일단 기본적인 퀄리티 셋팅을 하기위해

다시 Project Settings - Quality 에 들어가서 - High를 클릭해주고 다시 New Universal Render Pipeline Asset 를 등록해줍니다!

퀄리티 셋팅을 하는 이유는 URP가 반짝거림이 심해질수있는데 High로 하는것이 제일 안정적이고 반짝거림이 있지않아서 입니다.

 

 

핑크색 없애기!

핑크색을 없애기 위해서는

Window - Rendering - Render Pipeline Converter 를 들어가줍니다.

 

그러면 이러한 창이 뜨게 되는데

전부 체크를 해준뒤 Convert Assets을 클릭해줍니다!

그러면 다시 원상복귀!

 

URP 적용하기전

 

궁금하신게 있으시다면 댓글 달아주세요!

반응형
반응형

스트래티지 패턴

스트래티지 패턴(Strategy Pattern)은 객체 지향 프로그래밍에서 사용되는 디자인 패턴 중 하나로,
알고리즘을 정의하고 이를 캡슐화하여 동적으로 변경할 수 있는 패턴입니다.
이 패턴을 사용하면 알고리즘을 사용하는 클라이언트 코드와 분리하여 각각 독립적으로 변경하고 확장할 수 있습니다.
주로 전략을 변경해야 하는 경우나, 유사한 여러 알고리즘이 존재할 때 유용하게 쓰입니다.

스트래티지 패턴의 구성 요소:
1. 컨텍스트(Context): 전략 객체를 사용하는 역할로, 실제 사용자가 호출하는 메서드가 포함되어 있습니다.
2. 전략(Strategy): 알고리즘을 추상화한 인터페이스나 추상 클래스입니다.
3. 구체적인 전략(Concrete Strategy)L 실제 알고리즘을 구현한 클래스들 입니다.

스트래티지 패턴 예시 코드:

 

// 전략(Strategy) 인터페이스
public interface IAttackStrategy
{
    void Attack();
}

// 구체적인 전략(Concrete Strategy) 클래스들
public class MeleeAttackStrategy : IAttackStrategy
{
    public void Attack()
    {
        Console.WriteLine("근접 공격을 수행합니다.");
    }
}

public class RangedAttackStrategy : IAttackStrategy
{
    public void Attack()
    {
        Console.WriteLine("원거리 공격을 수행합니다.");
    }
}

// 컨텍스트(Context) 클래스
public class Character
{
    private IAttackStrategy attackStrategy;

    public void SetAttackStrategy(IAttackStrategy strategy)
    {
        attackStrategy = strategy;
    }

    public void PerformAttack()
    {
        if (attackStrategy != null)
        {
            attackStrategy.Attack();
        }
    }
}

// 클라이언트 코드
class Program
{
    static void Main(string[] args)
    {
        Character warrior = new Character();
        Character archer = new Character();

        warrior.SetAttackStrategy(new MeleeAttackStrategy());
        archer.SetAttackStrategy(new RangedAttackStrategy());

        warrior.PerformAttack(); // Output: 근접 공격을 수행합니다.
        archer.PerformAttack();  // Output: 원거리 공격을 수행합니다.
    }
}

위의 예시 코드에서 IAttackStrategy 인터페이스는 알고리즘을 추상화합니다. 
MeleeAttackStrategy와 RangedAttackStrategy는 이 인터페이스를 구현하여 각각의 공격 방식을 
구체적으로 정의합니다. Character 클래스는 전략을 변경할 수 있는 메서드를 제공하고, 
클라이언트 코드에서 해당 전략을 설정하고 공격을 수행합니다.

스트래티지 패턴을 사용하면 새로운 공격 방식을 추가하거나 기존 공격 방식을 변경해야 할 때, 
기존 코드의 수정 없이 새로운 전략을 추가하거나 교체할 수 있습니다.

반응형
반응형

오브젝트 풀

오브젝트 풀(Object Pool)은 게임 개발에서 자주 사용되는 디자인 패턴 중 하나로, 오브젝트의
생성과 소멸을 최소화하여 성능을 향상시키는 방법입니다. 주로 게임 내에서 빈번하게 생성되고
삭제되는 오브젝트를 미리 생성해두고, 필요할 때마다 재활용하여 메모리 할당 및 해제 오버레드를 줄입니다.

오브젝트 풀의 구성 요소:
1. 풀(Pool): 미리 생성된 오브젝트들을 보관하고 있는 컨테이너입니다.
2. 오브젝트 생성 및 초기화: 초기에 풀에 포함될 오브젝트를 생성하고 초기화합니다.
3. 오브젝트 재사용: 오브젝트가 필요한 경우, 풀에서 빼내서 사용하고 필요한 상태로 초기화합니다.
4. 오브젝트 반환: 사용이 끝난 오브젝트를 다시 풀에 반환합니다.

오브젝트 풀 패턴의 예시 코드:

C# 유니티 기준으로 오브젝트 풀.

 

public class ObjectPool : MonoBehaviour
{
    public GameObject prefab;
    public int initialPoolSize = 10;

    private List<GameObject> objectPool;

    private void Start()
    {
        objectPool = new List<GameObject>();

        for (int i = 0; i < initialPoolSize; i++)
        {
            GameObject obj = Instantiate(prefab);
            obj.SetActive(false);
            objectPool.Add(obj);
        }
    }

    public GameObject GetObjectFromPool()
    {
        foreach (GameObject obj in objectPool)
        {
            if (!obj.activeInHierarchy)
            {
                obj.SetActive(true);
                return obj;
            }
        }

        GameObject newObj = Instantiate(prefab);
        objectPool.Add(newObj);
        return newObj;
    }

    public void ReturnObjectToPool(GameObject obj)
    {
        obj.SetActive(false);
    }
}


위의 코드는 오브젝트 풀을 구현한 예시입니다. 주요 요소는 다음과 같습니다:

prefab: 풀에 사용될 오브젝트의 프리팹입니다.
initialPoolSize: 초기에 풀에 생성될 오브젝트의 개수입니다.
objectPool: 실제 오브젝트들을 저장하는 리스트입니다.
Start(): 초기에 풀에 오브젝트들을 생성하고 비활성화합니다.
GetObjectFromPool(): 오브젝트 풀에서 사용 가능한 오브젝트를 가져옵니다. 비활성화된 오브젝트를 찾아 활성화시키고 반환합니다.
ReturnObjectToPool(GameObject obj): 사용이 끝난 오브젝트를 다시 비활성화하여 풀에 반환합니다.
이제 위와 같은 오브젝트 풀을 사용하면 빈번한 오브젝트 생성과 삭제로 인한 성능 저하를 줄일 수 있습니다.

 

 

 

반응형
반응형

싱글톤 패턴


싱글톤(singleton)패턴의 정의는 단순하다.
객체의 인스턴스가 오직 1개만 생성되는 패턴을 의미한다.

싱글톤 패턴을 구현하는 방법은 여러가지가 있지만, 
여기서는 객체를 미리 생성해두고 가져오는 가장 단순하고 안전한 방법을 소개하겠다.

 

    public class Singleton
    {
        private static Singleton instance = new Singleton();
       
        private Singleton()
        {
            //생성자는 외부에서 호출을 하지 못하게 private으로 지정.
        }
        public static Singleton getInstance()
        {
            return instance;
        }
        public void Say()
        {
            Console.WriteLine("Hello");
        }
    }


싱글톤 패턴은 객체의 인스턴스가 오직 하나만 생성되는 디자인 패턴을 의미합니다. 객체의 인스턴스가 전역적으로 접근 가능하고 재사용되는 장점을 가지며, 주로 자원의 공유나 중복 생성을 피하기 위해 사용됩니다. 하지만 싱글톤 패턴은 구현에 따른 다양한 문제점을 가지고 있습니다.

장점:

메모리와 성능 효율: 싱글톤 패턴을 통해 객체 인스턴스가 한 번만 생성되므로 메모리 사용을 줄이고, 생성 및 소멸 과정에서 오버헤드를 줄일 수 있습니다.

전역적인 접근 가능성: 다른 클래스에서 해당 인스턴스에 쉽게 접근할 수 있어서 데이터나 메서드를 공유하기 용이합니다.

단점:

복잡한 구현: 싱글톤 패턴은 멀티스레드 환경에서 동시성 문제를 해결하기 위해 추가 코드가 필요한 경우가 있습니다. Lazy initialization이나 멀티스레딩에 대한 고려가 필요합니다.

테스트 어려움: 싱글톤은 전역적으로 접근 가능하므로 테스트에서 문제를 일으킬 수 있습니다. 테스트할 때마다 인스턴스 상태를 초기화해주거나 테스트 더블을 사용해야 합니다.

의존성과 유연성 문제: 클라이언트 코드는 싱글톤 클래스의 구체적인 구현에 의존하게 됩니다. 이로 인해 SOLID 원칙 중 DIP와 OCP를 위반할 가능성이 높습니다.

상속 문제: 일반적인 싱글톤 패턴은 상속이 어렵거나 복잡하게 됩니다. 싱글톤 자체를 상속받는 클래스를 만들어도 싱글톤 특성을 유지하기 어렵습니다.

내부 상태 변경 어려움: 다른 객체와 공유되는 싱글톤 인스턴스의 내부 상태를 변경하기 어려울 수 있습니다.

결론적으로, 싱글톤 패턴은 메모리와 성능 측면에서 이점을 가지지만, 복잡한 구현과 테스트 어려움, 의존성 문제 등 다양한 단점을 가지고 있어서 사용 시 신중한 고려가 필요합니다. 따라서 싱글톤 패턴을 선택할 때는 해당 상황과 요구사항을 잘 고려하고, 필요한 경우 대안적인 디자인 패턴이나 접근 방식을 고려하는 것이 좋습니다.

 

 

반응형