섹션 4 Project M1 - 성장 컨텐츠 제작(재화, 성장, 아이템, 퀘스트, ...) 에속한 SaveData, HeroList, ItemData, ItemHolder 이쯤부터 전부 재생이 안됩니다. 꽤 종종 이런 재생 오류 문제가 발생합니다. 한주에만 이런문제를 겪은게 3회정도 된거같습니다. 다음날 재생하면 또 되는경우가 존재하고, 너무 불편합니다. 인프런 운영사분들 제발 쾌적한 재생환경을 부탁드려요 .. 강의듣는 와중에, 흐름이 끊길때마다 너무 불편합니다... 강의는 잘듣고 있습니다..
안녕하세요 강의를 이제 막 듣기 시작하면서 가능할까 의문이 들어 질문 드립니다. 우선 제가 만들고자 하는 게임이 비대칭 vr 같이 vr과 데스크탑(모니터, 키보드, 마우스 ) 조작으로 2인 로컬플레이 게임을 만들고자 합니다. 먼저 드는 생각은 일단 vr 기능으로 만든 플레이어에 키보드 마우스로 플레이하는 플레이어와 이 플레이어에 해당하는 카메라를 추가해서 2인이서 플레이할 수 있도록 만들 생각중인데 vr 기기와 컴퓨터 화면, 키보드 마우스 입력으로 동시에 플레이하는게 가능할까요?
제가 강의를 놓친걸수도 있는데 질문드려서 죄송합니다. 스포닝풀을 스크립터블 오브젝트로 관리하는데 (M1 에서는 타일맵에 찍어서 관리 했었던걸로 기억합니다) 스크립터블 오브젝트로 Pivot PosX , Pivot PosY 를 어떻게 직관적으로 보고 작업 할수 있나요? 그냥 찍어서 좌표 확인하는건지 아니면 더 편한 방법이 있는건지 궁금해서 질문남겨요
[C#과 유니티로 만드는 MMORPG 게임 개발 시리즈] Part7: MMO 컨텐츠 구현 (Unity + C# 서버 연동 기초)
루키스님 안녕하세요. 한 달 전에 올린 질문에 추가 질문드립니다. 서버는 C++, 클라이언트는 유니티 조합으로 준비하고 있다는 질문이었고, 루키스님이 답변을 해주셨었습니다. 그 답변 이후로 열심히 C++ 서버 공부하고 있어요. 오늘 들어와서 답변을 다시 살펴보니까, C# 강의에서 들어야 할 강의 중에, C# Part4 게임 서버도 써주셨더라고요. C++ 서버만 듣는 건 부족해서 C# 서버도 들어보라고 하신 걸까요~? 아니면 강의 마지막에 유니티 연동 관련한 부분 때문에 그러신 걸까요~? C++ 서버 강의 너무 좋은데 완강하는데 많은 시간이 걸려서 살짝씩 멘탈이 흔들리지만 다잡으면서 가고 있습니다. 늘 좋은 강의 감사합니다.
이전까진 문제없이 잘 이해하고 코드도 실행되었습니다. 그런데 [ 로비생성] 강의를 보고 따라했더니 오류가 발생했습니다. Unity.Services .Lobbies.LobbyServiceException: lobby code 'BARB6QOAUYDBBMLVUPZQBE' contains an invalid character 'O' (U+004F) at index 6 ---> Unity.Services .Lobbies.Http.HttpException`1[ Unity.Services .Lobbies.Models.ErrorStatus]: (400) HTTP/1.1 400 Bad Request ...생략 ... ... 호스트는 잘 만들어지는데요, 다른 플레이어로 조인하려고 하면 저런 빨강 글씨의 오류가 발생합니다. 인터넷에 찾아보니 외국 포럼만 나오는데요, 버그같기도 하고 그러네요. 제가 고치기 힘들어서요. 혹시 중간강의에서 코드를 통째로 올려주실 수 있나요? 저 오류때문에 코드를 실행하진 못하고, 코드 따라치면서 논리만 이해하는 식으로 공부하고 있습니다. 코드를 실행하면서 게임을 돌려보는 실습까지 해보면 재밌긴 하겠지만요. 강의는 재밌게 잘 보고 있는데, 저 오류가 아쉽네요.
PacketSession OnRecv 마지막부분에 buffer에서 패킷의 사이즈 만큼 자르고 buffer의 사용하지 않은부분은 buffer에 다가 새로 만들어서 넣어주고 있는데요 여기서 저걸 왜 다시 넣어야 하는지 이해가 안갑니다. 왜냐하면 읽은 데이터량만큼 processLen을 증가시켰고 processLen을 반환하면 read커서가 그만큼 증가하게 되고 이부분에서 readPos증가한만큼 new로 새로 만들어서 가져오는데 말이죠.. 굳이 필요가 없을거 같은데 맞나요..?
워크래프트3 영웅들 패시브 오라처럼 영웅이 살아있을때 영구적으로 지속되는 스킬은 패시브로 짧은 주기마다 계속해서 효과를 주면 되는걸까요? 간단한 스탯 영구적 증가 효과 스킬을 패시브 타입으로 세팅에 apllycount 1, cooldown 1 이펙트 세팅에서 duration 1.5 로 이와 같이 하여 구현을 해보았습니다. 혹여 더 좋은 방법이나 위의 방법이 문제가 있을지 궁금하여 질문드립니다.
class SpinLock { volatile int _locked = 0; private readonly object _lock = new object(); public void Acquire() { while (true) { //int original = Interlocked.Exchange(ref _locked, 1); //if (original == 0) // break; // CAS : Compare-And-Swap //int original = Interlocked.CompareExchange(ref _locked, 1, 0); //if (original == 0) // break; //int expected = 0; //int desired = 1; //if (Interlocked.CompareExchange(ref _locked, desired, expected) == expected) // break; lock (_lock) { if (_locked == 0) { _locked = 1; break; } } } } DeadLock 시간에 배웠던 lock 방식을 이용해서 작성해봤는데 출력 값은 0이 잘 나옵니다. Q. SpinLock 구현할 때 InterLock 계열의 메서드를 사용해 구현한 것과 lock을 이용해 구현한 것은 어떤 차이가 있는지 궁금합니다. 강사님께서는 InterLock 을 통해 구현하셨는데 그 이유는 간단하게 사용할 수 있기 때문인가요?? SpinLock / BackOff Lock / Assisted Lock 이런 것을 구현할 때 위와 같이 lock 을 써서 구현하는 것은 구조적으로 잘못된 것인가요?? 제가 이해한 것은 Lock 방식과 InterLock 방식은 하드웨어의 Instruction을 원자적으로 처리하기 위해 프로그래머가 C++/C# 같은 언어로 시키기 위한 방법인 것 같은데 이해를 똑바로 한 것인지 궁금합니다.
세이브 저장방식을 Playerprefs 보단 프로젝트 Resource파일 내부에 json으로 저장하는쪽이 개발하는 과정에는 저장하는게 명확하게 보여서 더 좋다고 생각해서 바꾸긴 했는데 Json과 playerprefs이 조금의 속도 차이는 있는거로 아는데 playerprefs에 json으로 저장하는것에는 무슨 차이가 있는지 여쭤보고싶습니다. 그리고 퀘스트의 실패를 만드는것은 다키스트 던전처럼 일단 퀘스트를 무조건 성공하는 취급으로 한 후에 Give 함수에 enum에 따라서 이벤트를 발생 시키게 해서 구현하려는데 이때 Enum인 대성공,성공, 실패, 대실패를 정하는걸 TaskGroup에 넣는게 맞는지 잘 모르겠습니다. TaskGroup에 Enum변수를 만든 다음에 Quest에 isFailable 변수를 만들고 achievment 처럼 ReceiveReport를 가상함수로 만든 다음에 다른 종류의 퀘스트를 만들고 ReceiveReport를 원하는대로 수정한 다음 성공한 TaskGroup을 따라서 QuestResult가 결정되고 이걸 QuestReward에 QuestResult에 따라서 보상, 실패 처리를 하면 되는걸까요? public bool IsFailable => this.GetType() != typeof(Quest) && this.GetType() != typeof(Achievement); 이 bool값으로 어떤 유형의 퀘스트인지도 확인을 하고요. 이런식으로 구상을 생각해 보았는데 이러한 설계가 맞는 방향인지 여쭤보고싶습니다.
이러한 이슈가 발생해 찾은 결과 Monster Script의 37번 째 줄인 FindClosetTarget 함수에서 타겟을 찾지 못해 NPR이 발생한 내용으로 확인되었는데 Spawner에 Players를 넣어주어 플레이어인 Cleric과 Barbarian이 잡히나, 간헐적으로 Null을 return 해주는 현상이 발생하는데, 이게 Update 문 안에서 실행되어 FindClosetTarget 구문이 매우 빠른 속도로 실행되어 발생한 시점 문제인지 궁금합니다. 현재 강사분과 코드는 동일한 것으로 확인됩니다.
안녕하세요. 강의를 마지막까지 공부하고, 에디터에서 실행할시에 잘 동작 함을 확인 했습니다. 그런데, 안드로이드 빌드를 해보면 빌드 실패도 하지 않습니다. 생성된 APK 를 핸드폰에도 넣어보고, 녹스플레이어, 블루 스택에서 넣어서 실행해보면 파란 에디터에서 보이는 최초 파란 화면만 뜨고, 게임씬이 동작 하지 않고 있습니다. 혹시나 해서, UI_TextMeshPro 에서Text 를 넣고, 테스트하던중 에디터 실행할때는 bbb 가 출력되고, 게임도 잘 돌아가는데, 안드로이드 플레이어나, 모바일 기기에서는 aaa 까지만 출력되고 다음줄이 실행 되지 않습니다. 비동기를 디버그 해보려고 노력했는데, 에디터에서는 오류가 나지 않고, F11 눌러서 한단계씩 들어가다보면 "모듈에 프레임 없음" 페이지가 나오고, 어드레서블에 있는 목록이 Resource 에 채워지는 것을 확인 하기가 어렵습니다. 비동기 이후에는 Resource 에 22개 딕셔너리가 채워진것을 확인 가능하긴 하더군요. 해결이 몇일째 안되고 있는데, 도움 부탁드립니다. public TextMeshProUGUI textComponent; // Start is called before the first frame update void Start() { textComponent.text = "aaa"; // "F:\p4v\TangTang\Assets\Scripts\Scenes\GameScene.cs" Managers.Resource.LoadAllAsync<Object>("PreLoad", (key, count, totalCount) => { Debug.Log($"로딩바 추가 {key}, {count}/{totalCount}"); if (count == totalCount) { textComponent.text = "bbb"; // Debug.Log("test"); // StartLoaded(); } }); }
루키스님 안녕하세요? 소켓 함수쪽에서 동기방식과 비동기방식의 장단점을 고찰하고 있습니다. 이번 강의에서 Listen쪽을 동기 -> 비동기로 전환하면서 논블로킹 성질로 인해 어느 누군가의 입장 지연 등을 기다려도 않아도 되므로 그런 부분에서 이점이 있다. 이렇게 이해를 하였는데요, 입장자 별로 스레드를 부여하여 동기적으로 입장시킴. 단, 너무 지연이 되면 해당 스레드는 종료 등으로 처리. 이런 식으로 동기적 방법을 고수하면 콜백 함수 없어도 되니까 코드 복잡도도 줄고 컨텍스트 스위칭도 덜 일어나지 않을까? 라는 생각을 하게 되었습니다. 그러므로 동기적으로 소켓 함수를 계속 사용하는 것은 잘못된 생각인지, 아니면 비동기 동기가 각각 장단점이 있는 방식인지 루키스님 조언 얻으려고 질문 드립니다. 답변 미리 감사합니다. +수정 이 내용과 같은 맥락일까요? 그렇다면 Listen과 Accept는 동기, Send와 Receive는 비동기로 처리 이런 방식은 어떤지 고민도 되고 하네요 https://www.inflearn.com/community/questions/140160/%EA%B5%B3%EC%9D%B4-%EB%B9%84%EB%8F%99%EA%B8%B0-%EB%B0%A9%EC%8B%9D%EC%9D%84-%EC%82%AC%EC%9A%A9%ED%95%98%EB%8A%94-%EC%9D%B4%EC%9C%A0
LobbyUIController = FindObjectOfType<LobbyUIController>(); 강의대로 위의 코드로 진행하는 과정에서 오류가 있어서.. LobbyUIController = FindFirstObjectByType<LobbyUIController>(); 이렇게 수정하라고 나오는데, 이 때문인지 로비 쪽의 Scene을 로드하면 Log에서 아래와 같이 Error가 찍힙니다. NullReferenceException: Object reference not set to an instance of an object LobbyManager.Start () (at Assets/Scripts/Lobby/LobbyManager.cs:23)