월 132,000원
5개월 할부 시다른 수강생들이 자주 물어보는 질문이 궁금하신가요?
- 미해결[Rookiss 켠김에 출시까지] MMO Lab #1 (M1) <유니티 방치형 키우기 게임>
지속적인 오류 베이스맵 로드오류
Failed to load prefab : BaseMapUnityEngine.Debug:LogError (object)ResourceManager:Instantiate (string,UnityEngine.Transform,bool) (at Assets/@Scripts/Managers/Core/ResourceManager.cs:28)GameScene:Init () (at Assets/@Scripts/Scenes/GameScene.cs:16)InitBase:Awake () (at Assets/@Scripts/Utils/InitBase.cs:20) NullReferenceException: Object reference not set to an instance of an objectGameScene.Init () (at Assets/@Scripts/Scenes/GameScene.cs:17)InitBase.Awake () (at Assets/@Scripts/Utils/InitBase.cs:20)지속적인 오류가나는데 원인을 못찾겠습니다
- 해결됨[Rookiss 켠김에 출시까지] MMO Lab #1 (M1) <유니티 방치형 키우기 게임>
유니티에서 internal 클래스가 사용되는 예
강의를 들으며 코드를 훑어보던중에 PoolManager.cs에서 Pool 클래스가 internal 접근제한자로 작성되어있는 부분이 궁금하여 질문 드립니다. 현재 코드에서는 어셈블리가 나눠진게Assembly-CSharp, Assembly-CSharp-Editor 인데Pool 클래스가 internal로 작성되는 이유가 있는가요? Editor 어셈블리에서 사용되지 않도록 하는것 인가요? 그리고 유니티에서 internal 접근 제한자가 사용되는 경우가 어떤 경우가 있나요? 간혹 게임 에셋이나 코드드를 보며 공부할때 특정 클래스들이 internal로 되어있는 경우를 보는데이유가 뭔지 궁금점이 생겨 질문 드립니다.
- 미해결[Rookiss 켠김에 출시까지] MMO Lab #1 (M1) <유니티 방치형 키우기 게임>
ShowBaseUI, ShowSceneUI 차이
UIManager에서 ShowPopupUI는 말 그대로 팝업ShowSceneUI는 게임에서 고정되는 UIShowBaseUI는 뭔지 모르겠습니다.
- 미해결[Rookiss 켠김에 출시까지] MMO Lab #1 (M1) <유니티 방치형 키우기 게임>
UI_Base 질문
protected void Bind<T>(Type type) where T : UnityEngine.Object{string[] names = Enum.GetNames(type);UnityEngine.Object[] objects = new UnityEngine.Object[names.Length];_objects.Add(typeof(T), objects);for (int i = 0; i < names.Length; i++){if (typeof(T) == typeof(GameObject))objects[i] = Util.FindChild(gameObject, names[i], true);elseobjects[i] = Util.FindChild<T>(gameObject, names[i], true);if (objects[i] == null)Debug.Log($"Failed to bind({names[i]})");}} 에서 순서가 for (int i = 0; i < names.Length; i++){if (typeof(T) == typeof(GameObject))objects[i] = Util.FindChild(gameObject, names[i], true);elseobjects[i] = Util.FindChild<T>(gameObject, names[i], true);if (objects[i] == null)Debug.Log($"Failed to bind({names[i]})");}로 object에 value를 findchild로 먼저 다 넣어주고그 뒤에 objects.add로 dic형태 _objects에다 채워주어야 하지않나요? 상관없나요?
- 해결됨[Rookiss 켠김에 출시까지] MMO Lab #1 (M1) <유니티 방치형 키우기 게임>
Renderer2D의 SortMode가 Default 인경우
안녕하세요 Rookiss님 3주차 강의 #Data02 를 듣는 중에 궁금한 사항이 생겨 질문드립니다.Renderer2D의 Sort Mode 설정을 CustomAxis로 변경후 Sort Axis 설정을 0, 1, 0 으로 하게 되면오브젝트가 그려지는 기준에 Y좌표가 높은(큰) 오브젝트가 먼저 그려지는것을 이해 하였습니다.(Y좌표가 작은 오브젝트가 맨 마지막(제일 위에) 그려짐) 궁금한점은 CustomAxis 로 변경전 Default인 설정에서는 반대로 Y좌표가 낮은(작은)오브젝트가 먼저 그려지게 되는 것인가요? 아니라면 Default 일때는 어떤 기준으로 그려지는 순서가 정해지게 되는것 인가요? 그리고 궁금한것이 여기서 @BaseMap 의 터레인 타일맵 오브젝트들은 Y좌표가 항상 0인데이것은 왜 항상 맨 처음 그려지는지 궁금합니다. 아니면 아직 정확하게 이해하지는 못하였지만 Order in Layer를 먼저 기준으로 해서 정렬 된후 그 다음 순서로 Y축을 기준으로 정렬하는것 인가요?.. 모르는 부분이 많아 혼자 찾아보려니 이해력이 부족해서 이해하지 못한 부분이 많아 이렇게 질문드립니다..
- 미해결[Rookiss 켠김에 출시까지] MMO Lab #1 (M1) <유니티 방치형 키우기 게임>
CheckHeroCampDistanceAndForcePath() 함수에서
forcePath를 큐에 넣는데Dequeue(); 한 번은 왜 해주는 건가요?
- 미해결[Rookiss 켠김에 출시까지] MMO Lab #1 (M1) <유니티 방치형 키우기 게임>
RigidBody.simulated 가 false로 되어있으면 투사체가 안 맞는거 같습니다
학습자료 보고 따라 만들고 있는데 투사체가 안 맞는거 같아서(OnTriggerEnter2D 함수로 진입을 안함)이것저것 시도해보다 보니 RigidBody.simulated를 켜면 투사체가 맞는 것을 확인했습니다.근데 학습자료에는 Hero와 Monster Init 할 때, 그리드 방식으로 사용하기 위해 의도적으로 RigidBody.simulated를 끄는 것 같은데, simulated를 끈 상태에서 trigger를 작동시키는 다른 방법이 있는지 궁금합니다. 제가 뭘 놓치고 있는거 같은데 잘 모르겠어요.
- 미해결[Rookiss 켠김에 출시까지] MMO Lab #1 (M1) <유니티 방치형 키우기 게임>
큰 프로젝트에서도 Manager 구조를 사용하나요?
큰 프로젝트에서도 Manager 구조를 사용하나요?Manager 에서 Manager를 호출하는등 Manager구조가 단점이 있는데 이를 어떻게 극복하시나요?
- 미해결[Rookiss 켠김에 출시까지] MMO Lab #1 (M1) <유니티 방치형 키우기 게임>
resoureceManager.cs질문
이전 유니티강의에서는public class ResourceManager { public T Load<T>(string path) where T : Object { return Resources.Load<T>(path); } public GameObject Instantiate(string path, Transform parent = null) { GameObject prefab = Load<GameObject>($"Prefabs/{path}"); if (prefab == null) { Debug.Log($"Filed to load prefab : {path}"); return null; } return Object.Instantiate(prefab, parent); } public void Destroy(GameObject go) { if (go == null) return; Object.Destroy(go); } } 로 로드할때 path안에 T타입에 해당하는것들을 찾아서 로드했는데 public class ResourceManager { private Dictionary<string, UnityEngine.Object> _resources = new Dictionary<string, UnityEngine.Object>(); private Dictionary<string, AsyncOperationHandle> _handles = new Dictionary<string, AsyncOperationHandle>(); #region Load Resource public T Load<T>(string key) where T : Object { if (_resources.TryGetValue(key, out Object resource)) return resource as T; return null; } public GameObject Instantiate(string key, Transform parent = null, bool pooling = false) { GameObject prefab = Load<GameObject>(key); if (prefab == null) { Debug.LogError($"Failed to load prefab : {key}"); return null; } if (pooling) return Managers.Pool.Pop(prefab); GameObject go = Object.Instantiate(prefab, parent); go.name = prefab.name; return go; }이번 강의에 것은 Dic으로 담아둘곳은 만들었는데 어디서 찾아서 Dic에다 담아두고 Load로 값을 반환하는지 모르겠습니다 모르겠습니다. 다시 계속 코드를 봤는데_resource라는 dic형태 데이터에 #region Addressable private void LoadAsync<T>(string key, Action<T> callback = null) where T : UnityEngine.Object { // Cache if (_resources.TryGetValue(key, out Object resource)) { callback?.Invoke(resource as T); return; } string loadKey = key; if (key.Contains(".sprite")) loadKey = $"{key}[{key.Replace(".sprite", "")}]"; var asyncOperation = Addressables.LoadAssetAsync<T>(loadKey); asyncOperation.Completed += (op) => { _resources.Add(key, op.Result); _handles.Add(key, asyncOperation); callback?.Invoke(op.Result); }; } _resources.Add(key, op.Result);이 부분에서 데이터를 채워주는것 맞나요? 라이브강의 점점따라가기 힘들어서 시간날때 뒤에서부터 하나하나 계속 보고있습니다.. 강의를 다시보니 LoadAsync가아니라 LoadAllAsync에서 싹다 긁어서 dic데이터형태의 _resource에 메모리상에 들고있겠다로 해석되는데 맞나요?
- 미해결[Rookiss 켠김에 출시까지] MMO Lab #1 (M1) <유니티 방치형 키우기 게임>
로드완료후 터치해서 게임신으로 넘어가면 생기는 오류입니다.
NullReferenceException: Object reference not set to an instance of an objectObjectManager.Spawn[T] (UnityEngine.Vector3 position, System.Int32 templateID) (at Assets/@Scripts/Managers/Contents/ObjectManager.cs:38)GameScene.Init () (at Assets/@Scripts/Scenes/GameScene.cs:24)InitBase.Awake () (at Assets/@Scripts/Utils/InitBase.cs:20)
- 해결됨[Rookiss 켠김에 출시까지] MMO Lab #1 (M1) <유니티 방치형 키우기 게임>
6강 ObjectManager에서 UI_Joystick
UI_Joystick 컴포넌트를 학습하는 도중에 궁금사항이 생겨 질문 드립니다.강의 중에 처음에 RawImage가 달리지 않은 오브젝트를 이용할때는 클릭했을때 조이스틱의 위치가변경되는 범위가 조이스틱 오브젝트가 있는 부분에서만 되었다가RawImage가 추후 부착된 프리펩을 이용했을때는 RawImage의 범위에 속하는곳에 어느곳에터치를 해도 조이스틱 위치가 이동이 되었는데.유니티를 아직 잘 다루지 못해서 추측해서 이해를 했는데 맞는지 한번 확인 부탁 드리겠습니다. public class UI_Joystick : UI_Base { enum GameObjects { JoystickBG, JoystickCursor, } private GameObject _background; private GameObject _cursor; private float _radius; private Vector2 _touchPos; public override bool Init() { ... gameObject.BindEvent(OnPointerDown, type: Define.EUIEvent.PointerDown); gameObject.BindEvent(OnPointerUp, type: Define.EUIEvent.PointerUp); gameObject.BindEvent(OnDrag, type: Define.EUIEvent.Drag); return true; }해당 스크립트에서 BindEvent로 연결해준 부분이 GetObject로 달아준 하위 오브젝트가 아니라컴포넌트가 달린 UI_Joystick 캔버스 자체에 이벤트를 달아주어서캔버스 자체에는 Raycast Target이 없기 클릭을 해도 이벤트 인식이 안되서Raycast Target이 활성화된 하위 오브젝트를 눌렀을때 이벤트가 발생이 되어서 처음에는 조이스틱 부에서만작동이 됬던것이 맞는가요?그게 맞다면 오브젝트 자체에 이벤트를 달아주게 되면, 그리고 그 오브젝트에 이벤트를 인식하는 Raycast Target가 비활성화 되어있거나 관련된 컴포넌트가 없다면, 그 이벤트가 달린 오브젝트의 모든 하위 오브젝트에 Raycast Target 상태를 확인해서 활성화 되어 있다면 하위 오브젝트에 모두 이벤트가 동작되게 되는것 인가요?
- 미해결[Rookiss 켠김에 출시까지] MMO Lab #1 (M1) <유니티 방치형 키우기 게임>
DataManager을 훑어보던 도중에 궁금한점이 있습니다.
public interface ILoader<Key, Value> { Dictionary<Key, Value> MakeDict(); } public class DataManager { public Dictionary<int, Data.TestData> TestDic { get; private set; } = new Dictionary<int, Data.TestData>(); public void Init() { TestDic = LoadJson<Data.TestDataLoader, int, Data.TestData>("TestData").MakeDict(); } private Loader LoadJson<Loader, Key, Value>(string path) where Loader : ILoader<Key, Value> { TextAsset textAsset = Managers.Resource.Load<TextAsset>(path); return JsonConvert.DeserializeObject<Loader>(textAsset.text); } } namespace Data { #region TestData ... [Serializable] public class TestDataLoader : ILoader<int, TestData> { public List<TestData> tests = new List<TestData>(); public Dictionary<int, TestData> MakeDict() { Dictionary<int, TestData> dict = new Dictionary<int, TestData>(); foreach (TestData testData in tests) dict.Add(testData.Level, testData); return dict; } } ... #endregion }TestDic = LoadJson<Data.TestDataLoader, int, Data.TestData>("TestData").MakeDict();DataManager의 위 라인을 실행할 때 TestDataLoader 의 tests 리스트에 값을 담거나 하는 명시된 부분이 없는것 같은데 어떻게 MakeDict(); 가정상적으로 실행될 수 있는것 인가요?신기해서 이유를 알고싶어 질문 드립니다.[Serializable]를 명시하면 리턴되는 JsonConvert.DeserializeObject<Loader>(textAsset.text); 의 값이 알맞은 변수에자동으로 담기는 것인가요?
- 미해결[Rookiss 켠김에 출시까지] MMO Lab #1 (M1) <유니티 방치형 키우기 게임>
람다식에 대해서 궁금증이 있습니다..
프레임워크 코드를 보면서 공부중에 람다식에 대해 궁금증이 생겨서 질문을 남깁니다..프레임워크상으로 람다식으로 액션을 할당하고 있는데, 람다식에 대해 공부를 해봐도 잘 이해가 가지 않아서..위에 매개변수로 넣는 evt는 람다식으로 작성한 Debug.Log("ChangeScene");Managers.Scene.LoadScene(EScene.GameScene);의 내용이 들어감 액션 함수의 이름이라고 볼수있는걸까요?인터넷에 있는 람다식에 대한 영상이나 자료들을 아무리봐도 강사님의 프레임워크처럼 효율적으로 직접 사용하는 부분에 대해서는 내용을 찾을 수가 없어서 공부하는데 힘이드네요..람다식에 대해 설명을 부탁드리겠습니다..혹시 내용이 많아 힘드시다면 공부하기위한 자료가 있을까요?
- 해결됨[Rookiss 켠김에 출시까지] MMO Lab #1 (M1) <유니티 방치형 키우기 게임>
5월 서버 기본기관련되서 질문이있습니다.
5월 서버 강좌를 듣기전에 미리 예습을 하고자하는데,강사님 강의중에Part4 : 게임 서버 (네트워크, 멀티쓰레드, OS)Part5 : 데이터베이스(SQL Server)Part6 : 웹서버 (ASP.NET Core Blazor, WebApi) 현재 강의Part7 : MMORPG 컨텐츠 구현 (Unity + C# 서버 연동)부분을 미리 공부해야할까요?? 해당 파트 내용들이 지금 강의에서 중심적으로 다루어지는지 알고 싶습니다.
- 미해결[Rookiss 켠김에 출시까지] MMO Lab #1 (M1) <유니티 방치형 키우기 게임>
현제 몬스터 ai로는 아이들 상태일때만 플레이어 판별하는거죠?
아이들 상태일때만 플레이어를 판별하고 있는게 맞을까요?만약 Patrol로 인한 무브 상태일때는 플레이어가 가까이 와도 플레이어를 판별못해서 이동만하고 있는 상태가 되는게 맞는걸까요?
- 해결됨[Rookiss 켠김에 출시까지] MMO Lab #1 (M1) <유니티 방치형 키우기 게임>
5월 부터는 서버를 구현한다고 되어있는데!
안녕하세요 5월부터 시작하는 수업에서BM (광고, 결제) 시스템과 서버 기본기 구현을 배우게 되는것으로 알고있는데요!이과정에서 c#과 AWS를 사용하여 직접 서버를 구축하는 방법을 배우는것인지아니면 파이어베이스나 뒤끝같은 관리형 서비스를 사용하는 방법을 배우는건지 궁금합니다 !
- 미해결[Rookiss 켠김에 출시까지] MMO Lab #1 (M1) <유니티 방치형 키우기 게임>
하반기 MMO 서버 개발
하반기 MMO 서버 개발은 c# or c++ 뭐로 개발할 예정이신가요?
- 미해결[Rookiss 켠김에 출시까지] MMO Lab #1 (M1) <유니티 방치형 키우기 게임>
UIManager의 SetCanvers() 부분에서
안녕하세요..UIManager 의 SetCanvas 에서public void SetCanvas(GameObject go, bool sort = true, int sortOrder = 0) { Canvas canvas = Util.GetOrAddComponent<Canvas>(go); if (canvas == null) { canvas.renderMode = RenderMode.ScreenSpaceOverlay; canvas.overrideSorting = true; }"if (canvas == null)" 부분이 "canvas != null" 이 되어야 될 것 같은데 설명 부탁드립니다.
- 미해결[Rookiss 켠김에 출시까지] MMO Lab #1 (M1) <유니티 방치형 키우기 게임>
UI_TitleScene에서 bindevent
GetObject((int)GameObjects.StartImage).BindEvent((evt) => { Debug.Log("ChangeScene"); Managers.Scene.LoadScene(EScene.GameScene); });에서 bindevent()로 extention의public static void BindEvent(this GameObject go, Action<PointerEventData> action = null, Define.EUIEvent type = Define.EUIEvent.Click) { UI_Base.BindEvent(go, action, type); }로 오고 여기서 UI_Base에 있는 public static void BindEvent(GameObject go, Action<PointerEventData> action = null, Define.EUIEvent type = Define.EUIEvent.Click) { UI_EventHandler evt = Util.GetOrAddComponent<UI_EventHandler>(go); switch (type) { case Define.EUIEvent.Click: evt.OnClickHandler -= action; evt.OnClickHandler += action; break; case Define.EUIEvent.PointerDown: evt.OnPointerDownHandler -= action; evt.OnPointerDownHandler += action; break; case Define.EUIEvent.PointerUp: evt.OnPointerUpHandler -= action; evt.OnPointerUpHandler += action; break; case Define.EUIEvent.Drag: evt.OnDragHandler -= action; evt.OnDragHandler += action; break; } }로 참조해서 가져오는것 맞나요? 궁금한것은 지금 define에 4가지 evt상태를 만들어놨는데 pointdown-누를때pointup-땔때drag-드래그Click-클릭 지금은 제일위에 object.bindevent(evt)=> 여기에 evt로 4가지 전부 받아지는것아닌가요? 강의를 다시보니 loadAysync로 전부 로드완료한뒤에 클릭하면 된다고 되어있는데 그냥 4가지 전부 evt로 가져와지고 제일먼저 입력된 click이 받아와지는건가요? pointdown은 누를때 이벤트가 전송되면 pointdown으로 evt가 받아와져야 되는것 아닌가요?
- 미해결[Rookiss 켠김에 출시까지] MMO Lab #1 (M1) <유니티 방치형 키우기 게임>
Adressable그룹에서 Sprite부분에 . 을붙인이후 작동이안됩니다.
영상을 따라했는데 Object_Firewood.sprite를 추가한 이후부터 wizard_SkeletonData : 4/7 에서멈추고있어요 어드레서블을 다시 빌드해도 같은현상이 일어나고있습니다. 유니티버전은 2022.3.16f1에디터 타겟플렛폼 윈도우 입니다.