묻고 답해요
144만명의 커뮤니티!! 함께 토론해봐요.
인프런 TOP Writers
-
미해결[켠김에 출시까지] 유니티 방치형 키우기 게임 (M1 + T2)
AttackBuff.ClearEffect() 메서드 문의
버프류 스킬 AttackBuff.ClearEffect() 메서드 관련 궁금한 점이 있습니다. public override bool ClearEffect(EEffectClearType clearType) { if(base.ClearEffect(clearType) == true) RemoveModifier(Owner.Atk, this); return true; } 여기서 base.ClearFffect() 는ObjectManager.Despawn()을 호출하고, 이건 또ResourceManager.Destroy()를 호출함으로써AttackBuff가 붙어있는 EffectBase 프리팹을 날려버리면서 true를 반환하는걸로 이해하는데요,이 경우 AttackBuff 인스턴스가 날라가게 되는데 그 다음줄 RemoveModifier가 실행되고, 또 자기 자신을 인자로 넘겨줄 수가 있나요?RemoveModifier(Owner.Atk, this);
-
미해결[켠김에 출시까지] 유니티 방치형 키우기 게임 (M1 + T2)
apk 빌드하면 먹통되요
핸드폰에서 한번 해볼까 하고 안드로이드 apk 빌드해서 LDplayer 나 핸드폰 s22 울트라 정도에서 해보려했는데 안되네요 혹시 다른 버전은 다 되고 있나요?일단 터치 안되서 모바일 터치로 변경 했구요그러니 잘되네요 Game Sceen으로 넘어가는 부분도물론 찾아 봐야 겠지만 어떤 문제인지 폰에서는넘어가지지 않구요. 다른분들은 다 잘 되시나요?시뮬레이터에서는 아무 이상없이 잘됩니다.핸드폰 및 LDPlayer 가면 그러네요...Window 빌드 해서 해보니 안되네요...시뮬레이터 빼고 다안될듯 혹시 알아내신분있으면 공유 부탁드려요~~애러가 상당히 많이 나는데...뭐가 문제지 흠.. 강의 소스 그대로 사용했어요
-
미해결[켠김에 출시까지] 유니티 방치형 키우기 게임 (M1 + T2)
구현에 수학이 필요한 경우
실무에서도 개발자들이 전부 수학을 잘하진 않을텐데,구현에 수학이 필요한 경우 어떻게 구현하나요?지금까찌 수학 식이 들어간 코드가 꽤 나왔었는데구조나 설계?가 중요하지 그 부분은 별로 중요하지 않다고 하셨는데, 롤 케릭터 스킬들을 어떻게 구현할 지 생각해보라고 해셔서생각하다가 멀티플레이 기준으로 구현한다고 했을 때 다이애나,카밀,아트록스 등등 수학적으로 구현?해야될 것 같은 스킬들이 꽤 많은 것 같은데 게임 개발자들은 수학도 다 잘하는 건지 궁금하네요,,,
-
해결됨[켠김에 출시까지] 유니티 방치형 키우기 게임 (M1 + T2)
하반기 MMO 서버 프로젝트
안녕하세요 강의 잘보고있습니다.올해 상반기 하반기 나눠 프로젝트를 진행한다고 종종 언급하시는데하반기 MMO 서버 프로젝트도 Unity를 활용한 프로젝트 일까요?
-
미해결[C++과 언리얼로 만드는 MMORPG 게임 개발 시리즈] Part4: 게임 서버
google Protobuf 관련 메모리 릭
CrtDumpMemoryLeaks(); 함수 호출을 통해 메모리 릭을 검사했는데 강사님의 코드에서는 다 잘 지우는 것 같아서 강사님 코드에서의 릭은 아닌것 같습니다.. 강사님 코드에서 객체 생성을 다 막고 디버깅해도 똑같은 메모리 릭이 남았습니다.. google protobuf 에서의 릭인 것 같은데.. pb.h pb.cc 는 건들지 못하니 고칠 방법도 없고 해서 이렇게 질문 올립니다. 저 메모리 릭을 해결하는 방법이 있을 까요..?
-
미해결[켠김에 출시까지] 유니티 방치형 키우기 게임 (M1 + T2)
지속적인 오류 베이스맵 로드오류
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)지속적인 오류가나는데 원인을 못찾겠습니다
-
해결됨[C++과 언리얼로 만드는 MMORPG 게임 개발 시리즈] Part4: 게임 서버
Win32API 클라이언트 연동
강의에서는 서버에서 정해진 데이터(id, hp, 공격력)를클라쪽으로 broadCast 하고,클라에서는 Recv만 하고 있는데, 클라쪽에서도 Send하고서버에서 Recv하는 echo방식으로는어떻게 수정해봐야할까요..? ㅠ 목적은 Win32APi로 만든 클라이언트 2~3개정도 켜서 PacketHandler까지 구현된 Server와 붙혀서 이동동기화 부터 시도하고 있습니다그래서 클라이언트 1개에서 만약 이동했다면 그 행동이서버랑 다른 클라이언트에도 똑같이 보이게하고 싶습니다ClientPacketHandler에 ServerPacketHandler의 Make_S_TEST 함수를 복붙하고GameServer의 방법과 같이 BroadCast를 해야할지 아니면 Send함수를 따로 구현해야 할지 방향을 못잡겠습니다.
-
미해결[C++과 언리얼로 만드는 MMORPG 게임 개발 시리즈] Part4: 게임 서버
RegisterRecv() 함수에서
WSABUF wsaBuf; ::WSARecv(_socket, &wsabuf, ...);위 코드에서 WSABUF 타입 객체를 스택에 생성에서 WSARecv() 함수에 넘기면 이 함수가 바로 완료되지 않고, 나중에 완료 통지로 받는다면 스택에 생성된 WSABUF는 그전에 해제되서 잘못된 메모리에 쓰게 되는 게 아닌가요?또 이런 api들을 호출할 때 넘길 파라미터를 스택에 생성할 지 new 로 힙에 생성할 지 기준은 어떻게 정하시는지 궁금합니다.
-
미해결[C++과 언리얼로 만드는 MMORPG 게임 개발 시리즈] Part4: 게임 서버
클라이언트에 ServerCore를 복사 시, #include 안될 때
포트폴리오 작업하고 있는데, 클라이언트를 PacketHandler까지 작업 완료된 서버랑 연동해보려고 합니다~ ClientServiceRef service = MakeShared<ClientService>(NetAddress(L"127.0.0.1", 7777),MakeShared<IocpCore>(),MakeShared<ServerSession>, // TODO : SessionManager 등1); 클라이언트쪽에서 위와 같은 코드로 서버와 연결하기 위해 ServerCore 라이브러리를 통쨰로 클라이언트쪽으로 가져와야 하는데... 비쥬얼 스튜디오 2022에서파일 --> 추가 --> 기존 프로젝트 메뉴 이 기능으로 ServerCore 프로젝트를클라이언트 솔루션에 복사 하고,파일탐색기에서도 ServerCore 폴더를 클라이언트쪽에 통쨰로 옮겼는데도#include가 안되고 있는데, 방법을 알 수 있을까요?? 클라이언트 솔루션에 ServerCore 프로젝트 추가완료 GameProjcet .cpp소스에서 ServerCore 쪽 파일들 인클루드 시도했으나 에러발생
-
해결됨[켠김에 출시까지] 유니티 방치형 키우기 게임 (M1 + T2)
유니티에서 internal 클래스가 사용되는 예
강의를 들으며 코드를 훑어보던중에 PoolManager.cs에서 Pool 클래스가 internal 접근제한자로 작성되어있는 부분이 궁금하여 질문 드립니다. 현재 코드에서는 어셈블리가 나눠진게Assembly-CSharp, Assembly-CSharp-Editor 인데Pool 클래스가 internal로 작성되는 이유가 있는가요? Editor 어셈블리에서 사용되지 않도록 하는것 인가요? 그리고 유니티에서 internal 접근 제한자가 사용되는 경우가 어떤 경우가 있나요? 간혹 게임 에셋이나 코드드를 보며 공부할때 특정 클래스들이 internal로 되어있는 경우를 보는데이유가 뭔지 궁금점이 생겨 질문 드립니다.
-
미해결[켠김에 출시까지] 유니티 방치형 키우기 게임 (M1 + T2)
ShowBaseUI, ShowSceneUI 차이
UIManager에서 ShowPopupUI는 말 그대로 팝업ShowSceneUI는 게임에서 고정되는 UIShowBaseUI는 뭔지 모르겠습니다.
-
미해결[켠김에 출시까지] 유니티 방치형 키우기 게임 (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에다 채워주어야 하지않나요? 상관없나요?
-
해결됨[켠김에 출시까지] 유니티 방치형 키우기 게임 (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(); 한 번은 왜 해주는 건가요?
-
미해결[켠김에 출시까지] 유니티 방치형 키우기 게임 (M1 + T2)
RigidBody.simulated 가 false로 되어있으면 투사체가 안 맞는거 같습니다
학습자료 보고 따라 만들고 있는데 투사체가 안 맞는거 같아서(OnTriggerEnter2D 함수로 진입을 안함)이것저것 시도해보다 보니 RigidBody.simulated를 켜면 투사체가 맞는 것을 확인했습니다.근데 학습자료에는 Hero와 Monster Init 할 때, 그리드 방식으로 사용하기 위해 의도적으로 RigidBody.simulated를 끄는 것 같은데, simulated를 끈 상태에서 trigger를 작동시키는 다른 방법이 있는지 궁금합니다. 제가 뭘 놓치고 있는거 같은데 잘 모르겠어요.
-
미해결[켠김에 출시까지] 유니티 방치형 키우기 게임 (M1 + T2)
큰 프로젝트에서도 Manager 구조를 사용하나요?
큰 프로젝트에서도 Manager 구조를 사용하나요?Manager 에서 Manager를 호출하는등 Manager구조가 단점이 있는데 이를 어떻게 극복하시나요?
-
미해결[켠김에 출시까지] 유니티 방치형 키우기 게임 (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 상태를 확인해서 활성화 되어 있다면 하위 오브젝트에 모두 이벤트가 동작되게 되는것 인가요?
-
미해결[켠김에 출시까지] 유니티 방치형 키우기 게임 (M1 + T2)
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); 의 값이 알맞은 변수에자동으로 담기는 것인가요?