묻고 답해요
144만명의 커뮤니티!! 함께 토론해봐요.
인프런 TOP Writers
-
미해결[라이브 멘토링] 유니티 뱀파이어 서바이벌 장르 모작
2D게임 개발인데 백터3를 사용하는 이유가 있나요?
이번 프로젝트에서 보통 dir은 Vector3로 사용하시던데 이유가 있나요? 어떤거는 Vector2로하고 어떤거는 Vector3로 해서 살짝 혼란이 오네요. 만약 내가 2D게임을 코드를 짤 때 무엇을 기준으로 Vector2, Vector3 사용을 해야할까요?
-
미해결[켠김에 출시까지] 유니티 방치형 키우기 게임 (M1 + T2)
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에다 채워주어야 하지않나요? 상관없나요?
-
해결됨[C#과 유니티로 만드는 MMORPG 게임 개발 시리즈] Part7: MMO 컨텐츠 구현 (Unity + C# 서버 연동 기초)
CanGo()의 검증이 다중인 이유가 있을까요?
루키스님 안녕하세요?본 강의 Hit 판정 #1에서 CanGo()로 플레이어 이동간 검증을 해주셨는데요,GameRoom.cs의 HandleMove()에서 CanGo()를 이미 사용했는데HandleMove()가 ApplyMove()를 호출함으로써 ApplyMove() 내에서 CanGo()를 다시 호출하고 있습니다.코스트낭비지 않을까?하고 의문이 들어 질문 올리게 되었습니다.//GameRoom.cs의 HandleMove() public void HandleMove(Player player, C_Move movePacket) { // ...생략 // CanGo 호출 1 // 다른 좌표로 이동할 경우, 갈 수 있는지 체크 if (movePosInfo.PosX != info.PosInfo.PosX || movePosInfo.PosY != info.PosInfo.PosY) { if (_map.CanGo(new Vector2Int(movePosInfo.PosX, movePosInfo.PosY)) == false) return; } // ...생략 // ApplyMove() 호출함으로써 CanGo 호출2 _map.ApplyMove(player, new Vector2Int(movePosInfo.PosX, movePosInfo.PosY)); // ...생략 } //Map.cs의 ApplyMove() public bool ApplyMove(Player player, Vector2Int dest) { // ...생략 if (CanGo(dest, true) == false) return false; // ... 생략 } 강의 재밌게 듣고 있습니다.미리 답변 감사합니다.수강자 올림.
-
미해결[C#과 유니티로 만드는 MMORPG 게임 개발 시리즈] Part7: MMO 컨텐츠 구현 (Unity + C# 서버 연동 기초)
서버의 쿨타임 계산 방식이 이해가 가지 않습니다.
루키스님 안녕하세요?본 강의 스킬#2에서스킬 쿨타임은 서버, 클라이언트 둘다 계산을 하는게 맞고,클라이언트는 코루틴 등을 사용해 쿨타임을 계산하는건 이해가 됐습니다. 그런데 제가 이해한게 맞다면,서버에서 쿨타임을 계산하기 위해 CheckUpdateFlag()를 재활용 한다고 하셨습니다. (그 안에 State Info.가 포함되어 있으므로) 그런데 그게 서버가 쿨타임을 계산하는 것과 무슨 상관이 있는지 모르겠습니다.쿨타임 계산이라는 것이 시간 계산에 국한된게 아닌, State 검증을 통해 조건을 확인한다는 말씀일까요? 강의 재밌게 듣고 있습니다미리 답변 감사합니다.수강자 올림
-
해결됨[C#과 유니티로 만드는 MMORPG 게임 개발 시리즈] Part4: 게임 서버
제가 이해한게 맞을까요?
bool repeat = ThreadName.IsValueCreated; 얘는 그냥 Value가 세팅되어 있는지 아닌지를 true false로 반환해줄 뿐이죠? 생성자로 ThreadLocal<T>의 T를 return해주는 람다를 넣어주면 Value를 return한 값으로 채워주고만약에 이미 채워져 있다면 그냥 재사용하는건가요? 생성자로 저렇게 Value를 리턴해주도록 만들어놓으면나중에 Value를 읽어올 때 자동으로 채워주는 건가요?
-
미해결[유니티 레벨 업!] 모듈식으로 개발하는 퀘스트&업적 시스템
IndexoutofRange, Debug.Assert에러 나시는 분들 코드 수정
IndexoutofRange 에러-> QuestSystem Awake의 foreach 부분 주석처리 해주시면 됩니다. achievement 등록이 되어있지 않아서 그런 것 같습니다. Debug.Assert에러 나시는 분들ReceiveReport, CheckIsRunning 함수의 IsRegistered 가 false로 등록되어 있어서 그런 것 같습니다. Debug.Assert(IsRegistered, "This quest has already been registered."); 이 코드 IsRegistered 앞에 " ! "가 붙어 있다면 빼주세요.
-
해결됨[켠김에 출시까지] 유니티 방치형 키우기 게임 (M1 + T2)
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축을 기준으로 정렬하는것 인가요?.. 모르는 부분이 많아 혼자 찾아보려니 이해력이 부족해서 이해하지 못한 부분이 많아 이렇게 질문드립니다..
-
미해결[켠김에 출시까지] 유니티 방치형 키우기 게임 (M1 + T2)
CheckHeroCampDistanceAndForcePath() 함수에서
forcePath를 큐에 넣는데Dequeue(); 한 번은 왜 해주는 건가요?
-
해결됨[C#과 유니티로 만드는 MMORPG 게임 개발 시리즈] Part4: 게임 서버
질문 있습니다
락이 걸려있으면 다른 직원한테 부탁해서 대리로 줄서달라는 느낌이군요그런데 이 다른 직원이 사실은 식당 관리자쪽의 직원이었다라고 하셨는데다른 직원을 윈도우즈 커널 쪽에 있는 스레드라고 생각하면 될까요?
-
미해결[C#과 유니티로 만드는 MMORPG 게임 개발 시리즈] Part3: 유니티 엔진
씬 전환시 리소스 로드 에러
안녕하세요 질문이 있습니다.각각의 씬으로 테스트 할 때에는 잘 되는데, 로그인 씬에서 게임 씬으로 넘어갈 때에 리소스를 로드하는 부분에서 문제가 생깁니다.(@EventSystem, UI_Inven 등의 GameObject) NullReferenceException 이 발생하는데, 문제는 해당 부분에 중단점을 걸고 코드 단위로 테스트해봐도 문제를 알 수 없이 그냥 끝이 납니다.
-
미해결유니티(Unity)로 시작하는 게임개발: Part 3. 슈팅게임 개발
Clamp 사용 시 앞서 설정한 ViewportToWorldPoint의 min, max를 사용하지 않고 새로 설정하는 이유가 있을까요
플레이어 이동 제한을 if로 구현하고 clamp로 더 쉽게 구현하는 방법을 순차적으로 안내주시니 이해하는데 도움이 되었습니다. 👍👍 해당 부분 관련하여 질문이 있습니다.min = Camera.main.ViewportToWorldPoint(new Vector3(0,0,0));max = Camera.main.ViewportToWorldPoint(new Vector3(1, 1, 0));먼저 설정한 값을 Clamp에 사용하지 않고 min = new Vector3(-8, -4.5f, 0);max = new Vector3(8, 4.5f, 0);다시 설정하는 이유가 16:9로 해상도를 고정하기 때문이라고 하셨는데요.앞의 min, max를 pritn 했을 때새로 설정한 Vector3의 x, y 값이 같은 것으로 보입니다.좌표 값을 수치로 직접 입력하시는 이유를 문의드립니다.
-
미해결[켠김에 출시까지] 유니티 방치형 키우기 게임 (M1 + T2)
RigidBody.simulated 가 false로 되어있으면 투사체가 안 맞는거 같습니다
학습자료 보고 따라 만들고 있는데 투사체가 안 맞는거 같아서(OnTriggerEnter2D 함수로 진입을 안함)이것저것 시도해보다 보니 RigidBody.simulated를 켜면 투사체가 맞는 것을 확인했습니다.근데 학습자료에는 Hero와 Monster Init 할 때, 그리드 방식으로 사용하기 위해 의도적으로 RigidBody.simulated를 끄는 것 같은데, simulated를 끈 상태에서 trigger를 작동시키는 다른 방법이 있는지 궁금합니다. 제가 뭘 놓치고 있는거 같은데 잘 모르겠어요.
-
미해결따라하면서 배우는 고박사의 유니티 기초
3D 네비게이션 메시 질문요(유니티 버전이 최근버전이라 잘 진행이 안되네요)
유니티를 최근에 관심있게 학습하고 있습니다. 좋은 강의 감사합니다.현재 유니티 2023.2 버전을 쓰고 있는데 네비게이션이 버전이 달라져서 수강에 애를 먹고 있습니다.일단 Window>Package Manger에서 AI Navigation을 받아서 설치하기는 했는데, 구버전 AI Navigation을 어떻게 설정하는지 좀 알려주시면 감사하겠습니다. 신버전은 Navidation window에 Bake, Object항목이 안보여서 어렵네요네비게이션 메쉬 생성하는거 까지는 인터넷에서 찾아보고, 전체 컴포넌트에 Add하여 Navigation Mesh Agent 넣어서 하긴했는데 Off Mesh Link 형성하는게 여간 어렵네요
-
미해결[C#과 유니티로 만드는 MMORPG 게임 개발 시리즈] Part4: 게임 서버
컨텍스트 스위칭 질문 있습니다.
bool repeat = ThreaadName.IsValueCreated; if(repeat) Console.WriteLine(ThreadName.Value + " (repeat)"); else Console.WriteLine(ThreadName.Value); 위 코드에서 else 블록에 진입 후, Console.WriteLine이 호출되기 전, 컨텍스트 스위칭이 발생한다면 동일한 스레드에 의해 else 구문이 여러번 호출될 가능성이 있을까요?
-
미해결[켠김에 출시까지] 유니티 방치형 키우기 게임 (M1 + T2)
큰 프로젝트에서도 Manager 구조를 사용하나요?
큰 프로젝트에서도 Manager 구조를 사용하나요?Manager 에서 Manager를 호출하는등 Manager구조가 단점이 있는데 이를 어떻게 극복하시나요?
-
해결됨[C#과 유니티로 만드는 MMORPG 게임 개발 시리즈] Part4: 게임 서버
6:40초에 하신 말씀에 대해서 궁금한게 있습니다.
쓰레드가 자신의 소유권을 포기한다는 말씀은쓰레드를 조종하는 CPU 코어가 연결을 끊었다라고 이해해도 될까요?그리고 임의의 시간 후에 락이 풀렸는지는 다시 똑같은 쓰레드로 확인하는건가요?
-
미해결[라이브 멘토링] 유니티 뱀파이어 서바이벌 장르 모작
OnDestroy에서 콜백함수 지울 때 질문입니다.
Awake에서 리스너를 등록할 경우, 오브젝트가 한 번도 활성화 되지 않았다고 가정할 때 OnDestroy 함수가 호출되지 않아 나중에 오류가 날 수 있을 것 같은데요.(물론 Start에서 등록을 하면 아무런 문제가 없겠지만요.)Awake에서 리스너를 등록하는 경우는 아예 없나요?제 짧은 식견으로는 버그의 가능성만 보이고 실제 있을 법한 사례인지는 판단이 어려워 여쭤봅니다..
-
미해결[켠김에 출시까지] 유니티 방치형 키우기 게임 (M1 + T2)
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에 메모리상에 들고있겠다로 해석되는데 맞나요?
-
미해결[켠김에 출시까지] 유니티 방치형 키우기 게임 (M1 + T2)
로드완료후 터치해서 게임신으로 넘어가면 생기는 오류입니다.
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)
-
해결됨[켠김에 출시까지] 유니티 방치형 키우기 게임 (M1 + T2)
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 상태를 확인해서 활성화 되어 있다면 하위 오브젝트에 모두 이벤트가 동작되게 되는것 인가요?