묻고 답해요
169만명의 커뮤니티!! 함께 토론해봐요.
인프런 TOP Writers
-
해결됨[C#과 유니티로 만드는 MMORPG 게임 개발 시리즈] Part4: 게임 서버
ClientSession의 Room이 null인 경우
안녕하세요.Part 4를 완강하고 Part 7으로 넘어가기 위해새로운 솔루션을 생성해서 기존 Part 4 솔루션 내의프로젝트들을 우선 Ctrl + C, V 한 뒤 기존 프로젝트 추가로Part 7에서 사용할 서버 솔루션을 Part 4와 동일하게 맞추는 작업을 하고 있었습니다!그런데, DummyClient의 연결 수를 20개 정도로 하면 문제가 없지만, 30개부터는 특정 ClientSession의 Room이 null인 상태에서 서버 측의 C_MoveHandler가 실행되어 서버가 뻗어버리는 경우가 간헐적으로 발생하고 있습니다.(강의 보면서 따라 한 솔루션은 100이면 100 잘 되며, 새롭게 복사한 솔루션은 대부분 잘 되지만 가끔식 위 오류가 발생합니다..) 처음엔 단순히 Ctrl+C , V 하는 과정에서프로젝트나 솔루션의 설정값들이 새로운 경로로 옮기면서 동기화가 안되어 생기는 문제인 줄 알았는데,코드를 계속 천천히 읽다보니 의문이 들게 되었습니다. public GameRoom? Room { get; set; }public override void OnConnected(EndPoint? endPoint) {Console.WriteLine($"OnConnected: {endPoint}");Program.Room.Push(() => Program.Room.Enter(this));}제가 이해한 바로는ClientSession의 Room은Listener에 의해서 ClientSession.OnConnected가 호출되며 Program.Room에게 Enter(this)를 요청하고,이후 Program.Room은 Flush()를 통해 특정할 수 없는 시점에 비로소 Enter를 호출하게 되며, ClientSession.Room이 자기 자신을 가리키도록 합니다. 그런데, 정말 운이 안 좋다면 Program.Room이 A번 ClientSession에 대한 Enter 작업이 미처 다 수행되기 전에DummyClient 측의 SendForEach로 인해 A번 ClientSession과 대응되는 ServerSession으로 이동 패킷을 보내고,최종적으로 A번 ClientSession의 Room이 null인 상태에서 C_MoveHandler를 실행 할 여지가 있는 것이 아닌가 생각하게 되었습니다. 혹시 제가 생각하고 있는 것이 맞는건지,아니면 단순하게 솔루션을 잘못 복사해와서 문제가 생긴건지궁금합니다..만약 그런 여지가 있다면 단순히 room이 아직 null인지 체크하고 이동 패킷을 무시하면 되는걸까요?
-
미해결[C#과 유니티로 만드는 MMORPG 게임 개발 시리즈] Part1: C# 기초 프로그래밍 입문
struct활용 방법
한 가지의 공통된 주제를 가지고 있는 속성들을 struct에 여러 데이터형식과 이름으로 저장해두고 각각 필요한 함수에 넣어서 사용하는거 맞나요?활용하는 방법은 하나의 클래스에 저장해두고 여러 클래스에다가 사용하는거 맞나요?예를 들어 스탯과 관련된 큰 클래스에다가 struct함수를 만들어 정리해두고 각각 다른 클래스에다 호출해서 사용하는거요
-
미해결[켠김에 출시까지] 유니티 방치형 키우기 게임 (M1 + C1)
Json 파싱 형식
제이슨을 파싱하는 과정중에서 int, class 형식으로 가져오고 있는데 string, class 형식으로도 가져오게 할 수 있나요?? [Serializable] public class ValueDataLoader : ILoader<int, ValueData> { public List<ValueData> datas = new List<ValueData>(); public Dictionary<int, ValueData> MakeDict() { Dictionary<int, ValueData> dict = new Dictionary<int, ValueData>(); foreach (ValueData Data in datas) dict.Add(Data.ID, Data); return dict; } }
-
미해결[C#과 유니티로 만드는 MMORPG 게임 개발 시리즈] Part3: 유니티 엔진
SetInfo를 이용한 아이템 이름 변경
public override void Init() { Bind<GameObject>(typeof(GameObjects)); Get<GameObject>((int)GameObjects.ItemNameText).GetComponent<Text>().text = _name; Get<GameObject>((int)GameObjects.ItemIcon).BindEvent((PointerEventData) => { Debug.Log($"아이템 클릭! {_name}"); }); } public void SetInfo(string name) { _name = name; }UI_Inven_Item에 있는 내용인데UI_Inven에서 invenItem.SetInfo("집행검 어쩌구");를 하면 UI_Inven_Item의 _name만 바꿔줬을 뿐인데어떻게 Component의 값 까지 바뀌는거죠?제가 생각할 떄는 SetInfo안에Get<GameObject>((int)GameObjects.ItemNameText).GetComponent<Text>().text = _name;이 코드가 필요한거 같은데어떻게 ItemNameText가 업데이트가 되는지 모르겠습니다.
-
해결됨[켠김에 출시까지] 유니티 방치형 키우기 게임 (M1 + C1)
spine을 animator로 교체
안녕하세요 3주 차 코드로 공부하고 있는 중 spine 을 animator controller로 교체하려고 하는데요. Creature.cs 의public virtual void SetInfo(int templateID) { . . SkeletonAnim.skeletonDataAsset = Managers.Resource.Load<SkeletonDataAsset>(CreatureData.SkeletonDataID); SkeletonAnim.Initialize(true); // Register AnimEvent if (SkeletonAnim.AnimationState != null) { SkeletonAnim.AnimationState.Event -= OnAnimEventHandler; SkeletonAnim.AnimationState.Event += OnAnimEventHandler; }부분에서 SkeletonAnim.skeletonDataAsset = Managers.Resource.Load<SkeletonDataAsset>(CreatureData.SkeletonDataID); 는캐릭터 간 다른 애니메이션을 사용하기 위해 json에서 읽어온 animator 파일을 지정하는 걸로 이해하고Animator Controller로 교체했는데요.BaseObject.cs public Animator SkeletonAnim { get; private set; }Creature.cspublic virtual void SetInfo(int templateID) { . . SkeletonAnim.runtimeAnimatorController = Managers.Resource.Load<RuntimeAnimatorController>(CreatureData.SkeletonDataID); // Animator Controller로 교체 // Register AnimEvent if (SkeletonAnim.AnimationState != null) { SkeletonAnim.AnimationState.Event -= OnAnimEventHandler; SkeletonAnim.AnimationState.Event += OnAnimEventHandler; } SkeletonAnim.AnimationState.Event -= OnAnimEventHandler;SkeletonAnim.AnimationState.Event += OnAnimEventHandler;이 부분은 왜 사용하는지 어떻게 수정해야 되는지 모르겠습니다.
-
미해결[C#과 유니티로 만드는 MMORPG 게임 개발 시리즈] Part1: C# 기초 프로그래밍 입문
정수 범위의 비밀
보통 int로 사용하신다고 하셨는데 만약 레벨이 롤처럼 18이 최대라면 int보단 sbyte나 byte를 쓰는게 더 좋나요?
-
해결됨Backend 멀티쓰레드 이해하고 통찰력 키우기
어떻게 상호배제가 이루어지는지 잘 이해가 안갑니다
private void Write(){// 다른 스레드가 읽기나 쓰는지 검증 ...var request = DateTime.Now.ToString();Interlocked.Increment(ref writeCount);//...쓰기작업}03:40 부분의 내용입니다스레드1 이 var request = DateTime.Now.ToString();이 부분을 실행할때는 아직 writeCount 가 0인 상태인데이때 스레드2가 writeCount와 readCount 0인거 확인하고들어올 위험은 없는건가요? 어떻게 상호배제 되는지 이해가 안갑니다!
-
미해결[C#과 유니티로 만드는 MMORPG 게임 개발 시리즈] Part3: 유니티 엔진
hit.point
Wall을 새워두고(hit.point - _player.tranform.position).maginitude * 0.8f를 하게 되는데hit.porint는 카메라기준으로 Ray가 나갔을 때벽에 닿는 바로 그 순간인가요?그렇다면 벽이 만약 두꺼우면 0.8f을 잘못 설정하면 카메라가 벽안으로도 들어갈수 있나요?
-
해결됨[C#과 유니티로 만드는 MMORPG 게임 개발 시리즈] Part7: MMO 컨텐츠 구현 (Unity + C# 서버 연동 기초)
리슨서버(호스트) 질문입니다
안녕하세요, 루키스님.개인 프로젝트를 진행하는 중 리슨서버를 구현해보려고 하는데 몇 가지 궁금한 점이 있습니다.리슨서버를 구현하려면 서버 코드를 모두 클라이언트에 이식하고, 컴포넌트로 관리할 수 있도록 수정해야 하나요?만약 1의 가정이 맞다면, 1을 통해 구현된 서버에서 유니티엔진의 기능들을 사용할 수 있지 않을까 생각이 되는데, 만약 된다면 충돌과 관련된 부분을 처리하는데 활용해도 괜찮을까요?유니티 자체에서도 네트워크를 관리해주는 매니저를 제공하는 것으로 알고있는데, 강의처럼 따로 서버를 구현하는 이유는 역시 성능 때문일까요? 현재 생각 중인 방식이 어몽어스와 유사한데요.중앙 서버에서 방을 생성하는 유저(호스트)들의 ip와 방 정보를 가지고 단순히 방 목록을 관리하며 클라이언트들이 접속할 수 있는 역할만 해주고, 클라이언트가 방에 접속하는 순간부터 모든 처리는 호스트가 하게되는... 구조가 맞을까요? 최근 들어 질문을 자주하게 되는 것 같은데..항상 친절히 답변해주셔서 감사합니다.
-
해결됨Backend 멀티쓰레드 이해하고 통찰력 키우기
임계영역에 2개 이상의 스레드가 올 수 있는지요?
안녕하세요섹션4 코드를 보면 requests 라는 오브젝트 키를 사용해서스레드1과 스레드2가 임계영역을 이용중인데서버 함수를 보면 일이 없으면 lock 안에서 wait 즉 대기 상태로 빠집니다 그리고 클라 함수를 보면 일을 넣어주고 다른 스레드를 깨웁니다여기서 의문인게 임계영역 안에서 대기중인 스레드와 실행중인 스레드가 공존할 수 있나요 https://www.inflearn.com/questions/1046075제가 다른 수업에서 한 질문인데 답변에는 ai 답변이긴 하지만그럴 수 없다고 들어서 질문드립니다
-
미해결[C#과 유니티로 만드는 MMORPG 게임 개발 시리즈] Part4: 게임 서버
[8:15] GetBytes, GetByteCount 문자열 파싱 질문입니다.
안녕하세요 강사님! GetBytes로 문자열을 파싱하는 과정에서 질문이 있습니다.위의 이미지를 보면 GetBytes 후 Length를 가져와도 8바이트가 나오는데 바이트를 먼저 가져온 후 Length를 가져오면 안 되는 것인가요? 길이를 파싱하는 부분을 제거하여 돌려 보았는데 결과는 잘 나오는 것 같았습니다.여러 번 강의를 돌려봤지만 '몇 바이트가 와야 조립이 되는지 확인하기 위해 두 단계로 나눈 것'이라고 들었습니다. 이 순서가 반대가 되면 조립 가능성 확인을 못하게 되는 것이 이해가 안 가서 질문 드립니다.감사합니다.
-
미해결[C#과 유니티로 만드는 MMORPG 게임 개발 시리즈] Part7: MMO 컨텐츠 구현 (Unity + C# 서버 연동 기초)
Tilemap_base에서 맵 크기를 불러올 때
제가 설정한 맵 모양이랑 메모장에 나오는거랑 다르게 좀 더 크게 잡히고 있는데 그 이유를 잘 모르겠습니다Tilemap_Base에 가장 끝부분에 상자를 넣어이런식으로 만든후 tools를 켠 다음 실행을 시키면이렇게 상자가 끝애 나오지만 캐릭터가 있는 앞 칸에서 움직이지 못하게 되는데 왜 그런걸까요
-
미해결[켠김에 출시까지] 유니티 방치형 키우기 게임 (M1 + C1)
멘토링 신청 질문
이번에 운영하신다는 오마카세 언리얼5 강의는,기존에 온라인 강의로 오픈하신 언리얼5 강의 3개랑 무슨 차이 인가요?어떤 강의가 더 깊게 알려주는 지 궁금합니다.
-
미해결WPF (.NET Core, C#, 자막제공)
UserControl 관련
안녕하세요, Usercontrol 뷰와 뷰모델 파일을 만들어서 해당 유저컨트롤 뷰에 이벤트 컨트롤 (버튼 기능)을 Command를 통해 구현하고자 했는데 되지 않았습니다. 아마 코드 비하인드 단에 강의에서 MainViewModel과 MainView를 연동하는 법처럼 DataContext = 해당 뷰모델을 할당해주지 않아서 그런것 같은데. 해당 UserControl 뷰 비하인드에 UserContriolViewModel을 할당해주면 에러가 뜨더군요.(닫기/최소화/최대화 버튼 기능을 가진 유저컨트롤은 메인 뷰에 불러와서 사용할 예정입니다.)다른 뷰와 뷰모델을 만들시 이를 어떻게 동작시킬수 있는건지요? - 학습 관련 질문을 남겨주세요. 상세히 작성하면 더 좋아요! - 먼저 유사한 질문이 있었는지 검색해보세요. - 서로 예의를 지키며 존중하는 문화를 만들어가요. - 잠깐! 인프런 서비스 운영 관련 문의는 1:1 문의하기를 이용해주세요.
-
미해결[켠김에 출시까지] 유니티 방치형 키우기 게임 (M1 + C1)
AttackBuff.ClearEffect() 메서드 문의
버프류 스킬 AttackBuff.ClearEffect() 메서드 관련 궁금한 점이 있습니다. public override bool ClearEffect(EEffectClearType clearType) { if(base.ClearEffect(clearType) == true) RemoveModifier(Owner.Atk, this); return true; } 여기서 base.ClearFffect() 는ObjectManager.Despawn()을 호출하고, 이건 또ResourceManager.Destroy()를 호출함으로써AttackBuff가 붙어있는 EffectBase 프리팹을 날려버리면서 true를 반환하는걸로 이해하는데요,이 경우 AttackBuff 인스턴스가 날라가게 되는데 그 다음줄 RemoveModifier가 실행되고, 또 자기 자신을 인자로 넘겨줄 수가 있나요?RemoveModifier(Owner.Atk, this);
-
해결됨[C#/.NET 6.0]어서와, Blazor WebAssembly는 처음이지?
빌드 오류 관련 문의 드립니다,
섹션2-데이터입력디자인파트1-08:01부터는 이상하게 빌드에러가 계속나네요. 구글검색으로도 해결이 안되서 강좌 처음부터 다시 작성해서 해도 계속 발생해서 문의 드립니다,. 에러내용 : ---------------------------Microsoft Visual Studio---------------------------하나 이상의 오류가 발생했습니다.디버그 어댑터를 시작하지 못했습니다. 출력 창에서 추가 정보를 확인할 수 있습니다."Failed to launch browser!TROUBLESHOOTING: https://github.com/GoogleChrome/puppeteer/blob/master/docs/troubleshooting.md" 브라우저를 시작할 수 없음
-
미해결유니티 Addressable 을 이용한 패치 시스템 구현
Unable to load dependent bundle from....
원래는 아무 문제 없이 다운로드 받고 로드도 됐었습니다..근데.. 첫 다운로드(aws s3 버킷) LoadAssetAsync로 로드하면 갑자기 이렇게 뜹니다..원래는 안이랫는데..아무 코드도 고치지 않았어요... 예제에 나온대로 그대로 했고 이거구요 json 파일 확인해보면이렇게 있고..(형광펜으로 칠한 부분) 앱을 껐다 키고 다시 실행하면 로딩 성공합니다.. 이유를 모르겠어요... 에디터 2021 lts -> 2022 lts로 업데이트 하고 어드레서블도 1.21 버전으로 업그레이드 했어요. 1.21 버전부터 DownloadDependenciesAsync가 바뀌었고 더 이상 에셋 번들을 메모리에 불러오지 않는 것으로 바뀌어서 LoadAssetAsync 하면 unable to load 오류가 뜨게 되었어요 해당 문제 글은 많지만 해결책이 없네요..어떻게 해야 할까요 해당 글 출처(https://forum.unity.com/threads/unable-to-load-dependent-bundle-from-location.1493702/)
-
미해결[C#과 유니티로 만드는 MMORPG 게임 개발 시리즈] Part7: MMO 컨텐츠 구현 (Unity + C# 서버 연동 기초)
3D의 경우 맵 정보
안녕하세요! 좋은 강의 감사합니다!3D 게임의 경우도 마찬가지로 Map에 대한 정보를 서버에서 가지고 있어야 할 것 같다는 생각이 듭니다.그런데 2D의 같은 경우는 좌표를 통해서 저장할 수 있었지만 3D는 어떻게 Map의 정보를 저장하고 관리할 수 있을까요??구체적인 방법이 떠오르지 않아서 질문 글 납깁니다.
-
해결됨[C#과 유니티로 만드는 MMORPG 게임 개발 시리즈] Part4: 게임 서버
안녕하세요! UDP 관련 질문입니다!
안녕하세요, 강사님!프로젝트를 진행하던 중 UDP 통신이 필요할지 고려해야 되는 부분이 있다고 생각되어 질문해봅니다 ㅎ..강의에서 사용된 코드에서 Listener와 Connector부분에서 매개변수로 넘겨지는 ProtocolType부분을 Tcp에서 Udp로 변경하면 UDP 통신이 수행되는 건가요??
-
미해결[켠김에 출시까지] 유니티 방치형 키우기 게임 (M1 + C1)
apk 빌드하면 먹통되요
핸드폰에서 한번 해볼까 하고 안드로이드 apk 빌드해서 LDplayer 나 핸드폰 s22 울트라 정도에서 해보려했는데 안되네요 혹시 다른 버전은 다 되고 있나요?일단 터치 안되서 모바일 터치로 변경 했구요그러니 잘되네요 Game Sceen으로 넘어가는 부분도물론 찾아 봐야 겠지만 어떤 문제인지 폰에서는넘어가지지 않구요. 다른분들은 다 잘 되시나요?시뮬레이터에서는 아무 이상없이 잘됩니다.핸드폰 및 LDPlayer 가면 그러네요...Window 빌드 해서 해보니 안되네요...시뮬레이터 빼고 다안될듯 혹시 알아내신분있으면 공유 부탁드려요~~애러가 상당히 많이 나는데...뭐가 문제지 흠.. 강의 소스 그대로 사용했어요