월 17,600원
5개월 할부 시다른 수강생들이 자주 물어보는 질문이 궁금하신가요?
- 미해결[C#과 유니티로 만드는 MMORPG 게임 개발 시리즈] Part7: MMO 컨텐츠 구현 (Unity + C# 서버 연동 기초)
client폴더 vs server 폴더
환경준비 부분에서 server는 게임서버 부분이라고 설명주셨는데요 그러면 client 폴더는 다른 별도의 서버로 가게 되나요? 그 서버는 보통 무엇이라고 부르나요? 감사합니다.
- 미해결[C#과 유니티로 만드는 MMORPG 게임 개발 시리즈] Part7: MMO 컨텐츠 구현 (Unity + C# 서버 연동 기초)
FindPlayer를 하는 로직을 외부에서도 사용하게 하려면?
이번 강의가 확실히 많이 어렵기는 하네요.. 아무튼 FindPlayer를 외부에서도 사용하려면 Job에 Func를 추가하는 방식을 사용하면 괜찮을까요? Player를 리턴 받는 일감 또한 jobQueue에 저장해놓고 꺼내 처리하는 로직이 생각이 났는데 이렇게 하는 게 맞는가 싶어서요
- 미해결[C#과 유니티로 만드는 MMORPG 게임 개발 시리즈] Part7: MMO 컨텐츠 구현 (Unity + C# 서버 연동 기초)
3d 캐릭터 posistion 과 rotation 동기화
안녕하세요. 선생님 현재 케릭터 동기화 작업까지 완료했고, 움직임 동기화를 구현 중에 있습니다. 저는 사진처럼 3d 환경에서 UI 핸들링을 이용해서 플레이어의 posistion 과 rotation 을 동기화 하려고 합니다. 선생님께서는 좌우상하를 인덱싱해서 케릭터의 움직임을 주셨는데, 제가 작업할 때 고려해야할 부분이 어떤 것들이 있을까요? enum MsgId 에 C_MOVE = 4; C_ROT = 6; S_MOVE = 5; S_ROT = 7; 를 추가했고, 아래와 같이 추가해서 작업하고 있었습니다. - 학습 관련 질문을 남겨주세요. 상세히 작성하면 더 좋아요! - 먼저 유사한 질문이 있었는지 검색해보세요. - 서로 예의를 지키며 존중하는 문화를 만들어가요. - 잠깐! 인프런 서비스 운영 관련 문의는 1:1 문의하기를 이용해주세요.
- 미해결[C#과 유니티로 만드는 MMORPG 게임 개발 시리즈] Part7: MMO 컨텐츠 구현 (Unity + C# 서버 연동 기초)
유니티에서 메시지가 출력되지 않습니
아래 사진과 같이 출력이 되어야하는데, 안녕하세요 라는 문구가 출력되지 않습니다. 서버 콘솔 프로그램에는 문제가 없을 것을 확인했습니다. - 제가 만든 서버 프로그램과 선생님이 만드신 유니티 프로그램과 연동했더니 안녕하세요가 출력되었기 때문입니다. 그러면 제 유니티 프로젝트 문제로 보이는데, 왜 출력되지 않는지 확인이 어렵습니다 - 학습 관련 질문을 남겨주세요. 상세히 작성하면 더 좋아요! - 먼저 유사한 질문이 있었는지 검색해보세요. - 서로 예의를 지키며 존중하는 문화를 만들어가요. - 잠깐! 인프런 서비스 운영 관련 문의는 1:1 문의하기를 이용해주세요.
- 미해결[C#과 유니티로 만드는 MMORPG 게임 개발 시리즈] Part7: MMO 컨텐츠 구현 (Unity + C# 서버 연동 기초)
적 몬스터가 벽에 부비부비를 합니다
몬스터가 가끔 벽에 부비부비를 시전하는데, 이러한 현상은 다른 많은 게임에서도 볼 수 있던 버그입니다. 예를 들면 스타크래프트의 유닛이 가끔 길을 잃고 벽에 부비부비를 하는 경우가 많은데, 이것과 같다고 생각됩니다. 그래서 많이 볼 수 있는 버그이기 때문에, 정석적인 버그 해결 방법이 있을 것으로 생각됩니다..! 혹시 있다면 이런 현상은 보통 어떻게 해결하는지 여쭙고 싶습니다!
- 미해결[C#과 유니티로 만드는 MMORPG 게임 개발 시리즈] Part7: MMO 컨텐츠 구현 (Unity + C# 서버 연동 기초)
패킷 관련해서 궁금한점이 있습니다
의도한것은 아니었지만 수업을 따라하다가서버 솔루션을 작동시키고 나오는 콘솔창에마우스 커서를 실수로 드래그를 하고유니티 클라 3개를 서버에 입장시켰었습니다처음에 왜 안되지? 하며보다가 아 콘솔창 드래그했구나라며서버솔루션 중지했다 다시 재생을 하였는데"패킷모아보내기 : N개 " 디버깅메세지가 뜨면서캐릭터들이 쌓엿던 패킷대로 이동과 행동을 한번에 처리하니순간이동을 하거나 아주 빠르게 이동하고다른 플레이어가 볼떄대각선으로 이동하는거같이 보이고 그랬습니다비슷한 상황으로어릴적 온라인 게임을 하다 이런경우를 보곤했었는데결국 효율을 위해서 패킷을 모아보내기는 해야하지만 이렇게 쌓인 패킷이 많아 한번에 처리를 하려하면클라유저간 싱크가 안맞는 상황이 벌어지는게 맞을까요?마찬가지로 락도 잘 걸어야겠네요.. 너무 무섭습니다 서버..재밋는데 진짜 어렵기도하고요 ㅋㅋ
- 미해결[C#과 유니티로 만드는 MMORPG 게임 개발 시리즈] Part7: MMO 컨텐츠 구현 (Unity + C# 서버 연동 기초)
강의와 상관없는 질문이지만 궁금합니다
포톤같은 서버를 사람들이 이용하는것으로 알고있는데요이런 서버 구축과 연동을 익히다보면그런 서버를 이용하는것도 쉽게 이해하거나 적용하고싶어진다면 가능해질가요?
- 미해결[C#과 유니티로 만드는 MMORPG 게임 개발 시리즈] Part7: MMO 컨텐츠 구현 (Unity + C# 서버 연동 기초)
몬스터가 벽을 뚫고 맵 밖으로 나가버립니다 ㅜㅜ
제목 그대로 collision 처리해놓은 벽을 뚫고 그대로 나가버리는데 해결 방법을 모르겠습니다 .. 대각선으로 이동하면서 나가버리던데 이 부분에 대해서 질문 드리고 싶습니다..
- 미해결[C#과 유니티로 만드는 MMORPG 게임 개발 시리즈] Part7: MMO 컨텐츠 구현 (Unity + C# 서버 연동 기초)
화살이 나오는 위치를 0.5만큼 위로 올리고 싶습니다.
옆으로 발사할때만 화살을 0.5만큼 위로 올리려고 하는데 CellPos를 Vec3Int로 설정해서 정수밖에 설정이 안되네요 ArrowController의 Init에서 transform.position 설정을 해도 안되고.. Instantiate에서 ac.CellPos를 바꾸려 하니 Vector3Int에서 걸리고... 혹시 이것에 관해서 어떻게 해야하는지 정답은 아니고 조언정도를 좀 구할 수 있을까요?
- 미해결[C#과 유니티로 만드는 MMORPG 게임 개발 시리즈] Part7: MMO 컨텐츠 구현 (Unity + C# 서버 연동 기초)
player의 이동에 대하여..
안녕하세요!! 언제나 고생많으십니다. 오랜만에 질문드립니다!! 서버 작동되는 흐름 파악하면 클라이언트를 까먹고 클라 공부하면 또 서버 까먹어서 상당히 어렵네요..ㅎ 오랜만에 다시 클라 작동방식 다시 복습하고 있는데 예전에 정확히 알아보지 않고 넘어갔던 흐름을 디버깅하면서 다시 보고 있습니다.. 지금까지 혼자 파악한 흐름을 잠시 정리해보면...(MyPlayer가 움직을 때 기준) 코드 흐름 상 처음에 방향키를 한 번 받아 Dir가 바뀌면 ① 그 턴의 Update문에서 UpdateController를 호출하면서 UpdateIdle을 호출하고 거기에서는 State만 Moving으로 바뀌고 return 해준 다음 ② 다음 턴의 Update문의 UpdateController에서 UpdateMoving으로 가게 되고 그 턴에서는 아직 destPos가 아직 바뀌지 않았으므로 MoveToNextPos로 바로 들어가게 되어 CellPos를 방향키 칸으로 바꾸어 준 다음 ③ 다음 턴의 Update의 UpdateController에서 UpdateMoving으로 가서 스르륵 동작을 시작하고 ④ 몇 번의 UpdateMoving 반복 끝에 목적지에 도착하면 그때는 Dir 가 None 이기 때문에 State를 Idle로 돌리고 return하는 것으로 파악하였습니다. 여기서 정말 이해하기 힘들었던건 UpdateMoving에 처음 진입할 때는 이미 기본 Update문이 (UpdateIdle 실행으로) 한 번 돌고 난 후인데도 MoveToNextPos로 넘어갔을 때 여전히 Dir가 Up을 유지하고 있어서 if (Dir == MoveDir.None) { State = CreatureState.Idle; CheckUpdatedFlag(); return; } 에서 CreatureState.Idle로 바뀌고 바로 return 하지 않은 점 입니다.. 너무 궁금해서 일일이 로그를 찍어 확인하니 아무리 키를 사아알짝 눌러도 키가 눌리는 로그는 2~3번이 찍히는 것으로 보아 2~3번의 Update 문이 돌 때까지는 MyPlayerController.cs의 UpdateController의 CreatureState.Moving 케이스에서 GetDirInput()을 호출하더라도 키 값이 입력되어 Dir이 Up을 유지하는 것을 파악하였습니다... (틀린 부분이 있다면 길어서 죄송하지만 지적 부탁드립니다..) Q. 라이브 코딩식으로 강의를 진행하시면서 이런 부분까지 어떻게 생각하면서 진행을 하시는건 지 궁금합니다...역시 많이 해봐야 감각이 생기는 걸까요?? (예를 들면 'MoveToNext는 두번째 Update에서 진입할테지만 KeyInput은 두세번은 연타로 눌리니 아직까진 Dir가 MoveDir.None이 아닐꺼야... if 에 (Dir == MoveDir.None) 를 써도 괜찮아!' 이런식의 생각을 하시는 걸까요..?) 또 한 가지 더 궁금한게 있는데요!! MyPlayer가 한 칸 움직일 떄 Dir, State, cellPos까지 세팅된 패킷이 한 번 가고 State가 Idle로 바뀔 떄 또 한 번 패킷이 보내져 두 번의 Broadcasting이 되는 것으로 파악됩니다.. Q 이때 타 클라이언트의 화면에 뜬 MyPlayer 게임오브젝트를 보았을 때 MyPlayer 클라이언트에서 처음 보낸 패킷에 의해 타 클라이언트의 MyPlayer 게임오브젝트에 붙은 CreatureController의 UpdateMoving으로 스르륵 움직이는 동작이 else문에 의해 반복되다가 if(dist < _speed * Time.deltaTime) 에 걸려 transform.position = destPos; 으로 설정되기도 전에 CreatureState.Idle을 담고 있는 다음 패킷이 전송되어 타 클라이언트의 MyPlayer 게임오브젝트의 움직이는 애니메이션이 도중에 뚝 끊기지 않으리라는 보장을 어떻게 하는걸까요..? 질문이 쓸데없이 길고 읽기도 귀찮으시겠지만 혼자 좀 잘못 된 방향으로 가고 있는게 아닌가라는 불안감이 커서 이렇게 라도 질문드립니다..! 한 번 읽어주시고 시간 나실 때 답변 부탁드립니다!!
- 미해결[C#과 유니티로 만드는 MMORPG 게임 개발 시리즈] Part7: MMO 컨텐츠 구현 (Unity + C# 서버 연동 기초)
Tile collision에 관한 질문입니다.
.
- 미해결[C#과 유니티로 만드는 MMORPG 게임 개발 시리즈] Part7: MMO 컨텐츠 구현 (Unity + C# 서버 연동 기초)
7강 마무리 코드가 aws에서 이상한 동작을 합니다.
7강 마무리 서버코드를 받아서 릴리즈로 실행하기 위한 작업을 몇가지 한뒤에, 로컬에서 돌려서 정상작동하는걸 확인하고, aws에 올려서 테스트 했습니다만, 서버쪽에선 이상한 곳에서 함수 동작이 멈춰버리고, 클라쪽에선 접속하고 캐릭터가 스폰되지 않아 배경만 덩그러니 있습니다. 멀티스레딩 비동기 프로그래밍에 익숙하지 않은 저로선 전혀 예상이 안가는 이상한 동작을 하여 질문드립니다. aws에서 인바운드규칙 설정하였고, public IP DNS로 Liseten걸어놨습니다. 1) 클라쪽 동작 로그 2) 서버쪽 동작 로그 3. 이상 동작을 확인하기위해 함수 한줄마다 Log를 찍어놨습니다. public void EnterGame(GameObject gameObject) { int checkCount = 0; Console.WriteLine($"EnterGame{++checkCount} int checkCount = 0;"); if (gameObject == null) return; Console.WriteLine($"EnterGame{++checkCount} if (gameObject == null)"); GameObjectType type = ObjectManager.GetObjectTypeById(gameObject.Id); if (type == GameObjectType.Player) { Console.WriteLine($"EnterGame{++checkCount} if (type == GameObjectType.Player)"); Player player = gameObject as Player; Console.WriteLine($"EnterGame{++checkCount} Player player = gameObject as Player"); _players.Add(gameObject.Id, player); Console.WriteLine($"EnterGame{++checkCount} _players.Add"); player.Room = this; Console.WriteLine($"EnterGame{++checkCount} player.Room = this;"); Map.ApplyMove(player, new Vector2Int(player.CellPos.x, player.CellPos.y)); Console.WriteLine($"EnterGame{++checkCount} Map.ApplyMove"); // 본인한테 정보 전송 { Console.WriteLine($"EnterGame{++checkCount} ---------- me -----------"); S_EnterGame enterPacket = new S_EnterGame(); Console.WriteLine($"EnterGame{++checkCount} new S_EnterGame()"); enterPacket.Player = player.Info; Console.WriteLine($"EnterGame{++checkCount} enterPacket.Player = player.Info"); player.Session.Send(enterPacket); Console.WriteLine($"player.Session.Send(enterPacket); {enterPacket.Player}"); S_Spawn spawnPacket = new S_Spawn(); Console.WriteLine($"S_Spawn spawnPacket = new S_Spawn(); {enterPacket.Player}"); foreach (Player p in _players.Values) { if (player != p) spawnPacket.Objects.Add(p.Info); } Console.WriteLine($"EnterGame{++checkCount}"); foreach (Monster m in _monsters.Values) spawnPacket.Objects.Add(m.Info); foreach (Projectile p in _projectiles.Values) spawnPacket.Objects.Add(p.Info); player.Session.Send(spawnPacket); } } else if (type == GameObjectType.Monster) { Monster monster = gameObject as Monster; _monsters.Add(gameObject.Id, monster); monster.Room = this; Map.ApplyMove(monster, new Vector2Int(monster.CellPos.x, monster.CellPos.y)); } else if (type == GameObjectType.Projectile) { Projectile projectile = gameObject as Projectile; _projectiles.Add(gameObject.Id, projectile); projectile.Room = this; } // 타인한테 정보 전송 { Console.WriteLine($"EnterGame{++checkCount} ---------- other -----------"); S_Spawn spawnPacket = new S_Spawn(); spawnPacket.Objects.Add(gameObject.Info); Console.WriteLine($"EnterGame{++checkCount} spawnPacket.Objects.Add(gameObject.Info);"); foreach (Player p in _players.Values) { if (p.Id != gameObject.Id) p.Session.Send(spawnPacket); } } }
- 미해결[C#과 유니티로 만드는 MMORPG 게임 개발 시리즈] Part7: MMO 컨텐츠 구현 (Unity + C# 서버 연동 기초)
구글 프로터버퍼 Error에 대한 질문입니다.
안녕하세요 Rookies님 어제도 질문 남겼었는데 EnterGame을 처음에 많이 했을 때 프로토버퍼에서 이러한 에러가 나는데 어떠한 상황을 의심할 수 있는 건가요? OnRecvCompleted Failed Google.Protobuf.InvalidProtocolBufferException: While parsing a protocol message, the input ended unexpectedly in the middle of a field. This could mean either that the input has been truncated or that an embedded message misreported its own length. 너무 많은 처리를 하려고 하거나 혹은 필드를 15개 이상 사용할 때 날 수 있는 에러인가요? 보통 어떠한 경우에 이러한 에러가 나는지 궁금합니다..!
- 미해결[C#과 유니티로 만드는 MMORPG 게임 개발 시리즈] Part7: MMO 컨텐츠 구현 (Unity + C# 서버 연동 기초)
Instantiate 관한 질문입니다!
안녕하세요 Rookies님 오픈월드 3D 유니티 게임을 제작중에 있습니다. 여러가지 몬스터, 보스, 던전, 퍼즐 및 협동 요소들이 있는 RPG게임입니다. 워낙 게임 Mpa을 크게 만들어서(거의 배틀 그라운드 정도의 수준입니다.. 7km x 7km) 일반 몬스터가 6종 정도가 있는데 서버에서 처음 Init할 때 EnterGame(몬스터)를 통해서 처음부터 미리 깔아놓을 생각이였습니다. 그런데 테스트를 위해 1000마리만 입장 시켜도 프레임이 너무 떨어지더라고요.. 프레임이 떨어지는 원인은 서버로 받은 EnterGame을 통해 클라이언트가 ObjectManager에서 Instantiate를 1000번 해서 그런것인가요? 이거에 대한 해결책이 어떠한 방법이 있는지 조언 좀 해주실 수 있을까요??!!.. 현재 멍청한 AI 몬스터는 서버에서 3초마다 가야할 방향을 몬스터의 현재 좌표 기준으로 사각형을 그린 다음 그 사각형의 위치에서 랜덤한 값을 줍니다. 그러면 클라이언트는 MoveToWard나 Nav를 사용하여 그 위치로 가게 만듭니다. 똑똑한 AI 몬스터는 자기 일정 범위안에 원을 그리고 FindWithtag를 통해 Player를 찾아 그 Player를 향해 Nav를 적용시키게 됩니다. 서버에서 처리하지 않고 클라에서 처리했지만 몬스터의 target이 모두 같기 때문에 해당 몬스터가 같은 사람을 따라오게 됩니다. 굉장히 꼼수를 써서 만들었습니다.. 입장은 서버에서 시키되 움직임은 클라에서 시키고 그 움직임은 코드상 동일할 수 밖에 없게 만들었습니다. 처음에 1000마리를 입장은 시키되 입장 시키자마자 모든 GameObject.setActive(false)로 하고 플레이어가 근처에 오면 해당 몬스터의 setActive(true)로 하는 방법을 생각해봤는데 이것도 결국 Player 입장에서 입장한 몬스터의 모든 CellPos와의 위치를 재야하다보니 방법이 아닌거 같기도 합니다.. MMO 오픈월드 게임에서 몬스터의 배치는 몬스터가 생성될 수 있는 최대 개수를 지정하고 그만큼 까지만 Spawn하고 죽으면 Despawn하고 Despawn된 몬스터를 다시 재사용해서 Spawn 시키고 이 방법이 최선인 것인가요??!! 몬스터를 배치하는 방식에 대한 방법이나 각각의 장단점들에 대해 알려주시면 정말 감사하겠습니다!
- 해결됨[C#과 유니티로 만드는 MMORPG 게임 개발 시리즈] Part7: MMO 컨텐츠 구현 (Unity + C# 서버 연동 기초)
멀티스레드 와 Lock 질문
안녕하세요. 항상 양질의 강의 감사합니다! 복습중 이해가 확실히 안되는 부분이 있어 질문드립니다. 서버에서 다양한 곳에서 Player를 이동시킬 수 있기 때문에(다른 플레이어가 스킬로 Player를 밀쳐내는 등..) Player를 이동시키는 부분은 한 곳에 몰아서 Lock을 걸고 실행시켜 준다고 설명해 주셨습니다. 그래서 위처럼 GameRoom에 Player가 움직이는 로직을 몰아서 Lock을 걸어주셨는데, 제가 궁금한 점은, HandleMove멤버함수에서 특정 Player를 참조(?) 하고있는 인자 player를 가지고 Lock을 걸고 작업을 하고 있을 때, 다른 클래스의 맴버함수에서도 똑같은 Player를 참조해서 Lock을 걸고 작업하려고 한다면 Lock이 걸리나요? Lock을 건다는건 메모리상에 실제로 생성된 객체(?)를 기준으로 걸리는 건가요? 설명이 많이 미흡한 점 죄송합니다 ㅜ.
- 미해결[C#과 유니티로 만드는 MMORPG 게임 개발 시리즈] Part7: MMO 컨텐츠 구현 (Unity + C# 서버 연동 기초)
unity 172,30.1.35 서버 ::1
서버의 "안녕하세요" 메세지가 클라이언트로 넘어오지않아 무슨 이유에서인지 연결이 되지 않고 있는것같습니다. 그래서 서버와 클라 ipAddress 로그를 찍어보았는데 제목 처럼 다른 형태로 나옵니다. 이것이 혹시 연결이 안되는 이유가 되는것일까요?
- 미해결[C#과 유니티로 만드는 MMORPG 게임 개발 시리즈] Part7: MMO 컨텐츠 구현 (Unity + C# 서버 연동 기초)
해당 강의 영상의 해상도가 너무 낮네요.
인프런의 오류인가요?ㅠㅠ 눈이 너무 아픕니다.
- 미해결[C#과 유니티로 만드는 MMORPG 게임 개발 시리즈] Part7: MMO 컨텐츠 구현 (Unity + C# 서버 연동 기초)
서버연동 수강중 질문드립니다.
현재 수강 내용상 플레이어의 움직임이나 투사체 등 그리드 단위로 움직이고, 좌표도 Vector2Int로 주고받고 있는데 만약 투사체를 플레이어와 다르게 Rigidbody2D를 붙여 Addforce impulse의 기능을 빌려 포물선을 그리며 날아가게 한다고 하면 이럴때 클라이언트에서 보내는 정보와 서버에서의 검증(위치나 타격)은 어떤식으로 이루어져야할까요? 추가로 이런 멀티플레이환경에서 포물선의 움직임을 구현하려면 Rigidbody같은 기능을 쓰기보단 직접 공식을 넣어 사용하는게 좋을까요? 이게 수업과 별개의 질문이 되는건지 판단이 잘 안서서.. 조심스레 질문드립니다 ㅠ
- 미해결[C#과 유니티로 만드는 MMORPG 게임 개발 시리즈] Part7: MMO 컨텐츠 구현 (Unity + C# 서버 연동 기초)
서버 측에서의 맵데이터 관리 및 충돌판정
이번 강의를 보면서 궁금했던 점 중 하나가 맵에 대한 정보를 사전에 만들어서 클라와 서버가 사용하는 방식의 경우 특정 사용자가 악의적으로 맵에 대한 정보를 클라쪽에서만 수정할 수 있을 거 같습니다. 해당 방식말고 서버측에서만 맵 데이터를 만들고, 클라이언트가 접속을 할 때 서버측에서 파일을 전송하거나 정보를 제공하는 방식으로도 구현하는 경우가 있나요? 다른 궁금점은 타일맵같은 경우는 충돌판정이 비교적 간편해서 사용자가 손쉽게 구현하여 적용할 수 있는데, 2D, 3D 충돌판정은 타일맵보다 복잡하고 성능을 많이 잡아먹는데 서버측에서 계산하여 클라이언트에게 충돌 판정여부를 알리나요? 굳이 알리지 않더라도 2D, 3D 게임에서 충돌판정여부를 서버 측에서도 계산하여 Hit판정이나 이동가능 판정같은 거를 게임에 적용하나요?
- 미해결[C#과 유니티로 만드는 MMORPG 게임 개발 시리즈] Part7: MMO 컨텐츠 구현 (Unity + C# 서버 연동 기초)
다른 컴퓨터와 임시 테스트
안녕하세요. 지금 파트 7까지 듣고 이런저런 컨텐츠들을 올려서 응용을 해보고 있습니다. 테스트 삼아 다른 컴퓨터에서 접속을 해서 같이 플레이를 해보고 싶은데, 나중에 배우겠지만 간단하게 방법을 알 수 있을까요? 서버나 클라쪽에서 이부분을 건들면 될 것같은데.. 검색을 해도 명확한 답을 찾기가 힘드네요.ㅠ 정말 간단하게 연결만 되면 됩니다! 만약 여기서 글로 설명하기 복잡한 부분이라면 설명 안해주셔도 괜찮습니다! 나중에 강의를 다듣고 따로 해볼게요.