묻고 답해요
145만명의 커뮤니티!! 함께 토론해봐요.
인프런 TOP Writers
-
해결됨[C#과 유니티로 만드는 MMORPG 게임 개발 시리즈] Part4: 게임 서버
공간이 부족해서 기존 청크를 날리는 건 괜찮을 걸까요?
Queue<byte[]> _sendQueue = new Queue<byte[]>();_sendQueue.Enqueue(sendBuff);이렇게 sendBuff를 넣어놔서 누군가 참조하고 있을 수 있기 때문에 밀어서 사용하지 않은 건데 if (CurrentBuffer.Value.FreeSize < reserveSize)CurrentBuffer.Value = new SendBuffer(ChunkSize); 이렇게 기존 청크 날리고 새로운 아이로 교체를 하면 밀어서 사용하지 않는 의미가 퇴색되는 거 아닌가요? 꽉 차서 기존 청크를 날릴 때 즈음에는 참조하고 있는 애가 없어질 확률이 높기 때문에 꽉 차서 날리는 건 괜찮은 걸까요?
-
해결됨두고두고 써먹는 유니티 VR
XR Interaction Toolkit 버전
안녕하세요 강사님 처음 강의를 살 때 어려워서 지금 다시 해볼려고 하는데 XR Interaction Toolkit 버전이 많이 올려가면서 영상과 다르게 많이 기능이 생기게 되었는데 제가 따로 설정을 해야 되는 것이 있을까요?설치 버전: 2.3.1 입니다
-
미해결유니티 Addressable 을 이용한 패치 시스템 구현
Exception message 질문
선생님 안녕하세요. 강의 잘 듣고 있습니다.현재 iOS 모바일 Xcode로 테스트하고 있는데, 스트라이트 다운로드를 실패해서 Addressables.UpdateCatalogs 또는 Addressables.GetDownloadSizeAsync에서 실패하게 되는 Exception message를 참고하고 싶은데 이를 어떻게 해야할지 잘 몰라서 이렇게 글을 남기게 되었습니다. (Mac OS Apple silicon에서는 빌드 후 정상적으로 동작되었고, AWS S3를 활용하고 있습니다)
-
미해결[C#과 유니티로 만드는 MMORPG 게임 개발 시리즈] Part4: 게임 서버
안에 있다는 말이 엔진단 안에 있다는 말씀이신가요?
recvBuffer는 안에 있어서 Session마다 고유한 recvBuffer를 갖고 있다고 하실 때 안에 있다는 말은 ServerCore안 즉 엔진단 안에 있다는 말씀이신가요? 설명하실 때 안에 있다 언급하실 떄 마다 엔진단 안이라고 이해하고 있었는데 맞게 이해하고 있는 건가요?
-
미해결[C#과 유니티로 만드는 MMORPG 게임 개발 시리즈] Part3: 유니티 엔진
살짝 이해가 가지 않는 부분이 있네요.
적용?하지 않은 스크립트라도스크립트 상에서 적용?하면 생성 되는건가요?예를 들어 manager가 잘 작동되지만어디에도 생성은 하지 않았잖아요,Managers.Input.KeyAction -= OnKeyboard;Managers.Input.KeyAction += OnKeyboard;저는 게임플레이를 눌러도 Managers가 생성이 안되네요..근데 신기하게 input작동은 됩니다(이벤트 형식으로 바꿨습니다) DontDestroyOnLoad에도 안뜹니다...아래는 코드입니다.
-
미해결[유니티 3D] 실전! 생존게임 만들기 - Advanced
바닥에 있는 아이템이 사라지지 않습니다
아이템 관련해서는 오래전에 작성하고 더이상 건들이지 않았는데 건축 강의 수강중에 아이템 버그가 생겨서 자신이 아이템을 먹고 다시 뱉은 후 다시 주으면 바닥에 있는 아이템이 사라지지 않고 계속 남아있어서 무한적으로 먹을수 있게 되는데 NullReferenceException: Object reference not set to an instance of an objectQuickSlotController.IsActivatedQuickSlot (System.Int32 _num) (at Assets/Script/UI Script/QuickSlotController.cs:152)Inventory.AcquireItem (Item item, System.Int32 count) (at Assets/Script/UI Script/Inventory.cs:77)ActionControllor.CanPickUp () (at Assets/Script/Player/ActionControllor.cs:111)ActionControllor.TryAction () (at Assets/Script/Player/ActionControllor.cs:50)ActionControllor.Update () (at Assets/Script/Player/ActionControllor.cs:41) 이렇게 널래퍼런스가 뜨는데 스크립트 들어가 보아도 잘못작성한게 없는데 왜 이렇까요
-
미해결[C#과 유니티로 만드는 MMORPG 게임 개발 시리즈] Part7: MMO 컨텐츠 구현 (Unity + C# 서버 연동 기초)
이동 동기화 - float
강의에선 한칸씩 이동을 하는데 저는 float 단위로 이동하게 하고 싶어 클라이언트에서 플레이어의 실제 position이 바뀌는 부분에 서버에 패킷을 보냈습니다!서버쪽 콘솔창에는 패킷이 온전히 받아와주기 주고 받는게 돼고 있습니다. 클라이언트에도 브레이크 포인트를 찍어보니 제대로 값이 들어오고 있구요!패킷에서 posX, posY도 docs를 참고하여 float으로 변수 타입을 바꿔줬습니다!클라이언트에서도 실제 이동이 일어나는 부분에서 값을 바꿔주었고 이동 패킷 또한 서버에 쏴주었는데 화면에는 이동의 동기화가 이루어지지 않습니다 ㅠㅠ 이유가 뭘까요?이정도 자료만으로 알기 힘드실 것 같지만 막혀서 질문드립니다..!클라쪽 핸들러 코드도 강의와 똑같습니다!float 이동이나 int 단위 이동이나 이론상 변수 타입만 다르고 돼야하는 게 아닌가가 저의 생각입니다! 답변 부탁드리겠습니다!ㅠㅠ
-
미해결[유니티 레벨 업!] 모듈식으로 개발하는 퀘스트&업적 시스템
ShowDetail 질문
선생님 안녕하세요. QuestView 부분에서 질문이 있습니다.처음에 QuestListView에서 elementTextPrefab의 토글 이벤트로 QuestView의 ShowDetail 메서드를 등록해서실제로 elementTextPrefab의 토글이 바뀔때마다 ShowDetail의 isOn부분을 제어하게되는데, 토글이 바뀔때 quest의 내용까지 바뀌는 것은 처음에 이벤트를 등록할 때 quest 파라미터의 정보까지 한꺼번에 등록되어서 그런것인가요?
-
미해결유니티 Addressable 을 이용한 패치 시스템 구현
PercentComplete
다운로드 받고, 로드 하는데처음에 다운로드 받고 로드 하는건 문제 없이 되거든요.근데 그 이후 앱을 껐다 키고 다시 로드 받으면PercentComplete가 0.5에 멈춰요..이유가 뭘까요..? 상황을 정확히 설명하자면 씬1에서 내려받고, 씬2로 넘어가 씬1에서 내려받은 에셋을 로드 하는거에요
-
해결됨[C#과 유니티로 만드는 MMORPG 게임 개발 시리즈] Part7: MMO 컨텐츠 구현 (Unity + C# 서버 연동 기초)
멀티환경일때와 싱글환경일때 구현 차이 궁금증이 있습니다.
안녕하세요 선생님! 강의를 듣다 질문이 생겼는데요.전체적으로 싱글게임처럼 진행되게 하고싶은데 레벨업 시스템은 만들어 그걸 서버와DB에서 관리하고 싶을때 게임룸이나 몬스터와 관련해 질문이 생겨서요.위와 같은 경우는 몬스터, 플레이어간의 동기화 부분만 제외하고 강의에서 구현한 것처럼 똑같은 방식으로 구현하면 되는걸까요??
-
미해결[C#과 유니티로 만드는 MMORPG 게임 개발 시리즈] Part3: 유니티 엔진
11분 50초 실행결과
NullReferenceException: Object reference not set to an instance of an objectManagers.get_Scene () (at Assets/Script/Mangers/Managers.cs:52)->return Instance._ui;LoginScene.Update () (at Assets/Script/Scenes/LoginScene.cs:21)-> 오류 CS:21Managers.Scene.LoadScene(Define.Scene.Game);public class Managers : MonoBehaviour{ static Managers s_lnstance; //static이라는 전역변수를 통해 오브젝트인 @manager의 유일성이 보장된다 static Managers Instance { get { lnit(); return s_lnstance; } } SceneManagerEx _scene = new SceneManagerEx(); public static SceneManagerEx Scene { get { return Instance._scene; }static void lnit() //Instance가 널인 상태를 해결하기 위해 사용됨 { if (s_lnstance == null) { GameObject go= GameObject.Find("@Managers"); if (go == null) { go = new GameObject { name = "@Managers" }; go.GetComponent<Managers>(); } DontDestroyOnLoad(go); s_lnstance = go.GetComponent<Managers>(); } } } public class LoginScene : BaseScene{ protected override void Init() { base.Init(); SceneType = Define.Scene.Login; } private void Update() { if (Input.GetKeyDown(KeyCode.Q)) { public class LoginScene : BaseScene{ protected override void Init() { base.Init(); SceneType = Define.Scene.Login; } private void Update() { if (Input.GetKeyDown(KeyCode.Q)) { Managers.Scene.LoadScene(Define.Scene.Game); } } public override void Clear() { Debug.Log("Login Scene CLEAR!!!!!"); } }}뭐가 문제인지 잘 모르겠습니다 . 구글링 해본 결과 널의 값을 가질 수 없는 오브젝트에 널을 할당했다고 그러는데 잘 모르겠습니다 ㅠㅠ
-
미해결[C#과 유니티로 만드는 MMORPG 게임 개발 시리즈] Part4: 게임 서버
pending이 true면 어떨 때 args.Completed.Invoke()가 실행되는 건가요??
public void Init(IPEndPoint endPoint) { // 문지기(가 들고있는 휴대폰) _listenSocket = new Socket(endPoint.AddressFamily, SocketType.Stream, ProtocolType.Tcp); // TCP로 할 때 설정 // 문지기 교육 _listenSocket.Bind(endPoint); // 식당 주소와 후문인지 정문인지 기입을 해준 것 // 영업 시작 // backlog : 최대 대기수 _listenSocket.Listen(10); SocketAsyncEventArgs args = new SocketAsyncEventArgs(); args.Completed += new EventHandler<SocketAsyncEventArgs>(OnAcceptCompleted); RegisterAccept(args); } void RegisterAccept(SocketAsyncEventArgs args) { bool pending = _listenSocket.AcceptAsync(args); if (pending == false) // 운 좋게 바로 클라이언트가 접속했을 경우 OnAcceptCompleted(null, args); } void OnAcceptCompleted(object sender, SocketAsyncEventArgs args) { }클라이언트가 접속을 하면 pending이 false가 되어서 OnAcceptCompleted가 직접 실행이 되지만 클라이언트가 접속을 안해서 pending이 true인 경우는 직접 실행이 안되고, args.Completed.Invoke()일 때 실행이 되는 건데 진짜로 완료 되었을 때란 어떨 때라고 할 수 있을까요?
-
미해결[C#과 유니티로 만드는 MMORPG 게임 개발 시리즈] Part3: 유니티 엔진
GetButton 에서 반복문을 통한 이벤트 등록 오류에 대한 질문
안녕하세요. 선생님.제가 프로그래밍 도중 Enum값 바인딩 한 부분에서 for문을 사용해서 순차적으로이벤트를 등록하려는데 1번 케이스의 경우는 정상적으로 작동하지만2번 케이스의 경우 정상적으로 작동하지 않습니다.. 이유가 뭘까요...? ///////// 1번 case GetButton((int)PetButton.PetType0).onClick.AddListener(() => OnTypePet(PetButton.PetType0)); GetButton((int)PetButton.PetType1).onClick.AddListener(() => OnTypePet(PetButton.PetType1)); GetButton((int)PetButton.PetType2).onClick.AddListener(() => OnTypePet(PetButton.PetType2)); GetButton((int)PetButton.PetType3).onClick.AddListener(() => OnTypePet(PetButton.PetType3)); //////// 2번 case for(PetButton i = PetButton.PetType0; i <= PetButton.PetType3;i++) GetButton((int)i).onClick.AddListener(() => OnTypePet(i));
-
해결됨[C#과 유니티로 만드는 MMORPG 게임 개발 시리즈] Part4: 게임 서버
JobQueue 사용에 대한 질문
우선 저는 단순히 Lock 만 사용하면 무수한 경합으로 인해 성능적으로 손해를 볼 수 있어 Job Queue 를 사용하는 것으로 이해를 했습니다.그래서 이것저것 연습하면서 Job Queue 를 계속 사용하고 있는데 도중에 몇몇 의문이 생기어 질문을 드리게 되었습니다. Job Queue 를 사용하다보면 Job Queue 내에 또 다른 Job Queue 를 사용해야하는 상황이 발생하는데 이 부분은 문제가 되지 않을까요?아래는 예시 코드입니다.public void Function() { MatchingManager.Instance.Push(() => { ... User.Party.Push(() => { ... }); }); } Lock 처럼 사용하면 된다 라는 생각은 옳은 것인가요? 아니면 Lock 과는 달리 Job Queue 사용 시 주의 할 부분이 있을까요? 항상 양질의 강의를 제공해주셔서 감사드립니다.
-
미해결[C#과 유니티로 만드는 MMORPG 게임 개발 시리즈] Part3: 유니티 엔진
Bind 함수에 대한 질문입니다
Bind<T>를 하게 되면 해당 T 타입에 대하여 UI_Base에 있는 _objects에 저장이 되는 걸로 이해했는데, 그럴 경우 같은 Type을 서로 다른 코드에서 각자 부르게 되면 중복되어 사라지거나, 충돌이 일어나지는 않는 지 궁금합니다.예를 들어 UI_Button에서도 Init() 함수에서 Bind<GameObject>를 하고, UI_Inven에서도 Init() 함수에서 Bind<GameObject>를 하는데 이럴 경우 _objects에 이미 GameObject type에 대한 정보가 들어있는데 같은 type을 또 한번 bind하게 되는 게 아닌가요?왜 아무 문제가 없는 건지, 아니면 제가 C# 문법에 대해 잘못 생각하고 있는 건지 궁금합니다..ㅜㅜ감사합니다
-
미해결[C#과 유니티로 만드는 MMORPG 게임 개발 시리즈] Part3: 유니티 엔진
json으로 저장/로드 기능을 구현해보고싶은데요
게임을 껏다가 켜도 현재 젠 되어있는 몹의 숫자 몹의 위치 유니티짱의 현재 체력 레벨 등등을 저장하고 로드하는것을 구현해보고싶은데 제가 가진 짧은 지식으로 이렇게 접근하는 방향이 맞는지 한번 봐주세요 ㅠㅠ예를들어 몹이 30마리가 있으면 저장시 배열이나 딕셔너리에 현재 몹들의 데이터와 Vector3 위치 등등을 넘겨주고 json에 저장한다. 게임을 불러올때는 foreach문에서 json으로부터 받은 위치를 기반으로 전부 Instantiate한다!!..? 가 맞을까요 뱀서처럼 몹이 더 많아지거나 하면 엄청 렉걸릴것같은데 이렇게밖에 안떠오르네요 ㅠ
-
해결됨[C#과 유니티로 만드는 MMORPG 게임 개발 시리즈] Part7: MMO 컨텐츠 구현 (Unity + C# 서버 연동 기초)
클라에서 build를 통해 만든 exe파일에서 이동동기화가 이루어지지 않습니다
안녕하세요 강사님! 다름이 아니라 강의를 따라해보고 그 뒤에 거의 흡사하게 한 번더 다른 파일에서 코드를 구현해보고 있습니다.그런데 서버에서 클라에 패킷보내는것까진 제대로 작동하는데(좌표확인까지됨) 클라에서 실제로 테스트를 위해 실행했을때 실질적인 플레이어캐릭터가 좌표 인식을 제대로 못하는 문제가 있습니다.구체적으로 첫번째클라를 실행하고 플레이어이동시키고잇는도중 두번째클라가 실행되면 두번째클라에서도 첫번째클라플레이어 이동이 제대로 동기화되어보이는데이후 두번째클라창으로 옮겨가서 플레이어를 이동시키면 첫번째클라창에서 타플레이어좌표이동이 플레이어오브젝트에 반영되지않고 방향과 상태만 반영됩니다. 이후 첫번째클라창으로 옮겨가 플레이어를 이동시키면 두번째클라창에서도 타플레이어좌표이동이 되지 않습니다. 와중에 서버에서 클라쪽에 패킷전송은 잘되고 있습니다.게다가 타플레이어가 실제로 이동한좌표로 가려고하면 충돌인식까진되는데 화면엔 타플레이어가 이동하기전 있던곳에 그대로 서있습니다이경우엔 보통 어떤부분이 문제인걸까요?ㅜㅜ+) break point 걸어놓고 유니티에서 확인해봤는데 유니티에서 실행하면 정상적으로 이동동기화 되는데 build를 해서 만든 exe파일에선 위와 같은 현상이 일어나며 적용이 안됩니다...
-
미해결[C#과 유니티로 만드는 MMORPG 게임 개발 시리즈] Part4: 게임 서버
맥북에서 비쥬얼 스튜디오 사용중인데 아래와 같은 결과가 나타나지 않습니다. 무슨 문제일까요?
이건 샘 화면이고이건 제 맥북 vs 화면입니다.Hello Thread! 다섯번이 결과로 안나오네요 ㅠㅠ 챗지피티에 물어봤더니 아래와 같이 답을 줍니다..NET ThreadPool은 개발자가 작업을 실행할 스레드 풀을 할당하여 여러 작업을 동시에 실행할 수 있도록 하는 메커니즘입니다. 그러나 Mac의 Visual Studio에서 ThreadPool 기능 문제에 대한 보고가 있었습니다. 이 문제에 대한 한 가지 잠재적인 이유는 Windows와 macOS 간의 기본 운영 체제 및 런타임 환경의 차이 때문일 수 있습니다. 또 다른 가능성은 Visual Studio의 두 버전 간에 ThreadPool 기능 구현의 차이일 수 있습니다.Mac의 Visual Studio에서 ThreadPool에 문제가 발생하는 경우 문제를 해결할 수 있는 업데이트 또는 패치를 확인하고 문제를 일으킬 수 있는 잠재적인 문제에 대한 코드를 검토하는 것이 좋습니다. 다른 플랫폼에서 더 나은 성능과 안정성을 제공할 수 있는 async/await 또는 TPL(Task Parallel Library) 사용과 같은 동시성에 대한 대체 접근 방식을 탐색하는 것도 가능합니다.
-
미해결[C#과 유니티로 만드는 MMORPG 게임 개발 시리즈] Part3: 유니티 엔진
뭐가 문제인지 모르겠어요 4시간 동안 애쓰고 있답니다...
NullReferenceException: Object reference not set to an instance of an objectUtill.GetOrAddComponent[T] (UnityEngine.GameObject go) (at Assets/Script/Utills/Utill.cs:10)UIManager.ShowPopupUI[T] (System.String name) (at Assets/Script/Mangers/UIManager.cs:23)PlayerControler.Start () (at Assets/Script/PlayerControler.cs:67)먼저 오류 메시지는 이것입니다. 저는 UI_Button 프리펩 위치 Resources-Prefabs-UI-Popup폴더에 있구요UIButton 스크립트 Scripts-UI-Popup 폴더에 있습니다. 이제 코드는 Utill.cs:10 -> T component = go.GetComponent<T>(); UIManager.cs:23 -> T popup = Utill.GetOrAddComponent<T>(go);PlayerControler.cs:67 ->Managers.UI.ShowPopupUI<UIButton>();실행 전 UI_Button 프리펩 딜리트했다가 하이라키에 있는 UI_Button 오브젝트를 다시 프리펩화 한다음 그 오브젝트는 다시 딜리트 하여 실행 해본 결과 UI_Button가 뜨지 않고 저 에러만 납니다.뭐가 문제일까요 ???
-
미해결[C#과 유니티로 만드는 MMORPG 게임 개발 시리즈] Part3: 유니티 엔진
학습순서
이제 3강까지 2회독 정도하니 대략 이해가 됩니다. 한번 정도 더 볼 생각인데. 샘이 올리신 실전게임 2개를 서버 들어가기 전에 해 보는 것이 나을까요? 바로 서버로 들어가는 것이 나을까요? 학습 순서 문의 드립니다. 감사합니다