묻고 답해요
161만명의 커뮤니티!! 함께 토론해봐요.
인프런 TOP Writers
-
미해결[C#과 유니티로 만드는 MMORPG 게임 개발 시리즈] Part7: MMO 컨텐츠 구현 (Unity + C# 서버 연동 기초)
Protobuf 설치
요즘도 Protobuf 사용할려면 수동으로 설치 해야 하나요? 수동으로 하지 않고 Nuget에서 Google.Protobuf, Grpc.Tools 설치하고 메모장(텍스트 문서) 확장자 .proto 만든 다음에 비주얼 스튜디오에 추가하기만 해도 되나요?
-
해결됨유니티 시스템 프로그래밍 Pt.1 - 상용 게임 구현을 위한 핵심 시스템 올인원 패키지
UserDataManager 코드 질문입니다.
using System.Collections; using System.Collections.Generic; using UnityEngine; public class UserDataManager : SingletonBehaviour<UserDataManager> { public bool ExistsSavedData { get; private set; } public List<IUserData> UserDataList { get; private set; } = new List<IUserData>(); protected override void Init() { base.Init(); UserDataList.Add(new UserSettingData()); UserDataList.Add(new UserGoodsData()); } public void SetDefaultUserData() { for(int i = 0; i < UserDataList.Count; i++) { UserDataList[i].SetDefaultData(); } } public void LoadUserData() { ExistsSavedData = PlayerPrefs.GetInt("ExistsSavedData") == 1 ? true : false; if(ExistsSavedData) { for (int i = 0; i < UserDataList.Count; i++) { UserDataList[i].LoadData(); } } } public void SaveUserData() { bool hasSaveError = false; for(int i =0; i < UserDataList.Count; i++) { bool isSaveSuccess = UserDataList[i].SaveData(); if(!isSaveSuccess) { hasSaveError = true; } } if(!hasSaveError) { ExistsSavedData = true; PlayerPrefs.SetInt("ExistsSavedData", 1); PlayerPrefs.Save(); } } }위 코드의if(!hasSaveError) { ExistsSavedData = true; PlayerPrefs.SetInt("ExistsSavedData", 1); PlayerPrefs.Save(); }이 부분에서 PlayerPrefs에 "ExistsSavedData"를 1로 저장해주는 이유가 있나요??제 짧은 생각으로는 ExistsSavedData가 어차피 true로 처리되기 때문에 필요가 없지 않을까라는 의견입니다이와 더불어 LoadUserData()에서도 PlayerPrefs.GetInt()를 안하고 if(ExistsSavedData) 문만 가지고는 안되는지 궁금합니다. 강의 잘 듣고 있습니다. 감사합니다!
-
미해결[C#과 유니티로 만드는 MMORPG 게임 개발 시리즈] Part3: 유니티 엔진
디버그 불가.. Unity에 연결 불가
어제까지 됬었는데, 갑자기 안됩니다. 찾아보니 갑자기 또 된다고 하시는분 있던데.. 해결 방법 아시는분 답변 부탁드립니다.
-
미해결[C#과 유니티로 만드는 MMORPG 게임 개발 시리즈] Part7: MMO 컨텐츠 구현 (Unity + C# 서버 연동 기초)
바이너리 직렬화
MMO 현장에서 Xml, Json, Protobuf와 같은 포맷을 사용 하지 않고 바이너리 직렬화만 하는 경우가 있나요?
-
해결됨데이터베이스를 결합한 Unity 실전 게임 만들기
GetValueAsync(1)강의에서 Update메소드 질문입니다.
질문은 언제든지 해주세요!질문은 강의와 관련된 부분만 해주시면 됩니다!userInfoCache로 처음 Start할때 불러와서 저장을 한다음에 Update에서 비동기프로그래밍으로 CoinText를 업데이트 해주셨는데어차피 캐시값을 불러와 UI를 계속 갱신하는건 불필요한 작업 아닌가요?Update메소드에서 왜 작업을 하는지 궁금합니다.
-
미해결[라이브 멘토링] 유니티 뱀파이어 서바이벌 장르 모작
Addressables로 등록한 Slice된 Sprite의 하위 Sprite 접근법에 대해 질문드립니다
현재 Effect animation을 만드는 중, animator의 사용 대신 SpriteRenderer의 sprite만 교체하는 방식으로 최적화를 시도하고 있습니다.여기서 문제된 점이 class에 sprite[]를 선언 후 해당 class를 부착한 GameObject에 inspector에서 미리 slice된 sprite의 내용물들을 할당해줄 경우, Sprite(2D and UI)타입은 메인 스레드 외에서 할당되면 안된다는 에러가 나서 런타임 내에 할당하는 방식을 시도중입니다.Addressables를 이용하여 slice된 Sprite를 로딩할 경우, Sprite의 slice된 첫번째 sprite만 Load가능하고 나머지는 호출이 불가능합니다. 이를 해결하기 위해 LoadAssetAsync대신 LoadAssetsAsync를 이용한 LoadAsync 생성 등 여러가지로 시도해보았으나 전부 실패하여 결국 Sprite를 Unity 내에서 slice하는 대신 각자 개별 Sprite로 만들어서 import해야 한다는 방식에 이르렀습니다.다만, 이 방식은 최적화를 위해 굳이 animator를 사용하지 않으려고 한 의미가 없어진다고 판단되어 Addressables에서 Slice된 Sprite의 사용 방법에 대한 의견 여쭤보고 싶습니다.
-
해결됨【2025年版】Unity×C#入門講座|2Dタワーディフェンスゲーム開発マスター|クリック&バトルシステムの作り方
수업 자료 링크를 어디서 볼 수 있나요?
쩝.. 일본 강의를 번역한 거였군요.좀 표시해 두시지.수업 자료 링크만 알려주십시오.한번 공부해 보겠습니다.
-
해결됨[Unity] 멀티플레이 게임 필수 기능 구현 - 서버 & 데이터 관리까지!
17강 우편 보내기 메일박스 버튼 클릭 부분
Init 씬을 클릭하면 Main 씬으로 씬전환이 안됩니다.PlayerPrefs 를 지우고 실행하면 'Firebase 연결에 성공했습니다.', '게스트 로그인 성공' 메시지가 떠도 메인씬 전환이 안되고 계속 까만 화면만 나오고, 그 이후에 다시 실행하면 'Firebase 연결에 성공했습니다.' 만 나오고 닉네임 입력도 없이 여전히 까만 화면만 나옵니다.DB 부분이 안되는 것 같은데, 코드는 이상이 없습니다. => 파이어베이스에서 다시 DB 프로젝트 생성해서 해결했습니다. 지금 현재로서는 db에 접속한지 30일이 지나서 안됐던 것 같습니다.
-
미해결[Unity] 멀티플레이 게임 필수 기능 구현 - 서버 & 데이터 관리까지!
Main 씬에 Manager 오브젝트는 삭제하는 건지요?
DB를 먼저하고 파티, 그리고 우편으로 강의를 이어가고 있는데 Main 씬에 있는 Manager 오브젝트는 Init 씬으로 옮겨진 건지요?
-
미해결[유니티 레벨 업!] 모듈식으로 개발하는 스킬 시스템
TargetSearcher에 대해서 질문이 있습니다
강의 내의 TargetSearcher는 기준점 하나를 잡은 뒤 그 기준점으로 타겟을 선정하는 방식으로 이해했습니다.저는 이 방식을 응용해서 기준점을 여러 개 잡는 방식(다중 타겟 선택)을 구현하고 싶은데어떻게 접근 해야할지 감이 잡히지 않아서 질문 드립니다.일단은 select를 여러번 하는 방식으로 대략적인 설계를 했는데이 경우 인디케이터와 상호작용을 어떻게 고려해야할지 모르겠습니다.그래서 강사님께선 어떤식으로 구현하실지 궁금해서 질문 남깁니다.추가로 머리가 턱 막히는 기능을 구현해야 할 때 어떤 식으로 문제에 접근 하시는지도 여쭤보고 싶습니다.
-
미해결[켠김에 출시까지] 유니티 캐주얼 모바일 MMORPG (M2)
게임 로직 루프에서 게임 틱 누락으로 인한 높은 CPU 사용 문제
수업에서는 게임 로직 루프에서의 게임 틱(game tick)에 대해 다루지 않아 CPU 사용률이 항상 높게 유지되는 문제가 발생한다.
-
미해결절대강좌! 유니티6 - ECS/DOTS 프로그래밍 마스터클래스
ecs관심이 있었는데 강의 잘 보았습니다.
현재 강의는 심화과정 2강의 빼고 다 보았습니다. 몇가지 궁금한 사항들이 있어서 질문드리려고 합니다. ecs, dots 병렬처리를 위해서 유니티에서 사용하는 시스템인데요. 이 강의에서도 여러 쓰레드를 사용하기 위해 잡에 작업들을 할당하는 코드를 사용하는 것으로 보입니다. 그리고 발사체와 적이 충돌시 HP를 깍는데 EnemyComponentLookup[enemy] = enemyData; 이런 코드가 있던데 이는 실제로 해당 컴포넌트에서 hp 변수를 수정하는 내용으로 보입니다. 하지만 멀티쓰레드에서 lock이나 뮤텍스같은 안전장치가 없는데 저런식으로 사용할 수 있는지 묻고 싶고... 두번째는Enemy오브젝트에서 여러 엔티티 update 이벤트를 사용하고 있습니다. EnemyComponent는 발사체에서도 사용하고 있고 moveComponent에서도 사용하고 있고 hpBarComponent에서도 사용하고 있습니다. Enemy가 죽었을때 수십만 이벤트가 현재 할당된 상태에서 문제가 없는것인지 추가적인 내용을 알 고 싶습니다. 현재 만마리 이상 스폰을 시키면 간혹 죽은 Enemy들이 살아있는 것 같은데 ecs, 멀티쓰레드 강의에서 젤 중요한 내용이 빠진게 아닌가 싶어서 여쭈어봅니다.
-
미해결[라이브 멘토링] 유니티 뱀파이어 서바이벌 장르 모작
유니티 데이터 저장객체 ScriptableObject에 대해 의견 여쭤보고 싶습니다
데이터 저장 방식에 대하여 공부하던 중, ScriptableObject라는 유니티 데이터 저장 용 객체에 대해 알게 되었습니다.보통 현업에서 일할 때 캐릭터/몬스터의 스텟 등 에디터 내에서 조절해주는 경우는 ScriptableObject를 사용하고, 세이브 파일, 설정 값 저장 등 런타임 동안 읽고 쓸 가능성이 있는 데이터는 Json 및 xml 파일에 데이터를 저장한다고 배웠습니다.선생님의 수업에서 DataManager들은 스텟같은 전자에 속하는 데이터들도 Json or xml 파일로 데이터를 저장하는 것으로 배워서 궁금한 점이 1. 추측하기로는 배포 후 밸런스 패치 등 외부에서 스텟등을 조절해주기 위해 Json방식을 쓰는 것일까 하는데 맞나요?2. ScriptableObject 방식이 문자열 읽고 파싱하고 C#데이터로 바꾸는 Json 사용 방식보다 성능이 우수하다고 하는데 전자를 별로 사용하지 않는 이유가 있나요?3. 현업에서는 ScriptableObject를 자주 사용하나요?4. 선생님의 ScriptableObject에 대한 개인 의견(ex. 불편함, 효율적임, ...)은 어떠신가요?이렇게 4가지입니다.항상 좋은 수업들 올려주셔서 감사합니다. 새로운 강의를 볼 때마다 새로운 가르침을 얻을 수 있어 좋습니다.
-
미해결[C#과 유니티로 만드는 MMORPG 게임 개발 시리즈] Part4: 게임 서버
컨텐츠 단, 엔진 단
컨텐츠 단, 엔진 단이 뭐에요?
-
미해결【2025年】Unity × C#で作る本格2D戦略型タワーディフェンスゲーム開発講座
녹음 확인 해주세요
4분50초경에 이상한 목소리가 녹음이 되어 있는것 같습니다
-
미해결[라이브 멘토링] 유니티 뱀파이어 서바이벌 장르 모작
안녕하세요 선생님 공부중에 궁금한게 있어서 질문 드려요
안녕하세요 선생님 현재 올려주신 게임을 하나하나 분석하면서 공부하고 있는 취준생 입니다.다름이 아니라 이건 치트를 쓰지 않으면 잘 찾을수 없는 부분인데 제가 이해한게 맞는지 궁금하여 질문 드립니다.일단 첫번째 버그? 이상한 부분은 서포트 스킬을 배웠을때 수치 변화 입니다. 예를들어 공격력을 5프로 올리는 서포트 스킬을 배웠을때 5프로 수치가 상승해야 하는데 10프로가 상승을 하길래 브레이크 포인트로 차근차근 넘겨보니 UpdatePlayerStat 함수를 호출할대 InitCreaureStat 을 호출하는데 거기서 Atk,MaxHp 등의 값을 곱해주고 다시 updateplayerstat 에서 처리를 또 해주더라구요 그래서 일단은 InitCreautreStat 함수 부분에 Stat 처리를 해주는 부분을 주석처리 해서 중복으로 서포트 스킬의 general 타입들이 적용되는걸 막았는데 이렇게 하는게 맞는건지 궁금합니다. 두번째 이상한 부분은 special 서포트 스킬 부분입니다.이것도 역시 치트를 쓰지않으면 정말 찾기가 힘든 부분인데 현재 skillbook 스크립트 부분에서 addsupportskill 을 통해서 서포트 스킬을 추가하고 있는데 여기서 special 서포트 스킬의 경우에 skillbase 에 updateskilldata 함수에서 해당 공격스킬의 추가 값을 처리해 주는걸로 알고 있습니다 근데 여기서 예를들어 일렉트로닉 필드의 범위를 0.1 증가해주는 스킬을 배웠다고 했을때 처음에 배울때는 0.1이 정상적으로 증가를 하는데 두번째 일렉트로닉 필드 0.1 증가를 배웠을때 SupportSkills 리스트를 순회하면서 값을 적용하는데 이미 0.1이 증가된 specail 스킬을 한번 더 순회를 하여 0.1 + 0.1 해서 0.2가 되어야 하는데 0.1증가되서 0.2가 된 상태에서 한번 더 순회를 해서 0.3이 되는 현상이 있다는걸 알게 되었습니다.그래서 현재 해결책으로는 AddSupportSkill 에서 Special 서포트 스킬을 SkillBase 의 updateskillData 부분에서 처리를 넘겨줬는데 그러지 않고 그냥 AddSupportSkill 함수 내에서 변경된 값을 추가를 하고 UpdateSkillData 함수로 넘기지 않고 처리 하는 방식으로 수정을 해서 이상하게 수치가 나오는 부분을 수정을 하고 기존의 Skillbase 스크립트 부분의 UpdateSKillData 함수 부분에서 처리하는 부분을 주석처리 해줘서 일단 중첩되서 처리가 되는 값을 수정을 해주었는데 혹시 더 나은 방법이 있는지 궁금하여 질문을 남깁니다.일단 이렇게 좋은 자료를 주셔서 너무 감사드리고 앞으로도 계속 꾸준히 코드를 뜯어보며 공부를 열심히 하겠습니다. 날씨가 많이 추운데 감기 조심하시고 공부하다가 궁금한 부분은 이곳에 또 남기도록 하겠습니다.
-
해결됨유니티 시스템 프로그래밍 Pt.2 - 상용 게임 구현을 위한 핵심 시스템 올인원 패키지
파이어베이스 이벤트 로그 수집관련 질문입니다.
안녕하세요. 파이어베이스 이벤트 로그 수집관련해서 2가지 질문이 생겼습니다. 앱 삭제시 삭제하는 유저의 마지막 스테이지 값을 함께 받아보고 싶은데 어떻게 구현해야 하는지 궁금합니다. 동일한 유저가 앱을 설치하고 삭제한 뒤 다시 재설치하고 또 삭제한 다면 설치한 유저는 총 2명, 삭제한 유저는 총 2명으로 기록되는지 궁금합니다. 아무래도 파이어베이스 이벤트 로그 수집에 시간차가 있다보니 정확한 판단을 내리기가 어려워 테스트 하는게 쉽지가 않네요.
-
미해결AI 시대의 혁신적인 게임 개발 입문 with Unity6
30강, circlecollider의 radius 크기 설정 원리가 궁금합니다
30강에서 과일의 Collider2D radius 설정과 관련하여 아래와 같이 질문합니다. 과일들의 크기가 다른 데 같은 radius를 적용해서 모든 과일이 서로 접하도록 설정하는 원리현재 radisu 값을 3.4로 설정하였는데, 이 값을 디자인 단계에서 어떻게 산출하는 방법
-
미해결[유니티 레벨 업!] 모듈식으로 개발하는 아이템 시스템
카테고리 클래스를 어떻게 해야할지 모르겠어요ㅜㅜ
1.이 강좌의 아이템 시스템과 전에 만드신 퀘스트 시스템 강좌를 합치려면 어떻게 해야 하나요?퀘스트 시스템에서는 아이텐티파이드 오브젝트가 없어서 어떻게 해야할지 모르겠습니다. 2.카테고리 클래스에서 Equals함수와 GetHashCode함수를 오버라이드하는 이유를 잘 모르겠습니다. 참조도 0개고 부모의 구현을 그대로 호출하는데 어떤 의미인지 궁금합니다. 아 다이얼로그 시스템 강좌 계획은 없으신지도 궁금합니다.
-
미해결[켠김에 출시까지] 유니티 캐주얼 모바일 MMORPG (M2)
선 이동과 히트 판정에 대해 질문 드립니다.
안녕하세요. 루키스님!M2 코드를 분석하면서, 약간 다른 게임을 (브롤스타즈같은 모바일 탑뷰 슈팅게임) 만들고 있습니다.선 이동으로 구현하고 있는데, 서버 판정 이후 해결되지 않는 부분이 있어 질문 드립니다. 현재까지 구현한건 키보드 기반 간단한 이동 동기화 입니다. 이동 방법은 키보드나 조이스틱 기반의 선 이동으로 구현하려 합니다.지금 이동 코드는 루키스님 질의응답과 해외 커뮤 글을 토대로 아래 방식으로 구현 했습니다.0.1초마다 동기화를 시도함키보드 입력이 있으면 desirePos를 그 방향으로 0.1초동안 갈 수 있는 pos 를 찍음클라 판단으로 갈 수 있는 곳(벽X, 장애물 X) 이면 destPos를 갱신서버로 전송서버에서 정당한 이동 요청인지 판정맞으면 브로드캐스트각 클라에서 이동 패킷 수신 후 캐릭터 갱신 여기까지 하면 어느정도 자연스럽게 작동은 합니다.하지만 이동을 보낸 클라 입장에서 서버로 부터 받은 판정을 적용하는 부분에 어려운 부분이 있습니다.아무래도 선 이동이 예측 이동 후 보정이라 네트워크 지연으로 예측과 판정이 너무 많이 틀어지는 경우가 있을 것 같습니다.예를들어, 클라에서 단순 우측으로만 움직인다고 가정하고, x 축으로 10 -> 11 -> 12 -> 13 선 이동을 했다는 가정으로 시작하겠습니다.네트워크 지연으로 13에 도달했을 때 서버에서 10 이동 동기화가 왔다면, 선 이동 클라는 10으로 튕겨 버립니다. 그 후 방향을 바꿔 왼쪽으로 움직이면 10 -> 9 -> 8 -> 7 로 먼저 움직이겠지만, 이미 서버로 보낸 이동 좌표로 인해 11, 12, 13이 또 오기 때문에 캐릭터는 퉁퉁 튀면서 움직이지 못하는 상태가 될 것 같습니다.또한, 다른 클라에서 공격을 해도 히트 판정이 다 꼬여 게임이 이상해질 것 같습니다. 이 문제를 해결하기 위해 고민해보니, 클라에서 선 이동 버퍼(기록)을 둔다고 합니다.이 버퍼는 아래 문제가 생겼을 때 서버 판정을 다시 replay 하고, 서버 판정을 완료하면 다시 저장된 선 이동 버퍼를 replay 해 클라에서 너무 앞서나가지 않도록 하더라구요.선이동 버퍼의 index와 서버 판정의 index가 n 이상 벌어지면, 서버 판정 index의 pos 로 플레이어 위치를 되돌리고 클라 선 이동 판정을 다시 실행시킴. 서버 판정으로 이동할 수 없는 pos 라면, 해당 pos 로 되돌리고 그 그 이후 선 이동 버퍼를 replay 여기서부터 질문입니다만,이런 방법이 쓰이는 이유는 게임 전체의 공정성 때문 일까요?네트워크 문제가 있는 일부 클라는 계속 롤백되는 경험을 하지만, 다른 유저들은 서버에서 허가한 상태만 보니까요.보통 선 이동 버퍼와 서버 판정은 어느정도로 갭을 두나요?0.1초마다 동기화 한다고 가정 하고 이동 패킷은 ++1 인 정수형 인덱스로 구분한다고 했을 때, 저는 한 4 정도로 생각했습니다.선 이동과 서버 판정이 약 0.4초이상 벌어지면 롤백하고 다시 동기화 한다 입니다.히트 판정의 경우 클라들, 서버가 같은 ticktime을 공유하고 있고 서버에서 내려준 히트 시작 시간을 보내주면, 클라에서 timejob queue에 넣어두었다가 해당 시간이 되면 애니메이션을 시작하면 되지 않을까? 라는 생각 입니다.고민을 많이 해보았는데, 이 이상 생각이 안되어 질문 드립니다.바쁘시겠지만 답변 주시면 감사히 학습에 사용하겠습니다.