분류 전체보기 239

유니티 유아이 최적화

1. Canvas 분리Canvas 내에 유아이 요소가 바뀌면 Canvas를 다시 그리기 때문에 자주 바뀌는 유아이는 따로 Canvas를 만들어서 관리한다.  2. Text 갱신 최소화tmp는 갱신시 비용이 큰데 매프레임 변경하는 코드를 작성하는 것은 피하는 것이 낫다. 또한 GC최적화에도 언급했듯이, text = "Score : " + score 같은 코드는 피해야한다. stringbuilder를 사용한다. 3. 스크롤뷰스크롤뷰에 생성 및 삭제를 하면 비용이 많이 들기 때문에오브젝트 풀링을 이용한다.  4. CanvasGroup으로 SetActive 최소화SetActive는 엔진 내부에서 GC가 발생한다. 따라서 canvasGroup.alpha = 0;canvasGroup.interactable = fa..

면접관련 질문 2025.04.12

유니티의 이벤트 순서

유니티 오브젝트는 Monobehavior로 생명주기가 관리된다. 먼저 생성시에는1. Awake : Instantiate 함수가 호출되면 실행2. OnEnable : 객체가 활성화되면 실행(setActive 포함)3. Start : Update 첫프레임 시작 전 한 번 실행  매 프레임마다1. FixedUpdate : 물리연산 적용2. Update : 3. LateUpdate : 애니메이션 후처리, 카메라 추적 등 비활성화 및 삭제1. OnDisable : 비활성화 될 때 (SetActive 포함)2. OnDestroy : 삭제될 때

면접관련 질문 2025.04.12

가비지컬렉터(GC) 최적화 방법

가비지 컬렉터란 더이상 사용하지 않는 메모리를 자동으로 해제시켜주는 기능이다.  C#에서는 세대별 가비지 컬렉터가 동작하는데, Gen 0, Gen 1, Gen 2 가 있다.Gen 0 : 새로 생성된 오브젝트,Gen 1 : Gen 0 에서 살아남은 오브젝트Gen 2 : 아주 리소스가 큰 오브젝트( 장기 생존 객체 ) 세대가 낮을수록 (숫자가 작을수록) 수거 빈도가 높다.  그리고 세대가 낮을수록 비용이 적다. 따라서 Gen 0에서 바로바로 회수되도록 하는 것이 좋다. 또 아주 리소스가 크다면 애초에 Gen2로 가게끔하고 재사용을 하는 것이 좋다.  따라서 최적화하는 방법에는 1. 오브젝트 풀링, 즉 객체를 새로만들지 않고 만들어진 것을 재사용하는 것2. 이벤트 핸들러는 해제해야지만 GC의 대상이 된다. 3..

면접관련 질문 2025.04.12

유니티 프로젝트 젠킨스로 빌드 자동화

https://tpree.tistory.com/208 벡터 기초 2https://tpree.tistory.com/207 벡터 기초벡터는 크기와 방향으로 이루어졌다. 크기는 length 또는 Magnitude 라고 한다. 방향은 Normalized 로 표시한다. 왜냐하면 벡터에서 크기요소를 1로 고정해서 영향을tpree.tistory.com https://github.com/gxtxhm/VectorPracticeWithJenkins  간단하게 CI/CD를 실습해보기로 했다. 게임잡에서 요구사항이나 우대사항 중 젠킨스라는 단어가 보였기 때문이다.  빌드 및 배포 자동화라는 개념이며 뭐든 해보는 것이 중요하다 생각해 실습해보았다.  젠킨스를 위해 여러가지 설치를 하고 윈도우 계정 정보를 입력한다. 이는 젠킨스..

CI-CD/Jenkins 2025.04.10

벡터 기초 2

https://tpree.tistory.com/207 벡터 기초벡터는 크기와 방향으로 이루어졌다. 크기는 length 또는 Magnitude 라고 한다. 방향은 Normalized 로 표시한다. 왜냐하면 벡터에서 크기요소를 1로 고정해서 영향을 미치지 않게 하고 방향만을 나타낼tpree.tistory.com 이전 글에서 벡터의 특징들을 이용해 간단하게 플레이어를 쫓아오는 적을 구현했었다. 문제는 적이 플레이어를 정면으로 바라보게 되면 작동을 멈췄다.  다른 코드들을 살펴보니 직접 이렇게 구현하지않고 Angle이란 함수를 사용하는데 이 함수는 두 벡터를 입력하면 그 벡터간 각도를 리턴해주는 함수였다. 그리고 이 함수를 쓰면 정면에서도 잘 쫓아와서 Angle의 내부코드를 봤다. public static fl..

게임수학 2025.04.09

벡터 기초

