묻고 답해요
169만명의 커뮤니티!! 함께 토론해봐요.
인프런 TOP Writers
-
미해결유니티 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 게임 개발 시리즈] Part2: 자료구조와 알고리즘
BFS 관련 질문드립니다.
해당 코드에서, 예를 들어 (1, 1) 지점 기준으로 상(빨) 하(초) 좌(빨) 우(초) 이런 식으로 뚫려 있는 길이 하, 우 총 두 지점이라고 가정했을 때 큐에 저장되는 지점은 총 두 곳이겠죠?(2, 1), (1, 2) 이렇게요..그렇게 한 번 for 문 사이클이 돌고나면, 다시 위로 올라가서 큐에서 먼저 발견한 지점(여기서는 (2, 1)) 을 꺼내서 현재 좌표로 넣고, 그 좌표 기준으로 또 for 문을 돌고..다 끝나고 나면 이제는 (1, 2) 지점을 꺼내서 이 기준으로 for 문을 돌면서 또 큐에 갈 수 있는 지점을 저장하고.. 계속적으로 반복하다보면 결국 가장 처음에 발견한 갈 수 있는 지점 (2, 1) 과 (1, 2) 루트로 가다가 둘 중 한 루트는 빨간 벽으로 막혀서 더이상 진행이 불가능한 루트가 될 것이며..남은 한 루트는 계속 살아남으면서 갈 수 있는 지점을 '전부' 탐색 하므로 목표 지점에서 본다면 결국 해당 루트가 최단 경로가 되는 것이 맞나요?
-
미해결[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개를 서버 들어가기 전에 해 보는 것이 나을까요? 바로 서버로 들어가는 것이 나을까요? 학습 순서 문의 드립니다. 감사합니다
-
미해결[실전 게임 코드 리뷰] 유니티 캐주얼 게임 (엘리스팡)
스테이지 찾는부분 조금만 더 자세히 설명부탁드려요 ㅠㅠ
GetButton((int)Buttons.ChapterButton_1).gameObject.BindEvent(() => { OnClickChapterButton(1); });UI_SelectStageScene.cs 에서 왼쪽에 배치된 챕터 버튼들 같은 경우에는 위처럼 바인드해서 ChapterButton_1 은 OnClickChapterButton 메서드에 1을 전달하니까 너무 직관적인데요 Stage는 잘 이해가 안가요 ㅠㅠfor (int i = 0; i < _stageBlockUI.Length; i++) { _stageBlockUI[i] = Utils.FindChild<UI_StageBlock>(gameObject, "UI_StageBlock" + (i + 1), recursive: true); }Child에서 "UI_StageBlock" 를 전부 찾아서 _stageBlockUI[i] 에 저장하고UI_StageBlock.cs 에서 아래처럼 바인드를하고..?GetButton((int)Buttons.SelectStageButton).gameObject.BindEvent(OnClickStageButton);OnClickStageButton() 으로 넘어가서 _selectStageSceneUI?.OnSelectStage(_stage); OnSelectStage를 실행하면서 _stage를 전달하는데_stage가 몇인지는 어디서 판단하는건지 모르겠어요.그러다보니 Refresh()함수에서도 _stage로 Text입히는것도 연결이 안되네요.그리고 눌렀을때 콜백을 받아서 ShowStartStagePopup()으로 넘어가는데public void ShowStartStagePopup() { Managers.UI.ShowPopupUI<UI_StartStagePopup>(callback: (popup) => { int templateID = (_selectedChapter - 1) * 20 + _selectedStage; popup.SetInfo(Managers.Data.Stages[templateID]); });여기서도 tempateID 를 가져오기 위한 _selectedStage가 몇스테이지인지 어디서 판단하는건지를 모르겠어요 ㅠㅠ 저만 계속 질문하는것 같아 너무 죄송스럽습니다. C# 1편이랑 3편이랑 하고 넘어왔는데도 여전히 어려워요... 자꾸 질문하는게 죄송스러워서 맘편히 질문만 할수있는 강의 그런거라도 있으면 구입하고싶어요. 좋은 주말되세요!
-
미해결[C#과 유니티로 만드는 MMORPG 게임 개발 시리즈] Part2: 자료구조와 알고리즘
환경 설정 부분에서 질문있습니다.
현재 윈도우 11에 vs 2019를 사용중입니다. 현재 미로가 정사각형이 아니라 아래로 긴 직사각형으로 그려지고 있어 질문 남깁니다.
-
미해결[C#과 유니티로 만드는 MMORPG 게임 개발 시리즈] Part7: MMO 컨텐츠 구현 (Unity + C# 서버 연동 기초)
30분경에 말씀하신 구현방법을 다루시는지 궁금합니다.
안녕하세요 강사님30분경에 '실질적으로 지금보다 좀 더 복잡한 MMO가 되면 불러와야 할 정보들을 클라에게 먼저 알려준 다음 클라에서 모든 정보 불러오기가 끝났으면 서버쪽에 준비됐다고 ok패킷을 날리게 되고 ok패킷을 받고나서야 서버쪽에서 게임에 입장 시킨다고 하시면서 여기까지는 구현하지 않을거라고 하셨는데 해당 내용이 나중에 강의중에(다른파트에서라도) 나오는지 궁금합니다!혹시 강의중에 해당 내용이 없다면 구글링 검색어를 뭘로 하면 좋을지 알려주시면 감사하겠습니다!
-
미해결[C#과 유니티로 만드는 MMORPG 게임 개발 시리즈] Part3: 유니티 엔진
타격시 소리를 추가한다고 한다면
안녕하세요. 만약에 타격시 소리를 추가한다고 한다면PlayerController 클래스의 OnHitEvent 메서드에서 Managers.Sound.Play를 호출해서 재생시키면 될것 같아요. 근데 또 특정 UI 가 켜지고 꺼질때나 플레이어가 죽을때 등등 많은 부분에서 사운드를 재생하는게 필요할텐데 그때마다 Managers를 호출해서 Sound를 재생시키면 안될것 같다는 느낌이 왠지 들어요. 너무 여러곳에서 Managers를 호출하면 코드가 꼬이지 않을까 하는 걱정이요. 그래서 InputManager를 구현한것 처럼 Action을 사용해서 다른곳에서 Sound 재생을 등록시키는게 더 나은 방법일까요..?GameScene이라는 곳에서 여러 Manager들을 호출해서 게임에 관련된 작업을 하는건 합리적으로 느껴지는데 다른곳에서도 Managers를 계속 호출하는게 괜찮은지 여쭤봅니당
-
해결됨[C#과 유니티로 만드는 MMORPG 게임 개발 시리즈] Part3: 유니티 엔진
@Managers 생성 질문드립니다.
디버깅을 통해 @Managers가 생성되는 곳이 BaseScene에 Init이라는 것을 파악했지만, Init과 Managers.Resource.Instantiate 호출로 연관 없는 @Managers까지 생성되는 이유를 모르겠습니다.BaseScene.csprotected virtual void Init(){Object obj = GameObject.FindObjectOfType(typeof(EventSystem));if (obj == null)Managers.Resource.Instantiate("UI/EventSystem").name = "@EventSystem";}ResourceManager.cspublic GameObject Instantiate(string path, Transform parent = null){GameObject original = Load<GameObject>($"Prefabs/{path}");if (original == null){Debug.Log($"Failed to load prefab : {path}");return null;}if (original.GetComponent<Poolable>() != null)return Managers.Pool.Pop(original, parent).gameObject;GameObject go = Object.Instantiate(original, parent);go.name = original.name;return go;}
-
해결됨[C#과 유니티로 만드는 MMORPG 게임 개발 시리즈] Part2: 자료구조와 알고리즘
List<int>[] 초기화에서 ( ) 의미가 궁금합니다.
List<int>[] adj2 = new List<int>[]{// new List<int> 뒤에 () 를 넣지 않아도 오류가 안나던데요.// ( 소괄호 ) 를 넣어도 안넣어도 되는건가요?// 선생님은 new List<int>(){ 1, 3} 이렇게 하셨습니다.new List<int>{ 1, 3},new List<int>{ 0, 2, 3},new List<int>{ 1},new List<int>{ 0, 1, 4},new List<int>{ 3, 5},new List<int>{ 4}}; 또 잘이해가 안되는점이.아래 링크한 블로그에서는 (소괄호) 가 이런식으로 있습니다.List<List<string>> list = new List<List<string>>();https://codechacha.com/ko/csharp-init-2d-list/
-
해결됨[C#과 유니티로 만드는 MMORPG 게임 개발 시리즈] Part7: MMO 컨텐츠 구현 (Unity + C# 서버 연동 기초)
배치파일을 실행하려고 하니 오류가 뜹니다
이렇게 뜨는데 어떻게해야할까요..?ㅠㅠ