묻고 답해요
144만명의 커뮤니티!! 함께 토론해봐요.
인프런 TOP Writers
-
해결됨[유니티 레벨 업!] 모듈식으로 개발하는 퀘스트&업적 시스템
QuestSave & Load 질문
마지막 테스트 부분에서 스페이스를 눌러도 Complete 메시지가 출력되지 않습니다. 콘솔 상에서도 오류가 나지 않아서 뭐가 문제인지 잘 모르겠습니다. 어떤 것을 확인해야 할까요? 그리고 3장의 UI부분에서 creator kit의 버전차이 때문에 Quest Trakcer Prefab이 존재하지 않는 것 같은데Task Descriptor 스크립트를 어떻게 해야 하는건지도 궁금합니다. 버전은 2022.3.8f1 입니다!
-
미해결무작정 따라하기! TPS 게임 만들기.
10:58 코드가 작동하지 않습니다.
앞서 Instantiate 함수로 좀비를 spawnPoint에 랜덤으로 생성하는 것은 가능합니다.10:58 에서 EnemySpawn 함수를 영상대로 작성하는 경우 좀비가 등장하지 않고 오류가 발생합니다.NullReferenceException: Object reference not set to an instance of an objectGameManager+<EnemySpawn>d__20.MoveNext () (at Assets/_My/Scripts/GameManager.cs:123)UnityEngine.SetupCoroutine.InvokeMoveNext (System.Collections.IEnumerator enumerator, System.IntPtr returnValueAddress) (at <f7237cf7abef49bfbb552d7eb076e422>:0)UnityEngine.MonoBehaviour:StartCoroutine(IEnumerator)GameManager:Start() (at Assets/_My/Scripts/GameManager.cs:52) 다만 yield return new WaitForSeconds(2f); 아래에 코드를 작성하면 정상적으로 좀비가 랜덤 생성됩니다.그대로 사용해도 되지만 원인을 추적하고 싶은데요 ㅜㅜㅜ어느 부분을 점검하는 것이 좋을지 문의드립니다. IEnumerator EnemySpawn(){ //Instantiate(enemy, spawnPoint[Random.Range(0, spawnPoint.Length)].transform.position, Quaternion.identity); yield return new WaitForSeconds(2f); GameObject enemy = PoolManager.Instance.ActivateObj(4); SetObjPosition(enemy, spawnPoint[Random.Range(0, spawnPoint.Length)].transform); StartCoroutine(EnemySpawn());}
-
미해결[켠김에 출시까지] 유니티 방치형 키우기 게임 (M1 + T2)
늦었지만 멘토링 한 자리 추가 가능한가요
라이브 토요일->일요일 변경사실을 모르고 오늘 업로드된 강의를 들으려고 왔더니 월요일 업로드로 바뀌었네요.평일에는 한번에 3시간 이상 내기가 어려워서, 멘토링 비용 지출하더라도 주말에 깔끔하게 강의를 다 듣고 싶은데 지금이라도 멘토링 한 자리 받아갈 수 있을까요..?
-
미해결[켠김에 출시까지] 유니티 방치형 키우기 게임 (M1 + T2)
라이브 강의 관련 질문 드리고싶습니다.
본 연재형 강의를 신청하면 라이브 강의도 같이 볼 수 있는 줄 알고 신청 기간을 놓쳤습니다.혹시 지금이라도 라이브 강의 신청이 가능한지, 또 라이브 강의 신청 비용은 어느정도 되는지 궁금합니다.
-
미해결따라하면서 배우는 고박사의 유니티 하이퍼캐주얼게임 시리즈 01
ZIGZAG강의중 Start를 Coroutine으로 사용하는 이유가 무엇인가요?
안녕하세요! ZIGZAG 강의를 보던 중 GameController 스크립트와 PlayerController 스크립트에서 IEnumerator로 Start 함수를 사용하는 데, 일반적인 void가 아닌 IEnumerator로 선언하기에 사용하는 이유가 무엇인지 궁금해 질문을 남깁니다.해당 스크립트들에서 Start를 Coroutine으로 선언하는 특별한 이유가 있을까요??
-
미해결[C#과 유니티로 만드는 MMORPG 게임 개발 시리즈] Part3: 유니티 엔진
지형별로 원하는 영역을 전개하고 싶습니다.
안녕하세요. 제 포트폴리오를 만듦에 있어서 어떻게 설정해야 할 지 모르는 문제가 있어서 질문합니다. 제가 구현하고자 하는 포트폴리오에서 바다 영역을 설정하고 싶은데어떤 식으로 설정하면 될 지 잘 모르겠어서 질문드립니다.바다 부분에서 수영을 하도록 하고 싶은데 박스 형태도 아니고 구역이 겹치는 부분이 있어서구역을 어떤 식으로 설정한 다음에 나눠서 해야 할지 감이 안 옵니다. 어떻게 설정하는 게 가장 좋은 걸까요?답변 부탁드립니다. 감사합니다. 추가 정보 => Terrain이 아래 사진에 보이는 영역입니다.
-
미해결[C#과 유니티로 만드는 MMORPG 게임 개발 시리즈] Part4: 게임 서버
Serialization#3강에서 11분 6초 Array.Copy 질문
//string Array.Copy(Encoding.Unicode.GetBytes(this.name),0,segment.Array,count,nameLen); 강사님께서 destination Index가 들어갈 자리에 count를 인자로 주셨는데, segment의 경우 자료형이 ArraySegment이기 때문에 단순 count가 아닌 segment.Offset + count를 destination Index로 주어야 될것같은 의문이 들어서 질문드립니다.
-
미해결[C#과 유니티로 만드는 MMORPG 게임 개발 시리즈] Part4: 게임 서버
잡큐1, 2를 들으며 질문이 있습니다. (Push 큐로직 + Send()의 시간복잡도 관련)
루키스님 안녕하세요?잡큐 1, 2를 들으며 본 서버 강의 앞부분과 비슷한 내용같은데 차이를 몰라 질문 올리게 되었습니다. 아래 질문들의 제 본질적인 질문은옛날에 만든거 아닌가? 왜 새로 만드지? 뭐가 다른거지?입니다 JobQueue #1 강의 중PacketHandler.cs 수정 중에스레드가 일을 Push할 때 처리 가능한 상황이면 해당 스레드가 처리, 그렇지 않으면 Queue에 Push만 하고 종료, 서버코어의 Session.cs의 Send()가 이미 비슷하게 구현됨이라고 설명해주셨는데, 말씀 그대로 이미 비슷하게 큐로 구현이 되어있어 뭐가 다른거지 생각해보다가아래 그림 플로우 처럼 제가 이해한게 맞는지 궁금합니다. JobQueue #2 강의 중 Broadcast() 로직의 O(N^2)을 O(N)으로 줄이기 위해 패킷 모아보내기 스킬을 소개해 주셨습니다.그런데 강의 앞부분 'SendBuffer'에서 버퍼를 다룰 때RecvBuffer와는 다르게 SendBuffer는 외부에 구현함으로써 O(N^2)을 O(N)으로 줄일 수 있다.라고 이미 말씀해주셨는데요, O(N^2)을 O(N)으로 줄이는 둘의 차이점이 궁금합니다.둘은 완전히 다른 얘기일까요? 만약 그렇다면, 둘 다 그대로 방치했다면 O(N^3) O(2N^2, 표현이 맞진 않지만 느낌상)이 되는 로직이 되는건가요? 답변 미리 감사합니다.수강자 올림
-
해결됨[유니티 레벨 업!] 모듈식으로 개발하는 퀘스트&업적 시스템
This quest has already been registered
안녕하세요 좋은 강의 잘 보고 있습니다!2장의 QuestSystem 부분까지 다 듣고 난 후, 마지막 테스트하는 부분에서 This quest has already been registered. 라는 에러가 나옵니다.강의를 돌려보면서 스크립트를 다르게 작성한 부분이 있나 확인해봤는데도 도저히 해결되지 않아 글을 작성하게 되었습니다. 제가 작성한 스크립트입니다.<Quest>public enum QuestState{ Inactive, Running, Complete, Cancel, WaitingForCompletion}[CreateAssetMenu(menuName = "Quest/Quest", fileName = "Quest_")]public class Quest : ScriptableObject{ #region Event public delegate void TaskSuccessChangedHandler(Quest quest, Task task, int currentSuccess, int prevSuccess); public delegate void CompletedHandler(Quest quest); public delegate void CancelHandler(Quest quest); public delegate void NewTaskGroupHandler(Quest quest, TaskGroup currentTaskGroup, TaskGroup prevTaskGroup); #endregion public event TaskSuccessChangedHandler onTaskSuccessChandged; public event CompletedHandler onCompleted; public event CancelHandler onCanceled; public event NewTaskGroupHandler onNewTaskGroup; public void OnRegister() { // Assert는 인자로 들어온 값이 false면 뒤의 문장을 에러로 띄움.(버그검출용) Debug.Assert(!IsRegistered, "This quest has already been registered."); foreach (var taskGroup in taskGroups) { taskGroup.Setup(this); foreach (var task in taskGroup.Tasks) task.onSuccessChanged += OnSuccessChanged; } State = QuestState.Running; CurrentTaskGroup.Start(); } public Quest Clone() { var clone = Instantiate(this); clone.taskGroups = taskGroups.Select(x => new TaskGroup(x)).ToArray(); return clone; } public void ReceiveReport(string category, object target, int successCount) { Debug.Assert(!IsRegistered, "This quest has already been registered."); Debug.Assert(!IsCancel, "This quest has been canceld"); if (IsComplete) return; if (CurrentTaskGroup.IsAllTaskComplete) { if (currentTaskGroupIndex + 1 == taskGroups.Length) { State = QuestState.WaitingForCompletion; if (useAutoComplete) Complete(); } else { var prevTasKGroup = taskGroups[currentTaskGroupIndex++]; prevTasKGroup.End(); CurrentTaskGroup.Start(); onNewTaskGroup?.Invoke(this, CurrentTaskGroup, prevTasKGroup); } } else State = QuestState.Running; } public void Complete() { CheckIsRunning(); foreach (var taskGroup in taskGroups) taskGroup.Complete(); State = QuestState.Complete; foreach (var reward in rewards) reward.Give(this); onCompleted?.Invoke(this); onTaskSuccessChandged = null; onCompleted = null; onCanceled = null; onNewTaskGroup = null; } public virtual void Cancel() { CheckIsRunning(); Debug.Assert(IsCancelable, "This quest can't be canceled"); State = QuestState.Cancel; onCanceled?.Invoke(this); } private void OnSuccessChanged(Task task, int currentSuccess, int prevSuccess) => onTaskSuccessChandged?.Invoke(this,task,currentSuccess, prevSuccess); [Conditional("UNITY_EDITOR")] private void CheckIsRunning() { Debug.Assert(!IsRegistered, "This quest has already been registered."); Debug.Assert(!IsCancel, "This quest has been canceld"); Debug.Assert(!IsCompleatable, "This quest had already been completed"); }} <QuestSystem>public class QuestSystem : MonoBehaviour{ #region Events public delegate void QuestRegisteredHandler(Quest newQuest); public delegate void QuestCompletedHandler(Quest quest); public delegate void QuestCanceledHandler(Quest quest); #endregion private static QuestSystem instance; private static bool isApplicationQuitting; public static QuestSystem Instance { get { if (!isApplicationQuitting && instance == null) { instance = FindObjectOfType<QuestSystem>(); if (instance == null) { instance = new GameObject("Quest System").AddComponent<QuestSystem>(); DontDestroyOnLoad(instance.gameObject); } } return instance; } } private void Awake() { questDatabase = Resources.Load<QuestDatabase>("QuestDatabase"); achievementDatabase = Resources.Load<QuestDatabase>("AchievementDatabase"); foreach (var achievement in achievementDatabase.Quests) Register(achievement); } public Quest Register(Quest quest) { var newQuest = quest.Clone(); if (newQuest is Achievement) { newQuest.onCompleted += OnAchievementCompleted; activeAchievements.Add(newQuest); newQuest.OnRegister(); onAchievementRegistered?.Invoke(newQuest); } else { newQuest.onCompleted += OnQuestCompleted; newQuest.onCanceled += OnQuestCanceled; activeQuests.Add(newQuest); newQuest.OnRegister(); onQuestRegistered?.Invoke(newQuest); } return newQuest; } public void ReceiveReport(string category, object target, int successCount) { ReceiveReport(activeQuests, category, target, successCount); ReceiveReport(activeAchievements, category, target, successCount); } public void ReceiveReport(Category category, TaskTarget target, int successCount) => ReceiveReport(category.CodeName, target.Value, successCount); public bool CantainsInActiveQuests(Quest quest) => activeQuests.Any(x => x.CodeName == quest.CodeName); public bool CantainsInCompletedQuests(Quest quest) => completedQuests.Any(x => x.CodeName == quest.CodeName); public bool CantainsInActiveAchievements(Quest quest) => activeAchievements.Any(x => x.CodeName == quest.CodeName); public bool CantainsInCompletedAchievements(Quest quest) => completedAchievement.Any(x => x.CodeName == quest.CodeName); private void ReceiveReport(List<Quest> quests, string category, object target, int successCount) { foreach (var quest in quests.ToArray()) quest.ReceiveReport(category, target, successCount); } #region Callback private void OnQuestCompleted(Quest quest) { activeQuests.Remove(quest); completedQuests.Add(quest); onQuestCompleted?.Invoke(quest); } private void OnQuestCanceled(Quest quest) { activeQuests.Remove(quest); onQuestCanceled?.Invoke(quest); Destroy(quest, Time.deltaTime); } private void OnAchievementCompleted(Quest achievement) { activeAchievements.Remove(achievement); completedAchievement.Add(achievement); onAchievementCompleted?.Invoke(achievement); } #endregion} 파일을 따로 올리는 곳이 없어 어쩔 수 없이 스크립트 전체를 올렸고 너무 길어서 변수 부분은 생략했습니다!감사합니다.
-
미해결[C#과 유니티로 만드는 MMORPG 게임 개발 시리즈] Part3: 유니티 엔진
같은 위치를 눌렀을 때 idle에서 run으로 애니메이션만 바뀌는 문제에 대해 질문합니다.
안녕하세요.강의를 다 듣고 이리저리 만져보고 있는 학생입니다. 그런데 포인팅 된 터레인으로 이동한 뒤, 같은 위치를 한번 더 클릭하면 애니메이션이 RUN 상태로 바뀝니다. 해당 문제를 해결해 보고 싶어 디버깅을 해 봤습니다.마우스가 클릭 된 이벤트에서 State를 Moving으로 바꿔 줍니다. 하지만 UpdateMoving 함수에서는 다시 State를 Idle로 바꿈에도 불구하고 애니메이션만 RUN을 유지하고 있습니다. 혹시나 싶어 선생님 프로젝트를 열어 실행해 봐도 같은 문제가 있어 어느 부분을 수정하면 좋을지 여쭤봅니다.
-
해결됨[C#과 유니티로 만드는 MMORPG 게임 개발 시리즈] Part4: 게임 서버
Common 폴더에 PDL.xml을 둬야만 작동합니다.
START ../../PacketGenerator/bin/PacketGenerator.exe ../../PacketGenerator/PDL.xmlServer/PacketGenerator/bin에 PacketGenerator.exe가 생성되고, Server/PacketGenerator에 PDL.xml을 둬도 실행이 되는 것 까지 성공하였습니다.하지만 이후 배치파일 작성 부분에서 PacketGenerator.exe을 실행하긴 하지만, PDL.xml을 찾는 경로를 Server/PacketGenerator이 아닌 Server/Common에서 찾고 있었고, 실제로 Common 폴더에 PDL.xml을 두니 정상 작동 하였습니다.해당 현상을 해결할 수 있을까요?
-
미해결[유니티 3D] 실전! 생존게임 만들기 - Advanced
moveposition 문제
move함수에서 다음 프레임까지 움직이는 거리가 0으로 나올때가 있어서 movecheck에서 walk가 true, false 값에서 계속 왔다갔다 하네요. 버그인가요? 수정하는 법 좀 알려주세요
-
해결됨두고두고 써먹는 유니티 VR
build and run 과 apk파일 설치 방법 질문
안녕하세요 먼저 좋은 강의 감사드립니다. 저는 유니티버전 2021.2.13f로 수강중이며XR Toolkit 버전도 2.0.0으로 내려서 수강중입니다.오큘러스 2 기기를 가지고 있으며, 유선케이블로 PC와 연결하여 쓰고 있습니다. (하프라이프도 그걸로 즐기고있습니다)몇가지 문제가 있어서 질문드립니다. 첫째는 유니티 에디터에서 Android로 스위치한뒤, build and run 을 하려고해도 run device 에 oculus2 기기가 뜨질 않습니다.분명 기기랑 연결이 된 상태인데 뜨지 않아서, ADB 2.0 을 깔면 된다길래 그것도 시도해봤지만 뜨질 않습니다. 둘째는, build and run 이 되지 않아서 apk파일을 빌드한뒤, sideQuest등으로 넣어보려고 했는데,그러려면 메타 개발자 페이지에서 개발자 인증을 받아야 한다고 들었습니다. (현재는 조직만 생성해두고 아직 인증 신청해둔 상태입니다.)그런데 모바일앱 상에서도 '기기 -> 개발자 모드 활성화' 가 보이지 않습니다. 메타 개발자페이지에서 조직생성 후 인증까지 받아야만 -> 모바일앱에서 개발자 모드를 활성화 할수 있는것인지 궁금합니다. 그리고 모바일앱에서 개발자 모드를 활성화해야만 sideQuest를 통해 apk파일을 설치할 수 있는것인지 궁금합니다. 질문이 길어 송구합니다.
-
해결됨[켠김에 출시까지] 유니티 방치형 키우기 게임 (M1 + T2)
Rookiss 켠김에 출시까지 Live 멘토링 등록 관련
안녕하세요. 루키스님회사에서 교육비 지원 문제로 멘토링 강좌는 1월에 등록하기로 예약했었는데요. 지금 들어가서 등록할려고 보니깐 이미 마감되었다고 나오는데 어떻게 해야 하나요?
-
해결됨[켠김에 출시까지] 유니티 방치형 키우기 게임 (M1 + T2)
강의 제목의 날짜가 강의가 업로드되는 날짜인가요?
라이브 멘토링이 일요일로 변경되었다고 하여 문의드리게 됐습니다. 강의 업로드 날짜도 일요일로 변경되는 것인지 아니면 강의가 먼저 올라오고 라이브 멘토링을 하시는 건지 궁금합니다.
-
미해결[C#과 유니티로 만드는 MMORPG 게임 개발 시리즈] Part7: MMO 컨텐츠 구현 (Unity + C# 서버 연동 기초)
프로토버퍼를 맥에서도 사용할 수 있나요?
지금 사용중인 운영체제가 맥이라 가상머신을 사용해야할지 고민중입니다.
-
미해결[C#과 유니티로 만드는 MMORPG 게임 개발 시리즈] Part7: MMO 컨텐츠 구현 (Unity + C# 서버 연동 기초)
학습 커리큘럼 관련 질문
안녕하세요.게임 공부에 입문한 웹 개발자 입니다.관심 있는 분야가 게임서버, unity 쪽 인데unity 강의 3(unity), 4(server), 7(unity + server), 8(entity), 9(mmo) 로 공부하고c++ 강의로 넘어가거나, 유니티 기반 게임을 만들어 봐도 막히는 부분은 없을까요?DB 쪽은 MYSQL 엔진 원리와 트랜잭션, 동시성 문제가 일어나는 이유 등을 알고 고급 쿼리는 좀 공부 해야하고, 웹 쪽은 게임 프로그래밍 코어 공부하는데 크게 지장 없으면 넘어가고 싶은데루키스님 의견이 어떠한지 궁금합니다.(entity는 생산성 때문에 하는게 좋을 것 같아서요.)
-
미해결유니티 머신러닝 에이전트 완전정복 (기초편)
mlagents-learn 에러 수정 방법을 문의드립니다.
안녕하세요 강의 잘 듣고 있습니다. 제가 Unity에서 3DBall 실행까지는 성공시켰습니다. 그런데 Anaconda 가상 환경에서 mlagents-learn 을 사용하여서 config\ppo\3DBall.yaml 유니티 빌드 경로 --run-id=tutorial_1 을 실행하는 것에서 에러가 떴습니다. 어떻게 수정을 해야 하는자 정말 모르겠습니다. 알려주시면 감사하겠습니다.
-
미해결[C#과 유니티로 만드는 MMORPG 게임 개발 시리즈] Part3: 유니티 엔진
ui 생성 오류
unity 버전을 2022.3.15를 사용 중입니다.강의에서의 버튼 및 텍스트 UI가 없어 Legacy라는 태그가 달린 UI를 추가해서 사용 중인데 사진과 같은 오류가 나오며 버튼 및 텍스트가 사라지는 문제가 나타나고 있습니다.어떻게 해결해야할까요?
-
해결됨[C#과 유니티로 만드는 MMORPG 게임 개발 시리즈] Part4: 게임 서버
클라의 패킷 조작 방어(범위 내일 때)
루키스님 안녕하세요?본 강의 17:00분대에this.playerId = BitConverter.ToInt64(new ReadOnlySpan<byte>(s.Array, s.Offset + count, s.Count - count));로 범위를 초과하는 패킷에 대해서 클라의 패킷 조작을 방어하는 예시를 들어주셨습니다. 저는 여기서 궁금한게, 클라의 패킷 조작 중 범위를 벗어나지 않는 패킷 공격은 어떤 아이디어로 방어를 할지 궁금합니다. 예를 들어 보스의 체력을 10000 -> 1로 조작한 패킷 같은 경우 아이디어가 궁금합니다.