월 17,600원
5개월 할부 시다른 수강생들이 자주 물어보는 질문이 궁금하신가요?
- 해결됨[C#과 유니티로 만드는 MMORPG 게임 개발 시리즈] Part7: MMO 컨텐츠 구현 (Unity + C# 서버 연동 기초)
셀단위 이동이 아닐때의 구현 질문
안녕하세요! 강의를 보던 중 궁금한 점이 생겨 글을 남기게 되었습니다. 이번 강의에서 만드신 게임의 동작방식을 보면 플레이어가 셀단위로 이동을 하는걸 알 수 있는데요. 이렇게 셀단위로 이동할 경우 서버에서의 충돌체크나 AI의 길찾기를 모두 셀단위를 기준으로 하게 되어 간편하게 할 수 있는것 같습니다! 그런데 이런 방식이 아니라 Part#4에서 만드셨던것처럼 자유롭게 케릭터가 이동 가능한 경우, 서버에서의 충돌처리나 이동가능 체크, 길찾기는 어떤방식으로 하게 되나요? 가장 단순하게 생각하면 셀을 아주 미세하게 쪼개서 대량으로 만들고 케릭터의 크기만 키우는 방법이 있을것 같은데요. (셀 간의 간격이 좁으므로 셀단위 이동이라는 느낌이 안들게 되겠죠) 이렇게 할 경우 너무 많은 셀을 만들게 되어 메모리는 그렇다 쳐도 AI의 길찾기 속도 저하등 퍼포먼스 문제가 발생하여 일반적으로는 사용되지 않을것 같습니다. 그렇다면 Part#4와 같은 게임에서는 어떤 방식을 사용하여 처리하는 지가 궁금합니다. (충돌처리 방법, 서버 맵데이터를 뽑는 방법 등등..) 내용이 광범위 하다면 검색 키워드나 관련 정보의 URL이라도 부탁드리겠습니다. 감사합니다!
- 미해결[C#과 유니티로 만드는 MMORPG 게임 개발 시리즈] Part7: MMO 컨텐츠 구현 (Unity + C# 서버 연동 기초)
System.ArrayTypeMismatchException:
Map.cs -> ApplyMove 및 ApplyLeave 함수 부분에서 오류가 간헐적으로 발생합니다. public bool ApplyMove(GameObject gameObject, Vector2Int dest) { ApplyLeave(gameObject); PositionInfo posInfo = gameObject.PosInfo; if (CanGo(dest, true) == false) return false; { int x = dest.x - MinX; int y = MaxY - dest.y; _objects[y, x] = gameObject; // 이 부분에서 오류 발생 함 } // 실제 좌표 이동 posInfo.PosX = dest.x; posInfo.PosY = dest.y; return true; } System.ArrayTypeMismatchException: 'Attempted to access an element as a type incompatible with the array.' 이라는 오류가 발생합니다.... 첨부파일에 있는 프로젝트 실행해도 마찬가지입니다 .NET Core 3.1 Protobuf( 3.12.3) Newtonsoft.Json (12.0.) 입니다
- 미해결[C#과 유니티로 만드는 MMORPG 게임 개발 시리즈] Part7: MMO 컨텐츠 구현 (Unity + C# 서버 연동 기초)
맵 이동 시 궁금한 부분이 있습니다.
예를 들어서 캐릭터가 집에 들어간다고 했을 때에 집 문에 collision 을 두어서 캐릭터가 진입했을 때에 장소를 변경하려고 합니다. 이 때에 강의를 이용하여 Map 을 만든 후 Map Prefab 을 바꿔주면 될 것 같다는 생각이 들었습니다. 그러나 Map 이 바뀔 때에 Scene 의 특징이 바뀌어서 생성되는 Object 들이 많이 바뀐다던지 할 경우 (나중에 추가가 되겠지만 리젠되는 몬스터가 바뀐다던지, NPC 들이 다양하게 생긴다던지) Map Prefab 의 변경보다 Scene 을 변경하는게 더 낫지 않을까 하는 생각이 들었습니다. 혹시 언제 Scene 을 변경하면 좋을지, 언제 Map Prefab 을 변경하면 좋을지에 대한 법칙이나 강사님만의 기준이 있는지 궁금합니다.
- 미해결[C#과 유니티로 만드는 MMORPG 게임 개발 시리즈] Part7: MMO 컨텐츠 구현 (Unity + C# 서버 연동 기초)
함수 시그니쳐부분에 대한 이해가 어렵습니다
static Loader LoadJson<Loader, Key, Value>(string path) where Loader : ILoader<Key, Value> { string text = File.ReadAllText($"{ConfigManager.Config.dataPath}/{path}.json"); return Newtonsoft.Json.JsonConvert.DeserializeObject<Loader>(text); } DataManager.cs 파일에 있는 위 함수에서 Loder는 어디에 정의 되어있는 것이고LoadJson 뒤 부분인 <Loader, Key, Value> 는 왜 있는건가요?
- 미해결[C#과 유니티로 만드는 MMORPG 게임 개발 시리즈] Part7: MMO 컨텐츠 구현 (Unity + C# 서버 연동 기초)
31:49초 에서도 GenPacket.bat 실행 시 오류 발생합니다
오류내용 : Protocol.proto:8:3: "C_CHAT" is already defined in "Protocol". Protocol.proto:8:3: Note that enum values use C++ scoping rules, meaning that enum values are siblings of their type, not children of it. Therefore, "C_CHAT" must be unique within "Protocol", not just within "MsgId". Protocol.proto:9:3: "S_CHAT" is already defined in "Protocol". Protocol.proto:9:3: Note that enum values use C++ scoping rules, meaning that enum values are siblings of their type, not children of it. Therefore, "S_CHAT" must be unique within "Protocol", not just within "MsgId".
- 미해결[C#과 유니티로 만드는 MMORPG 게임 개발 시리즈] Part7: MMO 컨텐츠 구현 (Unity + C# 서버 연동 기초)
파일 생성이 안됩니다
15:12 에 GenPackets.bat 파일 실행하면 .cs 파일이 생성이 안됩니다... 내용을 몇번이고 다시 확인하면서 대소문자까지 구별해서 재시도 해봤는데 아무 변화가 없네요 관리자 권한으로 해보고 별걸 다해봐도 아무 변화가 없습니다 Blazor 강의부터 제대로 되는게 없어서 좌절하게되네요...
- 미해결[C#과 유니티로 만드는 MMORPG 게임 개발 시리즈] Part7: MMO 컨텐츠 구현 (Unity + C# 서버 연동 기초)
강의를 듣다보니..
어느 컨텐츠까지 서버한테 확인작업을 받아야하는지 기준을 모르겠습니다 예를들어 길드를 만들때도 서버에게 패킷을 주고받으며 확인을 받아야하는지.. 모든컨텐츠가 서버에 일일이 확인을 받으면 과부화가 안걸리나요?(유저가 많다고가정할시)
- 미해결[C#과 유니티로 만드는 MMORPG 게임 개발 시리즈] Part7: MMO 컨텐츠 구현 (Unity + C# 서버 연동 기초)
맥북 솔루션로드실패
저는 맥북을 이용하는 수강생인데요. 파트7 마지막 강의의 소스코드를 열려고하면 솔루션로드가 실패되었다고 아에 파일이 visual studio에 열리지가 않네요... .sin을 눌러 소스코드를 열려고하면 load operation failed 라고뜨고 창이 닫혀요 ㅠㅠ 파트7 Protobuf 이식 (코드 리뷰) 강의의 소스파일은 열면 이렇게됩니다.. 구글을 검색해도 안나오는것같고 정확한 이유를 모르겠어서... 주변에 개발자분들이 없기두하고 수업이 진행이 안되네여 ㅠㅠ 인터넷에 소스파일을 올려서 확인해달라고 할수도없는상황이구.. 맥에 대한 이슈는 잘 모르신다고 하셨는데 혹시라도 알고계실까봐 질문드려봐요... 주변 맥을쓰시는 개발자분들에게 답변을 구해주시면 안될가요 ㅠㅠ 부탁드립니다
- 미해결[C#과 유니티로 만드는 MMORPG 게임 개발 시리즈] Part7: MMO 컨텐츠 구현 (Unity + C# 서버 연동 기초)
에러
첨부파일 다운받아서 따라가려했으나 오류가 해결이 안되네요. 10:00ResourceManager 의 29번째 줄 내용 Debug.Log가 찍히는걸로 봐서는 UI/EventSystem도 없는것 같고요 첨부파일에있는 것들 중 스크립트만 추가했는데도 여전히 마찬가지네요. BaseScene.cs의 Init()에서 obj에 암것도 못받아와서 null이라 Managers.Resource.Instantiate("UI/EventSystem").name = "@EventSystem"; 가 실행되서 따라가보니 받아와야 할 것들에 다 null인걸로 봐서 못받아오는 것같네요...
- 미해결[C#과 유니티로 만드는 MMORPG 게임 개발 시리즈] Part7: MMO 컨텐츠 구현 (Unity + C# 서버 연동 기초)
강의가 몇개 사라졌나요?
MapTool 강의 다음에 Player 이동 강의인데 내용이 이어지질 않네요...
- 미해결[C#과 유니티로 만드는 MMORPG 게임 개발 시리즈] Part7: MMO 컨텐츠 구현 (Unity + C# 서버 연동 기초)
존단위, 심리스??
바람의나라와, 리니지같은 두개의 맵으로 크게 나눌수있다고 말씀하셨는데 왜 전자가 더 구현하기가 더쉬운건가요? 그냥 단순히 바람의나라에서 맵을 좀더 넓히면 리니지같은 방식이 되는거 아닌가요?
- 미해결[C#과 유니티로 만드는 MMORPG 게임 개발 시리즈] Part7: MMO 컨텐츠 구현 (Unity + C# 서버 연동 기초)
유니티 빌드
안드로이드로 빌드를 하면 gradle build failed에러가 뜨는데 어떻게 하나요?? 그리고 유니티 최신버전을 써도 상관없나요?
- 미해결[C#과 유니티로 만드는 MMORPG 게임 개발 시리즈] Part7: MMO 컨텐츠 구현 (Unity + C# 서버 연동 기초)
3D MMORPG에서 충돌체크 구현에 대하여 궁금합니다.
안녕하세요? Rookiss님 2D로 만드는 경우는 MAP 데이터를 COMMON폴더의 MAPDATA를 통해 서버가 게임룸속의 세상을 인지하고 처리하게 되는 걸 알게 되었습니다. ex) text파일을 읽어서 _collision[y,x]을 만들고 새로운 플레이어가 들어오면 _player[y,x] 배열에 담기.. 그런데 만일 3D게임인 경우 구글검색을 해보니 cube나 box를 통해 collision을 만들어 놓은 3차원 좌표 데이터를 서버에 가지고 있게 된다고 하던데 그렇다면 큰 데이터를 실제로 어떤 방식으로 가지고 있고 구현하게 되나요? 리니지2m 예를 드시면서 설명해주셨는데 cell방식이라고.. 결국 3차원 구조체를 구현하고 데이터 역시 이런 방식이 필요한건가요? 배그같지만 디자인고 간단하지만 높이값이 있는 FPS 3D MMORPG를 만들어 보고 싶어서 드리는 질문입니다.
- 미해결[C#과 유니티로 만드는 MMORPG 게임 개발 시리즈] Part7: MMO 컨텐츠 구현 (Unity + C# 서버 연동 기초)
Arrow스킬 공격에서 함수 흐름에 대한 질문 드립니다.
스페이스를 누르면 코루틴 함수로 Arrow프리팹을 생성하는데 이때 제가 생각하는 코드의 흐름 순서는 Managers.Resource.Inistatiate("Creature/Arrow"); ArrowController의 Init함수 ArrowController ac = go.GetComponent<ArrowController>(); ac.Dir = _lastDir; ac.CellPos = CellPos; 이런 식으로 돼야할 거 같은데, 디버그를 해보니 Init 함수가 나중에 실행되더라고요. Arrow프리팹이 Instantiate되면 그에 딸려있는 컴포넌트인 ArrowController의 Init함수가 다음으로 호출될거 같은데, Instantiate의 호출과 실제 Gameobject가 생성되는 시점이 약간 다른건가요??
- 해결됨[C#과 유니티로 만드는 MMORPG 게임 개발 시리즈] Part7: MMO 컨텐츠 구현 (Unity + C# 서버 연동 기초)
TickRoom 함수
안녕하세요 TickRoom 함수에 람다 함수를 room.Update(); 로 넣어주셨는데 room.Push(room.Update); 를 넣어야 lock이 실행되는게 아닌지 궁금합니다~! static void TickRoom(GameRoom room, int tick = 100) { var timer = new System.Timers.Timer(); timer.Interval = tick; timer.Elapsed += ((s, e) => { room.Update(); }); timer.AutoReset = true; timer.Enabled = true; _timers.Add(timer); }
- 해결됨[C#과 유니티로 만드는 MMORPG 게임 개발 시리즈] Part7: MMO 컨텐츠 구현 (Unity + C# 서버 연동 기초)
Push 함수
안녕하세요 항상 좋은강의 감사합니다. Push 함수에서 Flush를 제거하시면서 해당 방식은 반응속도에 손해를 본다고 해주셨는데, 그럼 이때의 장점은 코드의 이해를 쉽게 한다는 것말고는 장점이 없는지 궁금합니다 만약 그렇다면 반응속도 향상을 위해 이전 코드를 사용하고자 합니다~!
- 해결됨[C#과 유니티로 만드는 MMORPG 게임 개발 시리즈] Part7: MMO 컨텐츠 구현 (Unity + C# 서버 연동 기초)
Arrow 함수 에서의 Push 사용
안녕하세요 Arrow의 Update에서 궁금한점이 있어서 문의드립니다. Arrow.cs에서 LeaveGame을 처리할 때 Push함수를 사용하도록 변경을 했는데 Arrow의 부모클래스인 Projectile의 Update 실행을 GameRoom의 Update 함수내에서 projectile.Update(); 의 호출로 실행해주고 있기 때문에 이미 Push가 Job으로 관리되고 있을것 같습니다. 그렇다면 혹시 Room.Push(Room.LeaveGame, Id); 부분도 Room.LeaveGame(Id); 로 사용해도 되는건지 궁금합니다~! public override void Update() { if (Data == null || Data.projectile == null || Owner == null || Room == null) return; if (_nextMoveTick >= Environment.TickCount64) return; long tick = (long)(1000/Data.projectile.speed); _nextMoveTick = Environment.TickCount64 + tick; Vector2Int destPos = GetFrontCellPos(); if (Room.Map.CanGo(destPos)) { CellPos = destPos; S_Move movePacket = new S_Move(); movePacket.ObjectId = Id; movePacket.PosInfo = PosInfo; Room.Broadcast(movePacket); Console.WriteLine("Move Arrow"); } else { GameObject target = Room.Map.Find(destPos); if (target != null) { target.OnDamaged(this, Data.damage + Owner.Stat.Attack); } //소멸 Room.Push(Room.LeaveGame, Id); }
- 해결됨[C#과 유니티로 만드는 MMORPG 게임 개발 시리즈] Part7: MMO 컨텐츠 구현 (Unity + C# 서버 연동 기초)
HandleSkill 내 Push(EnterGame, arrow) 함수 사용
안녕하세요 HandleSkill함수는 PacketHandler.cs에서 room.Push(room.HandleSkill, player, skillPacket);에 의해서 호출되고 있는것 같습니다. 그렇다면 HandleSkill함수에 포함된 Push(EnterGame, arrow); 는 이미 Job으로 관리되고 있기 떄문에, (기존의 방식대로) EnterGame(arrow); 로 호출해도 되는건지 궁금합니다~ public void HandleSkill(Player player, C_Skill skillPacket) { if (player == null) return; ObjectInfo info = player.Info; if (info.PosInfo.State != CreatureState.Idle) return; // TODO : 스킬 사용 가능 여부 체크 info.PosInfo.State = CreatureState.Skill; S_Skill skill = new S_Skill() { Info = new SkillInfo() }; skill.ObjectId = info.ObjectId; skill.Info.SkillId = skillPacket.Info.SkillId; Broadcast(skill); Data.Skill skillData = null; if (DataManager.SkillDict.TryGetValue(skillPacket.Info.SkillId, out skillData) == false) return; switch (skillData.skillType) { case SkillType.SkillAuto: { Vector2Int skillPos = player.GetFrontCellPos(info.PosInfo.MoveDir); GameObject target = Map.Find(skillPos); if (target != null) { Console.WriteLine("Hit GameObject !"); } } break; case SkillType.SkillProjectile: { Arrow arrow = ObjectManager.Instance.Add<Arrow>(); if (arrow == null) return; arrow.Owner = player; arrow.Data = skillData; arrow.PosInfo.State = CreatureState.Moving; arrow.PosInfo.MoveDir = player.PosInfo.MoveDir; arrow.PosInfo.PosX = player.PosInfo.PosX; arrow.PosInfo.PosY = player.PosInfo.PosY; arrow.Speed = skillData.projectile.speed; Push(EnterGame, arrow); } break; } }
- 해결됨[C#과 유니티로 만드는 MMORPG 게임 개발 시리즈] Part7: MMO 컨텐츠 구현 (Unity + C# 서버 연동 기초)
Remove함수의 _lock 설정
안녕하세요 다음과 같은 Remove함수에서 GetObjectTypeById에 대한 결과값을 받아올때 lock을 걸지 않으신 이유가 궁금합니다. public bool Remove(int objectId) { GameObjectType objectType = GetObjectTypeById(objectId); lock (_lock) { if(objectType == GameObjectType.Player) return _players.Remove(objectId); } return false; } 예를들어 멀티쓰레드 환경에서 Remove 함수가 두번 호출된다면 나중에 입력된 objectId에 대해서만 Remove만 실행되지 않을지 궁금합니다~
- 미해결[C#과 유니티로 만드는 MMORPG 게임 개발 시리즈] Part7: MMO 컨텐츠 구현 (Unity + C# 서버 연동 기초)
몬스터가 플레이어 바로 앞에 있는 상황에서도 CoPatrol로 인해 State가 Moving으로 설정됩니다.
따라서 애니메이션이 실행됩니다. 그런데 선생님의 실행 화면에서는 해당 현상이 나타나고 있지 않은 것 같습니다. 어떻게 해결해야 하나요?