안녕하세요, 이재현입니다.
1인 게임 개발자를 꿈꾸며 유니티를 독학으로 시작했고, 2009년부터 2012년 까지 1인 개발로 모바일 게임 10여종을 출시했습니다. 개발 도중 우연한 기회에 유니티 서적 집필과 오프라인 강의를 진행했습니다. 강의를 진행하면서, 잘 아는 것과 잘 가르치는 것은 다르다는 사실을 매번 깨닫고 있습니다. 이러한 경험을 바탕으로, 제가 가진 지식을 여러분들께 더 효과적으로 전달하기 위해 늘 노력하고 있습니다.
이번 강의가 여러분께 좋은 출발점이 되어, 즐거운 게임 개발자의 세계로 나아가는 데 작은 보탬이 되기를 기원합니다. ~
강의
수강평
- 절대강좌! 유니티6 - ECS/DOTS 프로그래밍 마스터클래스
- 절대강좌! 유니티6 - 네트워크 게임 개발 마스터클래스 (Part3) : Netcode로 개발하는 2D RPG
- 절대강좌! 유니티6 - 네트워크 게임 개발 마스터클래스 (Part3) : Netcode로 개발하는 2D RPG
- 절대강좌! 유니티6 - 네트워크 게임 개발 마스터클래스 (Part3) : Netcode로 개발하는 2D RPG
게시글
질문&답변
기초적인 질문
안녕하세요. 양승근님,우선 질문을 제대로 이해했는지 모르겠지만, 상태머신 구현할 때나 다른 코드 작성할 때 기본 Monobehavior와 인터페이스를 상속받아서 사용하는 부분에 대한 질문이신것으로 이해했습니다.우선 C#은 다중 상속을 지원하지 않지만 Interface를 통해 구현할 수가 있습니다.public class Enemy : MonoBehaviour, IDamageable, IInteractable { ... }그리고 특정 클래스와 느슨한 결합(디커플링) 구조를 구현할 수 있습니다. SOLID 원칙중 인터페이스 분리원칙과도 부합하는 방식이라고 생각하시면 되시구요. 추후 코드의 확장 및 수정에도 용이한 장점도 있습니다.어떤 부분의 코드에서 의구심이 드셨는지를 몰라서 원론적인 말씀만 드렸습니다.
- 0
- 1
- 12
질문&답변
ecs관심이 있었는데 강의 잘 보았습니다.
안녕하세요. Sura J 님,좋은 질문 감사합니다. 1번째 질문에 대한 답변입니다.Unity ECS는 컴파일 타임에 데이터 레이스컨디션을 감지합니다. 즉, Burst 컴파일러와 함께 사용될 때, Unity ECS는 시스템이 접근하는 데이터에 대한 읽기 및 쓰기 권한을 분석하여 데이터 레이스를 방지합니다. 그리고, ITriggerEventsJob 은 각 충돌 이벤트마다 Execute 메서드가 독립적으로 호출됩니다. 즉, 각 충돌 이벤트는 별도의 작업으로 처리되며, 이로 인해 레이스가 발생할 가능성이 줄어듭니다.충돌처리가 미스하는 Enemy가 보인다고 하셨는데, 아마도 동일한 엔티티에 대해 여러 충돌 이벤트가 동시에 발생했을 발생하는 것으로 추측됩니다.(정확하지는 않지만) 따라서 값을 직접 변경하는데신 EntityCommandBuffer 사용하거나 NaviveQueue를 사용하는 것도 고려해볼 수 있습니다.이 부분은 저도 테스트를 해봐야 할 것 같습니다.[ReadOnly] 속성과 Job Dependency로 기본적으로 thread-safe한 구조를 제공하지만, 특정 상황에서는 추가적인 동기화 과정이 필요할 수 있을것 같습니다. 2번째 질문에 대한 답변입니다.우선 만마리 이상의 경우 성능저하에 대한 우려에 대해 질문하셨는데요.첫번재는 엔티티 수가 많을수록 Job 완료 대기 시간이 길어질수 있고, 두번째는 ComponentLookup의 캐시 미스가 증가할 수 있습니다. 코드를 검토해보고 개선할 수 있는 부분이 있는지 확인해 보았습니다. 우선 EnemyMovementSystem, EnemyHpBarSystem의 경우 시스템의 실행 순서를 명확히 명시하는 것이 좋을것 같습니다. // EnemyMovementSystem [UpdateInGroup(typeof(SimulationSystemGroup))] [UpdateAfter(typeof(FixedStepSimulationSystemGroup))] // 충돌 처리 후 실행 partial struct EnemyMovementSystem : ISystem { ... } // EnemyMovementSystem [UpdateInGroup(typeof(SimulationSystemGroup))] [UpdateAfter(typeof(FixedStepSimulationSystemGroup))] // 충돌 처리 후 실행 partial struct EnemyMovementSystem : ISystem { ... }강의에서는 적 캐릭터를 리스폰하지 않았지만 만약 리스폰 기능을 구현한다면 풀링 기법을 사용해 Enemy가 죽었을 때 Entity를 삭제하는 것이 아니라 비활성화하는 방법도 고려해볼 수 있습니다.미쳐 생각하지 못했던 부분에 대해 좋은 질문을 해주셔서 감사합니다. 종합적으로 코드를 다시 한번 검토해보고 최적화할 수 있는 부분이 있는지 살펴보겠습니다. 감사합니다.
- 0
- 2
- 39
질문&답변
Default Player Prefab 파괴시 재생성
네, 가능합니다. ~다음과 같이 커스텀 스폰 로직을 구현하실 수 있습니다. 하지만 보통 네트워크 게임에서 주인공 캐릭터를 삭제하지는 않습니다. (네트워크 세션이 종료됩니다.) 따라서, 리스폰 시간동안 캐릭터를 비활성화했다가 다시 활성화시키는 방법을 사용합니다. var player = Instantiate(playerPrefab, spawnPos, Quaternion.identity); player.GetComponent().SpawnAsPlayerObject(clientId, true);
- 0
- 2
- 23
질문&답변
캐릭터 네트워크 애니메이션 질문 (29강의)
안녕하세요. 네, Server Authority 에 대해 정확히 이해하셨습니다. 또한, 서버에서 별다를 코드가 없어도 실행 권한을 Server로 실행했을 때 애니메이션을 실행하면 다른 클라이언트에게도 NetworkAnimator에 의해 자동으로 전송이 됩니다. 질문 역시 정확히 이해하고 계십니다. Transform 의 경우 서버 권한일 경우 클라 -> 서버 -> 클라로 데이터가 이동하기 때문에 네트워크 레이턴시가 발생합니다. 이 경우에는 별도로 클라에서 네트워크 레이턴시를 고려해 위치 보정 작업을 해주어야 하는 문제가 있습니다.클라이언트 실행은 클라에서 직접 실행(위치, 애니메이션 등)하는 것을 의미하고, 실행 요청이란 의미는 서버측에 요청을 하는 것을 의미합니다.수강하시다가 또 궁금하신점이 있으시면 편하게 질문해주세요.꼭 완강하시길 응원합니다.
- 0
- 1
- 24
질문&답변
Warrior가 Gobin에게 달려가 충돌하면 Gobin이 뒤로 튀겨나가는 현상??
안녕하세요.물리 충돌이 발생하는 Collision 에서는 막을 수 있는 방법은 mass와 drag 값을 순간적(충돌 순간)에 충돌 당하는 쪽에 크게(Infinity) 설정해서 밀리지 않도록 할 수 있습니다. 하지만 이 방법도 완전한 해결책은 아니구요. linarVeclocity 역시 0으로 처리하셔야 하면 효과가 있습니다. 아래 코드는 테스트한 코드는 아닙니다만, 이런식으로 처리하시면 밀리는 현상은 현저히 줄일수 있으실 겁니다.private void OnCollisionEnter2D(Collision2D other) { if (other.collider.CompareTag("Player")) { this.gameObject.GetComponent().mass = float.MaxValue; this.gameObject.GetComponent().linearVelocity = Vector2.zero; } } private void OnCollisionExit2D(Collision2D other) { if (other.collider.CompareTag("Player")) { this.gameObject.GetComponent().mass = 1f; // 원래 질량으로 복원 this.gameObject.GetComponent().linearVelocity = Vector2.zero; } }
- 0
- 2
- 36
질문&답변
Warrior의 InputHandler.cs 의 OnEnable(), OnDisable() 메서드 부분에서 공격에 문제가 있는 것 같아요.
까만돌님, 알려주셔서 감사합니다. 제가 놓친 부분 잘 말씀해주셨습니다. 실수를 했네요ㅠㅠ다시한번 감사드려요~
- 1
- 2
- 37
질문&답변
Netcode 사용시 운영관점 질문
안녕하세요. DongJu Yoo님,완강후 2회차 실습까지 ... 감사합니다.~추가적으로 실무에서 알아 두시면 도움이 될만한것 중에서 운영 관점에서 몇가지 말씀드리겠습니다.배포 자동화(CI/CD)실시간 멀티플레이 게임은 그 특성상 패치 주기가 짧습니다. 따라서 CI/CD 구축해 자동 빌드 및 배포 환경을 갖추는 것이 중요합니다. 기존의 Github Actions, 젠킨스 같은 경우 유니티의 특성과는 다소 거리가 있기에 유니티에 특화된 Cloud Build기능을 학습하시는 것도 좋습니다.모니터링 및 로깅Netcode 자체만으로는 세션 상태나 네트워크 품질을 추적하기 어렵습니다.패킷 손실, 지연(RTT), 서버 상태를 실시간으로 점검하는 것이 필요합니다. UGS의 Analytis(또는 AWS CloudWatch)의 활용법을 배우시면 좋겠습니다.확장성있는 설계 vs 확고한 설계초기에 룸 기반 구조(Relay)로 시작하고, 유저 수가 늘어나면 전용 서버(Dedicated Server) 구조로 전환한다는 전략을 세울수 있습니다. 하지만 그 구조를 변경하는 것이 쉽지 않습니다. 더군다나 라이브 상태에서는요. 저 개인적으로는 처음부터 Relay방식으로 갈지 아니면 데디 방식으로 할지를 처음 부터 확실하게 결정하고 설계 및 구현하시길 권해드립니다.개발환경 분리물론 깃으로 코드를 관리하시겠지만 운영 전에 반드시 개발 코드를 개발–릴리즈(스테징)–라이브 환경을 철저하게 분리하시고, 트래픽 테스트를 거치는 것을 추천드립니다.그리고 Unity 6 이후에는 UGS와 NGO의 통합성이 좀 더 강화되어 운영 환경 설정이 훨씬 간편하고(?) 단순해졌습니다. 특히 대시보드에서 다양한 모니터링과 기능이 계속 강화되고 있기에 예전보다 편리해졌습니다. 실습 잘 진행하시고 좋은 성과 있으시길 기원합니다.
- 0
- 1
- 39
질문&답변
캐릭터 이동 방식을 A* Pathfinding 에셋으로도 한번 부탁드립니다.
안녕하세요. 크리스팍님,말씀하신 부분은 간단하게나마 적용시키는 예제를 추가 콘텐츠로 올려드리겠습니다. 다만, 지금 준비중인 강좌가 마무리된 후에나 가능할것 같습니다. 추후 추가 영상을 올리게 되면 여기 게시글에 다시 한번 더 글을 남겨두겠습니다.완강하시길 기원합니다. ~
- 1
- 1
- 45
질문&답변
여기에 쓰인 기술이 적합할지 궁금하네요.
안녕하세요. 정인성님,네트워크 게임을 개발 중이시군요. 우선 최대 60 유닛 정도이면 굳이 Netcode for Entities 까지 고려하실 필요는 없을 것 같습니다. 한 유닛 당 매 프레임 송수신 데이터가 상태값, 위치 동기화 정도가 될텐데요. 물론 부하 테스트에서 모니터링을 해봐야 겠지만 충분히 감당할 수 있는 트래픽입니다. 만약 모바일 환경이라고 한다면 타겟 디바이스에 따라서 처리 부하가 발생할 수는 있겠지요. 이 지점에서는 케이스-바이-케이스라 확답은 어렵겠습니다. Netcode for Entities를 사용하더라도 클라이언트의 수많은 객체를 ECS로 관리하는 것일 분 네트워크 데이터 처리하는 부분에 있어서는 접속 기기의 네트워크 상태와 대역폭에 따라 레이턴시가 달라질 수 밖에 없는 구조입니다. 따라서, 자동으로 답변된 내용에 있는 "무거운 환경과 동기화 수가 많다면 성능문제가 생길 수 있다" 라는 의견은 일반론 적인 답변이라고 생각힙니다. NGO를 장점은 중간 규모의 네트워크 게임에는 손쉽게 사용할 수 있도록 설계가되어 있습니다. 유니티 백엔드(UGS)와 완벽한 에코 시스템을 갖추고 있어 다양한 기능을 쉽게 개발하실 수 있습니다.다만 Dedicated Server 작업시에 직접 호스팅(AWS) 또는 유니티 Multiplay Hosting 시 운영비용과 초기 설정 부분에 있어서 비교하신 후 선택하시면 되겠습니다. 저도 답변이 길어졌습니다. 여러가지 고려할 상황이 있지만 주어진 내용만을 단편적으로 놓고 답변드린다면 Netcode For GameObject 로도 충분히 가능합니다. 좋은 성과 있으시길 기원합니다. ~
- 0
- 2
- 48
질문&답변
7강 재생이 안됩니다
안녕하세요. WooRam Jeon 님, 유독 7강만 재생이 잘 안되는것 같습니다. 브라우저를 종료했다 다시 접속 해봐주세요.간혹 맥 환경에서 아이패드로 연결할 경우 재생않되는 경우가 있습니다.혹시라도 계속 재생이 않되시면 연휴 끝난 후 인프런측에 문의부탁드려요.
- 0
- 2
- 24





