전체 글 182

[디펜스 게임 제작] 스킬 시스템 제작(진행중)

스킬 시스템이란?- 하나의 스테이지를 클리어할 때마다 "영웅 능력치 버프" 또는 "영웅 스킬 강화"를 선택지가 존재하는데 그때 사용되는 시스템이다. 스킬 시스템 구조- 템플릿 메서드 패턴을 활용하기 위해 BaseSkill에 기본적인 것들의 정의- 전략 패턴 활용을 위해 성격이 다른 Buff와 Attack을 분리하고 ScriptableObject로 제작- 버프, 공격에 필요한 것들을 개별로 상속받아 각 프리팹에서 불러오는 방식으로 사용*두 패턴과 ScriptableObject를 이용해 중복 코드 및 확장성을 살리고 메모리 절약을 목표로 함 BaseSkill 클래스 추가using UnityEngine;public abstract class BaseSkill : ScriptableObject{ publi..

[이론] Addressable

Addressable이란?- Addressable의 주요 기능은 에셋에 주소를 할당하고 런타임에 로드하는 것이다.- 에셋은 앱에 '빌트인'되거나 '로컬'로 캐싱되거나 '원격'으로 호스팅 될 수 있다. 왜 런타임에 로드하는 것이 주요한가?- Unity의 Resources파일에 필요 리소스 들을 넣을 경우 앱을 실행할때 전부 로드해버립니다. 하지만 Addressable의 경우 런타임에서 필요할때 불러올 수 있어 앱의 실행 시간이나 메모리를 효율적으로 사용할 수 있습니다. 에셋 주소- Addressable창에 주소, 카탈로그, 레이어 등 설정이 가능하다- 고유한 주소를 할당하는 것도 좋지만, 굳이 고유할 필요도 없다.Addressable 예시에셋 1: 주소: "plate_armor_rusty", 레이블: "h..

[디펜스 게임 제작] 보호 오브젝트

다음 제작할 것은 보호 오브젝트이다. 보호 오브젝트란?- LOL의 넥서스와 같은 형태로 던전지키기와 같은 개념이며, hp가 0이 되면 게임이 종료된다. using TMPro;using UnityEngine;public class HpBarController_Text : MonoBehaviour{ [SerializeField] TextMeshProUGUI _hptext; const string HPTEXT = "{0}/{1}"; public void Hpbar_Update(int maxhp, int curhp) { _hptext.text = string.Format(HPTEXT, curhp, maxhp); }}- 맵을 일단 대충 만들어 준 후 오른쪽 상단에 Text형..

[읽코좋코] 루프와 논리 단순화

if(length >= 10)orif(10 - 첫번째 if문과 두번째 if문중 어떤게 더 읽기 쉽다고 느껴지는가? 개인적으론 첫번째이며 책에서도 첫번 째라고 한다. while(bytes_received bytes_received)- 이 경우엔 어떤 while문이 읽기 편하다고 느껴지는가? 역시 동일하게 첫번 째라고 느껴진다 왜 if문과 while문 두개다 첫번째 코드가 더 잘 읽혀지는가?- 바로 왼쪽 = 유동적인 '질문을 받는'표현, 오른쪽 = 고정값으로 '비교 대상' 으로 많이 사용하기 때문이라고 한다.- 영어의 문법에서도 "당신은 적어도 1년에 10만 불을 번다면" 이라고 얘기하는 것이 자연스럽지 "만약 18년이 당신의 나이보다 작거나 같다면"이라고 하는 건 너무나도 부자연스럽다고 할 수 있다.- ..

[읽코좋코] 의도 명시, 파라미터 주석

//리스트를 역순으로 반복한다.for(list::reverse_iterator it = prodjcts.rbegin(); it != products.rend();++it) DisplayPrice(it->price);- 앞 시간에 얘기했듯 주석은 읽는 사람을 생각하며 작성하는 것이다. 해당 주석은 새로운 정보 없이 코드 수행 그대로 적어 놓은거라 좋은 주석이라고 할 수 없다고 한다. //각 가격을 높은 값에서 낮은 값 순으로 나타낸다.for(list::reverse_iterator it = prodjcts.rbegin(); it != products.rend();++it) DisplayPrice(it->price);- 이 주석이 첫번째 주석보다 좋은 이유는 책에서 설명하길 해당 코드엔 보이지 않지만 사실 ..

[이론] UniTask

UniTask : GitLink GitHub - Cysharp/UniTask: Provides an efficient allocation free async/await integration for Unity.Provides an efficient allocation free async/await integration for Unity. - Cysharp/UniTaskgithub.com UniTask란 무엇인가?- UniTask는 Unity 환경에 특화된 고성능 async/await 라이브러리입니다. Unity의 기본 코루틴(Coroutine)과 C# 표준 Task의 단점을 보완하고 대체하기 위해 만들어졌습니다.주요 특징- Unity의 비동기 작업(AsyncOperation 등)과 생명주기 이벤트(Upda..

[읽코좋코] 주석의 문장을 명확하게

# 이 URL을 전에 이미 방문했는지에 따라서 다른 우선순위를 부여한다.- 이정도 문장은 나쁘지 않다 하지만 좀 더 좋은 문장으로 바꿔본다면 # 전에 방문하지 않은 URL에 높은 우선순위를 부여하라- 문장이 더 간단하고 짧고, 직접적이고 "URL에 높은 우선순위가 부여된다"는 사실까지 설명하여 더 좋은 문장이 되었다. //이 파일에 담긴 줄 수를 반환한다int CountLines(string filename){...}- 위 주석엔 '줄'이 어떤 것인지 명확하지 않다.- '\n'로 구분하는지, 빈파일은 줄이 0개인지, 'hello'는 줄이 1인지 0인지 등 명확하게 알수가 없다. //파일안에 새 줄을 나타내는 바이트('\n')가 몇 개 있는지 센다int CountLines(string filename){...

[읽코좋코] 간결한 주석

C++ 타입 정의에 대한 주석 예.//int는 CategoryType이다.//내부 페어의 첫 번째 float는 'score'다.//두 번째 'weight'다.typedef hash_map(int, pair>ScoreMap;- 3줄로 되어 있는 주석을 줄여보겠습니다. //CategoryType -> (score,weight)typedef hash_map(int, pair>ScoreMap;- 이렇게 한줄로 정리 가능 //Insert the data into the cache, but check if it's too big first.//데이터를 캐시에 넣어라. 하지만 그것이 너무 큰지 먼저 확인하라.- 책에서는 주석을 작성할때 모호한 표현을 피하라고 했다.- it's가 무엇인지 주석만으론 데이터인지 캐시인지..

[이론] async/await

async/await는 비동기식으로 작동을 한다. 그렇다면 동기란 무엇인가?- 각 작업이 순차적으로 일어나는 방식을 말함 void Start(){ Test1(); Test2(); Test3();}- 동기로 작업이 된다는 것은 Test1 -> Test2 -> Test3 순서대로 실행된다는 것임 비동기식이란?- 메인스레드를 대기 시키지 않고 새로운 스레드에 작업을 진행하는 것- 프로그램이 병렬적으로 실행되도록 작업을 효율적으로 처리할 수 있게 해주는 것임, 주로 I/O작업(파일 읽기/쓰기, 네트워크 통신 등)에 사용 using System.Threading.Tasks;using UnityEngine;pubilc class Test : MonoBehaviour{ // ✅ 네트워크 요청 async T..

[이론] 코루틴

유니티에서 코루틴이란?- 다수의 프레임에 작업 분산이 가능- 코루틴은 실행을 일시정지하고 제어를 유니티에 반환하지만 중단한 부분에서 다음 프레임을 계속할 수 있는 매서드- 단, 코루틴은 스레드가 아니며, 동기작업으로 메인 스레드에서 실행이 됨- HTTP전송, 에셋로드, 파일 I/O 등 기다리는 것과 같이 긴 비동기 작업을 처리 해야하는 경우 코루틴을 사용하는 것이 좋다고 함 예제.IEnumerator Fade(){ Color c = renderer.material.color; for (float alpha = 1f; alpha >= 0; alpha -= 0.1f) { c.a = alpha; renderer.material.color = c; yield..