벡터는 크기와 방향으로 이루어졌다. 크기는 length 또는 Magnitude 라고 한다. 방향은 Normalized 로 표시한다. 왜냐하면 벡터에서 크기요소를 1로 고정해서 영향을 미치지 않게 하고 방향만을 나타낼수 있기 때문이다. 이를 정규화라고하며, 이때의 벡터는 단위벡터라 한다.  이 벡터에서 어떠한 방향 또는 어디까지의 거리 등을 알아내기 위해서 이미 정의된 수많은 특징들이 있다.  많이 쓰이는 것들에는 빼기연산, 내적 등이 있다.  먼저 빼기연산 즉 B - A 는 A에서 B로 향하는 벡터이다. 이 벡터의 단위벡터가 a에서 b로 향하는 방향벡터가 되는것이다.  또 내적은 a의 크기 * b의 크기 * cos 이다.또는 x1*x2 + y1*y2 + z1*z2 로 표현한다.  이걸 이용하면 각도의 범..

게임수학 2025.04.01

C#으로 만드는 텍스트 Rpg (8)

미션 7: 예외 처리와 에러 로그목표: 예외 처리를 활용하여 안전한 게임 로직을 구현한다.미션:아이템 사용 시, 아이템이 없으면 적절한 예외 메시지를 출력해라.예외가 발생했을 때 에러 로그를 파일로 저장하는 코드를 작성해라. 마지막 미션이다. 예외처리를 해보고 에러 로그를 파일에 저장하는 것이다 . // ItemManagerpublic void LogError(Exception ex){ string logMessage = $"[{DateTime.Now}] 예외 발생: {ex.Message}\n{ex.StackTrace}\n"; File.AppendAllText("error_log3.txt", logMessage); Console.WriteLine("오류가 발생했습니다. 로그 파일을 확인하..

텍스트 Rpg - C# 2025.02.06

C#으로 만드는 텍스트 Rpg (7)

미션 6: 리플렉션을 활용한 동적 속성 접근목표: 리플렉션을 활용해 클래스의 정보를 탐색하고 동적으로 조작한다.미션:Player 클래스의 모든 프로퍼티와 값을 출력하는 리플렉션 코드를 작성해라.리플렉션을 활용해 Player 클래스의 체력 값을 동적으로 수정하는 코드를 작성해라.  미션6을 해결했다. 리플렉션이라는 기능을 사용해보는 것에 초점을 맞췄다. 그래서 텍스트 rpg에 필요한 기능이라기보다는리플렉션을 사용해볼 함수를 하나 만들었다.  이 리플렉션이라는 기능이 툴을 만들 때 아주 유용하게 사용되고 유니티에서는 플러그인이나 이벤트 시스템 좀 더 유연한 옵저버패턴을 만드는데 사용된다는데 아직 잘 모르겠다.  우선 리플렉션이란 컴파일타임이 아닌 런타임에 클래스의 프로퍼티, 필드, 함수 등이 뭐가 있는지 접..

텍스트 Rpg - C# 2025.02.06

C#으로 만드는 텍스트 Rpg (6)

미션 5: 람다와 LINQ목표: 람다와 LINQ를 활용해 데이터를 효율적으로 처리한다.미션:몬스터 리스트에서 체력이 가장 낮은 몬스터를 람다와 LINQ로 찾아라.아이템 리스트에서 체력 회복 아이템만 추출하는 코드를 작성해라.  LINQ는 C#에서 지원하는 sql언어 같은 것이다. 컬렉션이나 json등 여러가지 데이터에서 사용하여 데이터를 가공할 수 있는 아주 편리한 기능이다.  사용법은 sql 처럼 where, orderby, select 등을 사용할 수도 있고, 함수를 사용할 수도 있다.  이번 미션에서는 함수로 사용했다. // GameManager.cspublic List monsters;public List FindHalfHpMonster(){ return monsters?.Where(n =..

텍스트 Rpg - C# 2025.02.05

C#으로 만드는 텍스트 Rpg (5)

이번에는 기존 미션 계획 중간에 미션 4이후, 아이템 시스템에 대한 리팩토링 및 자동화 기능을 추가했다.  델리게이트를 이용해 아이템 사용시 이벤트를 발생시킬 수 있게했다. 또한 플레이어와 몬스터에도 델리게이트를 적용시켜 전투 시, 이벤트를 발생시킬 수 있도록 하였다.  아이템 시스템 자동화부분은 json 파일을 읽어와 각 아이템 클래스의 값들을 초기화하는 것이다.하드코딩되었던 부분을 json에서 읽어오도록 바꾸었다.  //public delegate void OnDead();public event Action OnDeadEvent;//public delegate void OnAttack();public event Action OnAttackEvent;플레이어와 몬스터 클래스에 모두 Action 델리케이..

텍스트 Rpg - C# 2025.02.05