묻고 답해요
145만명의 커뮤니티!! 함께 토론해봐요.
인프런 TOP Writers
-
미해결[실전 게임 코드 리뷰] 유니티 캐주얼 게임 (엘리스팡)
스테이지 찾는부분 조금만 더 자세히 설명부탁드려요 ㅠㅠ
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 게임 개발 시리즈] Part7: MMO 컨텐츠 구현 (Unity + C# 서버 연동 기초)
30분경에 말씀하신 구현방법을 다루시는지 궁금합니다.
안녕하세요 강사님30분경에 '실질적으로 지금보다 좀 더 복잡한 MMO가 되면 불러와야 할 정보들을 클라에게 먼저 알려준 다음 클라에서 모든 정보 불러오기가 끝났으면 서버쪽에 준비됐다고 ok패킷을 날리게 되고 ok패킷을 받고나서야 서버쪽에서 게임에 입장 시킨다고 하시면서 여기까지는 구현하지 않을거라고 하셨는데 해당 내용이 나중에 강의중에(다른파트에서라도) 나오는지 궁금합니다!혹시 강의중에 해당 내용이 없다면 구글링 검색어를 뭘로 하면 좋을지 알려주시면 감사하겠습니다!
-
미해결[실전 게임 코드 리뷰] 유니티 클리커 게임
Sprite Image vs UI Image
크기가 100x200 , 200x150 이렇게 사각형 크기로 정해진 게 아니라,이렇게 픽셀 부분만 정해져 있다면 전체 사각형 크기인 270x410이 아니라,픽셀 부분만 선택되도록 하이라이트 효과 및 버튼 기능을 넣고 싶은데( 위 이미지를 클릭하면 도서관 UI 팝업이 뜨는 식으로요 ) Q 1- 이건 어떻게 구현하면 될까요?또한, 이건 Sprite로 만들 수 밖에 없을 것 같은데UI Image로도 처리가 가능한가요? ========================================================개미키우기 관련 강의 정리 내용으로는,UI Image 이용 : 캔버스안에 자동으로 들어감, UI 프레임워크 사용 가능 ( 유니티 엔진 UI 및 현재 프로젝트에서 사용되는 UI 관련 코드들, UIManager )Sprite Image 이용 : SpriteRenderer 기반, 카메라가 찍어야 함, 직접 UI관련 처리 필요이렇게만 봤을 때는 무조건 UI Image 사용하는게 이득일 것 같아서, 모든 이미지를 UI Image로 처리해서 편하게 사용 중인데,Sprite vs UI 관련해서 성능/ 최적화 관련 내용들만 정리되어 있는데, rookiss님 말씀대로 제가 제작하고 있는 소규모 게임에서 성능 관련 내용은 나중 우선순위라, 성능 말고 다른 차이점이 있는지 궁금합니다. 명확히 Pros & Cons 를 다룬 글을 못 찾아서요.. Q 2- Sprite를 사용했을 때의 이점이 있나요? Q 3- Sprite로만 만들어도 상관없나요? 이 경우 이점이 뭔가요? Q 4- UI Image로만 만들었을 경우의 단점은 없나요? Q 5 - UI Image만 사용하다가 Sprite이미지를 중간중간 사용해도 되나요?이렇게 섞어 쓸 경우 소팅 오더가 발생할 것 같아서 UI 이미지로만 사용중이었습니다.( 개미 키우기와 비슷한 방식으로 구조를 짠 상태입니다. )
-
미해결[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;}
-
미해결유니티 머신러닝 에이전트 완전정복 (기초편)
addObservation이 안됩니다.
Assets\ML-Agents\Examples\GridWorld\Scripts\GridAgent.cs(88,20): error CS1061: 'VectorSensor' does not contain a definition for 'addObservation' and no accessible extension method 'addObservation' accepting a first argument of type 'VectorSensor' could be found (are you missing a using directive or an assembly reference?)유니티에 다음과 같은 오류가 뜨네요.
-
미해결[실전 게임 코드 리뷰] 유니티 클리커 게임
IAPManager 에러
파일을 다운받고 게임을 실행하니 Assets\Scripts\Manager\IAPManager.cs(9,27): error CS0535: 'IAPManager' does not implement interface member 'IStoreListener.OnInitializeFailed(InitializationFailureReason, string?)' 위와 같은 에러가 뜨네요. 유니티 버전은 2021.3.21f1입니다.
-
해결됨[C#과 유니티로 만드는 MMORPG 게임 개발 시리즈] Part7: MMO 컨텐츠 구현 (Unity + C# 서버 연동 기초)
배치파일을 실행하려고 하니 오류가 뜹니다
이렇게 뜨는데 어떻게해야할까요..?ㅠㅠ
-
미해결[C#과 유니티로 만드는 MMORPG 게임 개발 시리즈] Part3: 유니티 엔진
널 예외가 발생합니다.
안녕하세요.선생님이 작생해 주신 코드를 하나하나 검토를 해봐도 아래와 같이 널 예외가 발생합니다.어떤 문제가 있는걸까요?
-
미해결[실전 게임 코드 리뷰] 유니티 캐주얼 게임 (엘리스팡)
어드레서블 사용 기준..!?
안녕하세요. 초보자이며 프로젝트 규모가 작다면 어드레서블을 굳이 사용할 필요가 없다는 말씀 듣고 질문드립니다. 기존의 Resource에서 로드하는 방식이 코드도 간결하고 쉬웠는데 어드레서블은 조금 복잡하네요 ㅠㅠ제가 이해한 바로는초기 빌드 용량이 커지거나 로딩 시간이 길어질때씬 이동이 자주 일어나거나 해서 불필요한 메모리를 계속 들고있을 필요가 없을때추후 빌드없이 패치를 구현하고 싶을때등등에서 어드레서블 사용이 권장되는 것 같은데 제가 만드려는 게임에서 어드레서블이 필수인지 판단이 어렵네요.그래서 혹시 강사님께서는 프로젝트에서 어드레서블을 사용하는 것이 효율적일것 같다 라고 판단하시는 어떤 기준이 있으신가 해서 질문드립니다. 항상 좋은 강의 감사드립니다!
-
미해결C#과 유니티, 실전 게임으로 제대로 시작하기 (저자 직강)
왜 이 책에서는 Time.deltaTime을 쓰지 않았는지?
예를 들어 이동 관련해서 책에서는 AddForce 메소드를 많이 사용했는데, 왜 Time.deltaTime을 같이 사용해주시지 않으셨는지 궁금해서 여쭤봅니다.
-
미해결[유니티 레벨 업!] 모듈식으로 개발하는 퀘스트&업적 시스템
스크립터블 오브젝트 질문
안녕하세요 복습하다가 질문드리게되었습니다. 스크립터블 오브젝트는 클라이언트 내에서 에셋으로 생성된 형태이기 때문에 되도록이면 컨텐츠 보안에 민감하지 않은 정보를 담고 있어야 할까요? 예를 들어 무기 아이템의 공격력 정보를 스크립터블 오브젝트에 그대로 담아 놓고 쓰면 보안에 취약한가요?
-
미해결[C#과 유니티로 만드는 MMORPG 게임 개발 시리즈] Part3: 유니티 엔진
ResourceManager에 질문있습니다
public class ResourceManager{public T Load<T>(string path) where T : Object{return Resources.Load<T>(path);}}where T를 제거하면 오류가 뜨는데 그 이유가 있을까요 Managers쪽에 있는 ResourceManager resource = new ResourceManager(); 부분에서 궁금한점이 Managers s_instance는 싱글톤으로 유일성이 보장되었고 public static ResourceManager Resource{ get { return Instance._resource; } } 이런식으로 이루어 지는데 resource도 유일성이 보장되는 것인지 아니면 다른 곳에서 Managers.Resource가 호출되면 new ResourceManager로 새로운 _resource가 호출되는지 궁금합니다
-
미해결[C#과 유니티로 만드는 MMORPG 게임 개발 시리즈] Part3: 유니티 엔진
start관련 질문입니다
private void Start() { GameObject go = Resources.Load<GameObject>("Prefabs/Sword/Sword_1"); GameObject sword = Instantiate(go); }이런식으로 playerController스크립트의 start에 프리팹 생성을 넣었는데 하나만 생성되지 않고 계속 생성되어서 왜 이런 동작이 나오는지 궁금합니다
-
미해결[C#과 유니티로 만드는 MMORPG 게임 개발 시리즈] Part4: 게임 서버
메모리가 늘어나는 것과 sendbuffer 관계
안녕하세요! 강사님. 클라이언트를 500명으로 늘렸을 때 말로 설명해주신 부분에서 이해는 가는데, 일부분이 정확하게는 이해가 가지 않는 부분이 있습니다. 작업이 밀려버리면 스레드풀에서 보낸 스레드가 돌아오지 않으니 새로운 스레드를 만들기때문에 메모리가 점점 찬다 -> 스레드가 패킷을 async하게 recv한 다음 jobqueue에 push를 할 때, push 하기위해 lock이 있으니 해당영역에서 병목현상이 발생하고, 그로인해 blocking된 스레드가 오지 않으니 스레드풀에서 새 recv가 오면 스레드 재사용이 아니라 새 스레드를 할당하기 때문에 스레드는 각 스레드별로 stack을 가지고 있기 때문에 이런 스레드별로 가지고있는 용량이 계속 증가하는거라서 메모리가 늘어난다. 라고 이해를 했었습니다. 그런데 나중에 다시 말씀해 주셨을 때,일이 계속 밀리면, 스레드풀에서 스레드가 돌아오지 않으니 새로운 스레드를 만들고, sendbuffer에서 큰 단위의 버퍼에서 짤라서 사용하는걸로 구현했기 때문에 메모리가 계속 늘어난다. 라고 하셨는데, sendbuffer는 여러 스레드가 큰 버퍼에서 짤라서 각자 쓰는 것으로 이해를 했었어서 여러 스레드가 써도 큰 버퍼는 그대로고 얼마나 sendbuffer를 사용하는 횟수가 많아지냐. 가 달라지는거라고 생각이 들었는데,,, 그게 아닌가요? sendbuffer에서 큰 단위의 버퍼에서 짤라서 사용하는 것이 메모리 증가에 무슨 영향이 있는지 잘 이해가 되지 않습니다.
-
미해결[C#과 유니티로 만드는 MMORPG 게임 개발 시리즈] Part3: 유니티 엔진
Action 질문
Action에 += 으로 함수를 추가하면 값이 복사가 되는건가요 아침 참조형식인가요?
-
미해결[C#과 유니티로 만드는 MMORPG 게임 개발 시리즈] Part3: 유니티 엔진
Slerp궁금증입니
if (Input.GetKey(KeyCode.W)) { transform.rotation = Quaternion.Slerp(transform.rotation, Quaternion.LookRotation(Vector3.forward), rotateSpeed); transform.position += Vector3.forward Time.deltaTime speed; } if (Input.GetKey(KeyCode.A)) { transform.rotation = Quaternion.Slerp(transform.rotation, Quaternion.LookRotation(Vector3.left), rotateSpeed); transform.position += Vector3.left Time.deltaTime speed; } if (Input.GetKey(KeyCode.S)) { transform.rotation = Quaternion.Slerp(transform.rotation, Quaternion.LookRotation(Vector3.back), rotateSpeed); transform.position += Vector3.back Time.deltaTime speed; } if (Input.GetKey(KeyCode.D)) { transform.rotation = Quaternion.Slerp(transform.rotation, Quaternion.LookRotation(Vector3.right), rotateSpeed); transform.position += Vector3.right Time.deltaTime speed; }이런식으로 하고 rotateSpeed를 1.0f로 한뒤 유니티에서 a를 살짝 눌렀는데 90도만큼 회전하지 않아서 왜 그런지 궁금합니다
-
해결됨두고두고 써먹는 유니티 VR
XR Interaction Toolkit
저가 사용하고 있는 버전은 2.2.0입니다 영상과 버전차이가 있긴하지만 실뮬레이터를 통해 휠을 이용하여 움직이면 앞과 뒤로 움직여야 하는데 모델의 큐브가 회전합니다 이럴경우 어떤부분을 수정해야 하나요?
-
미해결[C#과 유니티로 만드는 MMORPG 게임 개발 시리즈] Part4: 게임 서버
반사된 메세지 recv하였을 때의 순서 동일한 이유
안녕하세요, 강사님! GameRoom에서 client -> server로 보낸 메세지를 다른 client들에게 broadcasting을 하는데, 그래서 출력 결과가 10개씩 나오는 이유가10개의 클라이언트들이 보낸걸 다시 반환하는것이기 때문에.즉, 반사가 10개씩 나오는거고, 근데 클라이언트 console창이 하나로만 되어있다보니 10개의 클라이언트가 받은 반사메세지가 한번에 출력되어 10개씩 출력되는 것이라고 이해를 했습니다. 그런데 각 session이 어떤 순서로 반사를 받는지 궁금하여 client의 serversession에도 sessionid를 부여하고 테스트로 출력을 해 본 결과 아래와 같았습니다.session이 send 를 하는 것은 async로 구현하였기 때문에 비동기방식인데, 저렇게 규칙적으로 받아오더라구요.(4 2 3 1 5 0 6 7 8 9 ...순서) Program.Room.Enter(this); 를 한 순서대로 GameRoom의 _sessions 리스트에 추가가되니 Broadcast 때 리스트를 foreach하니까 리스트에 추가된 순서대로 오는 것 같다고 생각이 드는데, 사실 네트워크 상태에 따라서 패킷이 라우터에 경로가 달라지니 각기 다른 순서로 올 수도 있고(이건 그렇게 부하가 큰편은 아니니 그래도 해당 원인은 무시한다고 쳐도), 멀티스레드이기도 하고 thread context switching 으로 인해 스레드간 순서가 마구마구 뒤바뀔거라 예상을 했지만, 저렇게 규칙적으로 나오는 이유가 무엇인지 궁금합니다. 그리고 새로 실행 시 마다 저 규칙이 변경이 되는데, 그 이유는 사실Listener에서 Onconnected를 하여 Program.Room.Enter(this); 안에 들어가는 순서가 멀티스레딩이라서 다르게 들어가기 때문이라고 이해를 했습니다. 그렇다면 멀티스레딩으로 인한 순서 뒤바뀜이 있다는 증거이고 사실 listener가 받는 것 또 한 GameRoom에서 broadcasting하는것과 비슷하게 lock을 걸고 순서대로 session list에 추가하고 즉, 순차적으로 여기서 리스트 순서대로 보내도 순서뒤바뀜이 일어나서 GameRoom에서의 List에 쌓이는 순서도 바뀌는거라고 생각이 들거든요. 그러면 SendForEach에서 ServerSession리스트를 보낼 땐 멀티스레드로 인해서 순서가 뒤바뀌는데, Server의 GameRoom에서 ClientSession 리스트를 뽑아 send할 땐 순서가 유지되어 send보내지는 이유는 뭔가요?
-
미해결[C#과 유니티로 만드는 MMORPG 게임 개발 시리즈] Part3: 유니티 엔진
Init()을 static으로 선언해 주신 이유가 있을까요?
Init()을 static으로 선언해 주신 이유가 있을까요?