indiegamemaker
@indiegamemaker
受講生
479
受講レビュー
32
講義評価
4.9
안녕하세요, 이재현입니다.
1인 게임 개발자를 꿈꾸며 유니티를 독학으로 시작했고, 2009년부터 2012년 까지 1인 개발로 모바일 게임 10여종을 출시했습니다. 절대강좌! 유니티 출간 및 오프라인 강의를 진행했습니다. 강의를 진행하면서, 잘 아는 것과 잘 가르치는 것은 다르다는 사실을 매번 깨닫고 있습니다. 이러한 경험을 바탕으로, 제가 가진 지식을 여러분들께 더 효과적으로 전달하기 위해 늘 노력하고 있습니다.
이번 강의가 여러분께 좋은 출발점이 되어, 즐거운 게임 개발자의 세계로 나아가는 데 작은 보탬이 되기를 기원합니다. ~
주요 강의 이력
패스트캠퍼스 - 유니티 캠프 1기 ~ 8기
팀 스파르타 온라인 튜터
T아카데미
NHN 엔터테인먼트
넷마블 게임아카데미
ETRI (한국전자통신연구원)
한콘진, 경콘진, 성남산업진흥원
KAIST, 서강대, 중앙대, 한성대, 단국대 특강
주요 활동
절대강좌! 유니티 집필 (일본, 중국 출판)
유니티 UNITE 2014 세션 특강
유니티 UNITE 2018 핸드온 세션 특강
유니티 인더스트리 2022 핸드온 세션 특강
유니티 코리아 공인 마스터스 2기부터 5기까지 활동
講義
受講レビュー
- 絶対講座!Unity - Unity開発者のためのGit協業マスタークラス
- 絶対講座!Unity6 - ネットワークゲーム開発マスタークラス (Part3) : Netcodeで開発する2D RPG
- 絶対講座!Unity6 - ECS/DOTS プログラミングマスタークラス
- 絶対講座!Unity6 - ネットワークゲーム開発マスタークラス (Part3) : Netcodeで開発する2D RPG
投稿
Q&A
캐릭터 중복 생성 문제
안녕하세요. 원인을 찾았습니다. NetworkGameManager의 OnDestroy 에서 콜백이 해제되지 않아서 발생했던 문제입니다. OnDestroy 메소드를 다음과 같이 수정해주세요. 서버 여부와 관계없이 콜백을 제거하도록 수정했습니다. private void OnDestroy() { if (NetworkManager.Singleton == null) return; // IsServer 체크 없이 무조건 콜백 제거 NetworkManager.Singleton.OnClientConnectedCallback -= OnClientConnected; }질문 주셔서 감사합니다.
- 0
- 2
- 22
Q&A
캐릭터 중복 생성 문제
안녕하세요. 코드를 확인해서 동일 증상이 있는지 확인 후 다시 답변드리겠습니다.
- 0
- 2
- 22
Q&A
완강 후 궁금한 것
안녕하세요. 양승근님, 완강 축하드립니다. 가능은 하지만 Host / Server 모드 일때는 호스트 한대에 모든 연산과 네트워크 처리가 몰립니다. 프래임드랍과 랙이 걸릴것으로 예상됩니다. 따라서 Dedicated Server 가 필요하며 역시 서버 한대 보다는 분산전략을 세워야 합니다. 4명정도 접속해서 하는 코옵 수준의 설계와 100인 접속 배틀로얄급은 처음 설계부터 고민을 많이 해야 합니다. 특정지점에 유저가 몰릴경우 모두 부하가 걸리는 현상이 발생하겠죠. 로비와 릴레이를 사용하셔야 합니다. 호스트방식으로는 100 동접을 구현할 수는 없습니다. 로비,릴레이, 데디 서버(Unity HostServer) 방식으로 우선을 설계를 잡으시고, 처음에는 16명 -> 32명 -> 50명 이런식으로 늘리면서 부하테스트를 하시길 권해드립니다.
- 0
- 1
- 34
Q&A
39강 질문
안녕하세요. 양승근님,질문주신 내용 두 가지 다 정확히 이해하고 계십니다. 제가 설명이 조금 부족했나봅니다.
- 0
- 1
- 23
Q&A
기초적인 질문
안녕하세요. 양승근님,우선 질문을 제대로 이해했는지 모르겠지만, 상태머신 구현할 때나 다른 코드 작성할 때 기본 Monobehavior와 인터페이스를 상속받아서 사용하는 부분에 대한 질문이신것으로 이해했습니다.우선 C#은 다중 상속을 지원하지 않지만 Interface를 통해 구현할 수가 있습니다.public class Enemy : MonoBehaviour, IDamageable, IInteractable { ... }그리고 특정 클래스와 느슨한 결합(디커플링) 구조를 구현할 수 있습니다. SOLID 원칙중 인터페이스 분리원칙과도 부합하는 방식이라고 생각하시면 되시구요. 추후 코드의 확장 및 수정에도 용이한 장점도 있습니다.어떤 부분의 코드에서 의구심이 드셨는지를 몰라서 원론적인 말씀만 드렸습니다.
- 0
- 2
- 37
Q&A
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를 삭제하는 것이 아니라 비활성화하는 방법도 고려해볼 수 있습니다.미쳐 생각하지 못했던 부분에 대해 좋은 질문을 해주셔서 감사합니다. 종합적으로 코드를 다시 한번 검토해보고 최적화할 수 있는 부분이 있는지 살펴보겠습니다. 감사합니다.
- 1
- 2
- 60
Q&A
Default Player Prefab 파괴시 재생성
네, 가능합니다. ~다음과 같이 커스텀 스폰 로직을 구현하실 수 있습니다. 하지만 보통 네트워크 게임에서 주인공 캐릭터를 삭제하지는 않습니다. (네트워크 세션이 종료됩니다.) 따라서, 리스폰 시간동안 캐릭터를 비활성화했다가 다시 활성화시키는 방법을 사용합니다. var player = Instantiate(playerPrefab, spawnPos, Quaternion.identity); player.GetComponent().SpawnAsPlayerObject(clientId, true);
- 0
- 2
- 33
Q&A
캐릭터 네트워크 애니메이션 질문 (29강의)
안녕하세요. 네, Server Authority 에 대해 정확히 이해하셨습니다. 또한, 서버에서 별다를 코드가 없어도 실행 권한을 Server로 실행했을 때 애니메이션을 실행하면 다른 클라이언트에게도 NetworkAnimator에 의해 자동으로 전송이 됩니다. 질문 역시 정확히 이해하고 계십니다. Transform 의 경우 서버 권한일 경우 클라 -> 서버 -> 클라로 데이터가 이동하기 때문에 네트워크 레이턴시가 발생합니다. 이 경우에는 별도로 클라에서 네트워크 레이턴시를 고려해 위치 보정 작업을 해주어야 하는 문제가 있습니다.클라이언트 실행은 클라에서 직접 실행(위치, 애니메이션 등)하는 것을 의미하고, 실행 요청이란 의미는 서버측에 요청을 하는 것을 의미합니다.수강하시다가 또 궁금하신점이 있으시면 편하게 질문해주세요.꼭 완강하시길 응원합니다.
- 0
- 1
- 33
Q&A
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
- 43
Q&A
Warrior의 InputHandler.cs 의 OnEnable(), OnDisable() 메서드 부분에서 공격에 문제가 있는 것 같아요.
까만돌님, 알려주셔서 감사합니다. 제가 놓친 부분 잘 말씀해주셨습니다. 실수를 했네요ㅠㅠ다시한번 감사드려요~
- 1
- 2
- 40





