inflearn logo
강의

강의

N
챌린지

챌린지

멘토링

멘토링

N
클립

클립

로드맵

로드맵

지식공유

묻고 답해요

173만명의 커뮤니티!! 함께 토론해봐요.

캐싱 질문

미해결

[C#과 유니티로 만드는 MMORPG 게임 개발 시리즈] Part3: 유니티 엔진

Play(string path, ....) 버전 말고 Play(AudioClip clip ...) 버전에서는 캐싱 기능이 들어가있지 않은데, 혹시 이 경우 캐싱해주려면 어떻게 하면 좋을까요? HashSet 자료구조로도 캐싱하여 뽑아올 수 있는지 알고싶습니다.

  • C#
  • unity
노른자 댓글 1 좋아요 0 조회수 250

.sln 서버 프로젝트 로드가 정상적으로 되지 않습니다.

미해결

[C#과 유니티로 만드는 MMORPG 게임 개발 시리즈] Part7: MMO 컨텐츠 구현 (Unity + C# 서버 연동 기초)

안녕하세요? 2강(환경 설정)의 서버쪽 .sln 파일을 visual studio(2019기준)으로 열 시 다음과 같은 오류가 발생하면서 프로젝트가 로드되지 않습니다. C:\Users\MYCOM\Downloads\MMO_Game 시작\Server\Server\Server.csproj : error : 프로젝트 파일을 열 수 없습니다. .NET SDK를 찾을 수 없습니다. 이 SDK가 설치되어 있고 global.json에 지정된 버전(있는 경우)이 설치된 버전과 일치하는지 확인하세요. C:\Users\MYCOM\Downloads\MMO_Game 시작\Server\ServerCore\ServerCore.csproj : error : 프로젝트 파일을 열 수 없습니다. .NET SDK를 찾을 수 없습니다. 이 SDK가 설치되어 있고 global.json에 지정된 버전(있는 경우)이 설치된 버전과 일치하는지 확인하세요. C:\Users\MYCOM\Downloads\MMO_Game 시작\Server\DummyClient\DummyClient.csproj : error : 프로젝트 파일을 열 수 없습니다. .NET SDK를 찾을 수 없습니다. 이 SDK가 설치되어 있고 global.json에 지정된 버전(있는 경우)이 설치된 버전과 일치하는지 확인하세요. C:\Users\MYCOM\Downloads\MMO_Game 시작\Server\PacketGenerator\PacketGenerator.csproj : error : 프로젝트 파일을 열 수 없습니다. .NET SDK를 찾을 수 없습니다. 이 SDK가 설치되어 있고 global.json에 지정된 버전(있는 경우)이 설치된 버전과 일치하는지 확인하세요. 일단 넘어가고 클라쪽은 잘 따라갔는데, 해당 강의(Protobuf 이식)의 강의자료 Server쪽 .sln파일을 열 때는 또 다른 오류가 추가로 발생합니다. 'GenProto.bat'을(를) 여는 동안 '<MiscFiles>'에서 오류가 발생했습니다. 'C:\Rookiss\MMO_Game\Common\protoc-3.12.3-win64\bin\GenProto.bat' 경로의 일부를 찾을 수 없습니다. 어떤 절대경로와 SDK 호환? 문제인건 알겠는데, 해결책을 모르겠어서 질문 올립니다.

  • C#
  • unity
mhyim 댓글 2 좋아요 0 조회수 1718

Object를 유니티에서 직접 설정하는것과 파라미터로 전달하는것의 차이가 있나요

미해결

[유니티6] 따라하면서 배우는 하이퍼캐주얼게임 시리즈 01

ZIGZAG 추가구현 4분30초경 gameController를 Item.SetUp의 파라미터로 전달하는 부분이 있습니다. Item오브젝트의 Item컴포넌트에 GameController를 직접 집어넣어두지않고 파라미터로 전달하는 이유가 궁금합니다.

  • C#
  • unity
강한 바다사자 댓글 2 좋아요 0 조회수 335

GetComponent 강의 질문

미해결

유니티(Unity)로 시작하는 게임개발: Part 3. 슈팅게임 개발

칼라를 변경하기 위해, MeshRenderer rend = GetComponent<MeshRenderer>(); rend.material.color = new Color(1,0,0,1); 위 처럼, GetComponent 함수로 값을 불러와야 MeshRenderer에 접근할 수 있는 것을 알게되었습니다. 그렇다면, Transform에 접근하기 위해서도 Transform trans = GetComponent<trans>(); 이렇게 함수로 값을 불러와야 되는 것이 아닌가요? 앞이 강의에서는 transform.position = new Vector3(1, 0, 0); 로 바로 position에 접근하여 값을 변경 가능한 것으로 배웠던 것 같습니다.. 차이점이 뭐죠?

  • C#
  • unity
재민 댓글 1 좋아요 0 조회수 362

비주얼스튜디오 에서도 툴 만들기가 지원될까요?

미해결

[C#과 유니티로 만드는 MMORPG 게임 개발 시리즈] Part7: MMO 컨텐츠 구현 (Unity + C# 서버 연동 기초)

강사님 안녕하세요? 이번 강의를 들으면서 유니티 내부에서 툴을 커스텀할 수 있는 방법 잘 배웠습니다. 비주얼스튜디오에도 해당 기능 이용하여 메뉴 등을 추가할 수 있을까요? 잠깐 구글링 해봤는데, 검색 키워드가 안맞아서 그런지 없는 것도 같습니다. Q. 비주얼스튜디오에서도 Tool 만들 수 있는 기능이 있는지? 있다면 구글링 검색 키워드는? 궁금합니다. 미리 답변 감사합니다. 수강자 드림.

  • C#
  • unity
mhyim 댓글 1 좋아요 0 조회수 256

StartCoroutine 파라미터에 함수넣는것과 문자열 넣는것의 차이가 뭔가요?

미해결

[유니티6] 따라하면서 배우는 하이퍼캐주얼게임 시리즈 01

StartCoroutine에서 함수를 호출할떄 함수명을 Function()으로 쓰는것과 "Function"으로 쓰는것의 차이가 있나요? 호출함수에 파라미터가 있으면 함수형으로 쓰는것같기한데 전달할게 없어도 그렇게 써도 되던데 굳이 오타위험을 감수하면서 문자열로 전달해야하는 상황이 있을지 궁금합니다.

  • C#
  • unity
강한 바다사자 댓글 2 좋아요 0 조회수 436

플레이어 공격 중 간헐적으로 이동현상이 발생합니다.

미해결

[C#과 유니티로 만드는 MMORPG 게임 개발 시리즈] Part3: 유니티 엔진

몬스터를 때리기 위해서 몬스터를 클릭해 공격을 하다보면 간헐적으로 저런 Move 애니메이션이 루프처럼 재생되면서 아무런 동작도 취할수없는 버그가 간헐적으로 자주 발생합니다. (끄고 다시 재생해서 초기화시켜야합니다.) 어떻게 조치하면 되는지 갈피를 못잡고 있는 상황입니다. ㅜㅜ <Player Controller>

  • C#
  • unity
이승훈 댓글 1 좋아요 0 조회수 370

.Net.과 .Net Core(7)은 무엇이 다른가요?

미해결

C# WPF .NET Core(7.0)

(질문 1) Net. 또는 .Net Core(7)를 사용하려면 Install해야하는데, Visual Studio를 다운로드하는 과정에서 파일을 다르게 설정하나요? (질문 2) Net. 또는 .Net Core(7)를 사용할 때 참조 라이브러리 파일이 어떻게 다른가요?

  • C#
  • mariadb
  • mvvm
  • wpf
  • xaml
우먹 댓글 1 좋아요 0 조회수 567

OnTrigger로 물체 검출시 2번 검출

미해결

[C#과 유니티로 만드는 MMORPG 게임 개발 시리즈] Part3: 유니티 엔진

안녕하세요 좋은 강의 감사합니다 특정 위치 진입시 이벤트를 발생시키고 싶은 상황입니다. 저는 현재 빈 오브젝트에 Box Collider를 달고, isTrigger:On으로 설정하여 플레이어가 보지는 못하지만 트리거가 존재하는 방식으로 만들었습니다. 그러나 이 상황에서 OnTriggerEnter 함수가 두번씩 호출되는 경우가 발생합니다. 왜 두번씩 충돌이 검출되는지, 어떻게 해결할 수 있는지 궁금합니다..!

  • C#
  • unity
lucyya99 댓글 1 좋아요 0 조회수 753

섹션 13에서 Bakec를 해도 벽을 타고 올라갑니다.

미해결

[C#과 유니티로 만드는 MMORPG 게임 개발 시리즈] Part3: 유니티 엔진

벽에는 파란색이 없는데도 왜 Player가 벽을 타고 다닐까요?

  • C#
  • unity
prokimssam 댓글 1 좋아요 0 조회수 272

Span<byte> 으로 유지해서 진행해본 결과..

미해결

[C#과 유니티로 만드는 MMORPG 게임 개발 시리즈] Part4: 게임 서버

강사님 안녕하세요. 정말 즐겁게 학습 중인 수강생입니다. 강의 후반부에 유니티 연동하면서 Span<byte> 를 수정하는 방향으로 진행하는 와중에 제가 사용하는 유니티 버전에서 Span<byte>을 지원하게 되어 따로 수정하지 않고 이번 강의를 최종적으로 마무리 지었습니다. 다만, 더미 클라이언트를 마지막에 500으로 설정하고 유니티에서 실행하는데 강사님 코드로는 500개 더미 클라이언트가 가끔씩 500개가 연결되지 못한 상태로 연결됩니다. 제 코드 역시 간혹 500개가 연결되지 않습니다. 여기서 문제는... 강사님은 연결이 덜 된 클라이언트가 있어도 패킷을 모아보내기가 수월하게 동작하나, span<byte>코드로 유지한 저는 500개도 아닌 200개 이상으로 설정하면 연결도 안 덜 되고... 패킷 모아보내기 조차 수행되지 않습니다. 윈머지를 통해서 코드는 전부 비교했으나, span<byte> 관련 부분 제외 전부 동일합니다. 500개가 항상 정상적으로 연결되지 못하는 이유가 있을까요? 혹은, 500개가 연결되지 않더라도 span을 사용했을 때와 사용하지 않았을 때의 모아보내기 가능 유무가 달라지는 이유가 어떤게 있을까요...? 어떤 차이로 혹은 어떤 곳을 의심해봐야 하는 지 여쭤봐도 될까요? 의심부분을 찾기 너무 어려워 질문 올립니다.

  • C#
  • unity
  • 네트워크
짜짠형 댓글 2 좋아요 0 조회수 713

해쉬 충돌에 대해 질문드리고 싶습니다.

해결됨

[C#과 유니티로 만드는 MMORPG 게임 개발 시리즈] Part1: C# 기초 프로그래밍 입문

해쉬 충돌에 대해서 제대로 이해하고 싶어서 다른 자료를 찾아보다가 이해가 안되는 부분이 있어서 질문드립니다. 전제 : Key값은 상수 데이터이다. 그림 설명만 놓고 보면 키값이 달라도 해쉬 버켓 값이 동일해서 해쉬 충돌이 일어날 수 있다 라고 설명하는 것 같은데, 서로 다른 키가 같은 해쉬 버켓에 매핑 될 수 있는 경우가 해쉬 함수의 성능에 의해 결정되는지 궁금합니다. 더불어 대체적으로 어떤 경우에서 해쉬 충돌이 빈번한지에 대해 질문 드리고 싶습니다.

  • C#
YYH_ 댓글 1 좋아요 0 조회수 439

유니티강의 Camera#1 18분쯤

해결됨

[C#과 유니티로 만드는 MMORPG 게임 개발 시리즈] Part3: 유니티 엔진

public void SetQuarterView(Vector3 direction) { _mode= Define.CameraMode.QuarterView; _directions = direction; } 쿼터뷰를 코드로 셋팅하고 싶을 때라고 하셨는데 어떤 경우가 있는 건가요?? 정확히 이 상황 만으로는 이해가 어렵습니다 다른 캐릭터나 씬에서 카메라를 쿼터뷰로 설정하고 싶을때 이걸로 설정 하면 된다는 걸까요?

  • C#
  • unity
패러그래프 댓글 1 좋아요 1 조회수 327

오브젝트 풀링 질문

미해결

[C#과 유니티로 만드는 MMORPG 게임 개발 시리즈] Part3: 유니티 엔진

선생님 이부분에서 parent를 null 로 설정하면 생성된 유니티찬이 베이스씬컴포넌트를 상속받은 로그인씬이 부착된 @Scene 오브젝트 하위로 부착되어야 되는거아닌가요? 근데왜 이런식으로 유니티찬이 바깥에 생성되는거죠?

  • C#
  • unity
starbucks50 댓글 3 좋아요 0 조회수 540

스킬중에 주변을 도는 파티클은 충돌체크를 어떤식으로 할까요?

해결됨

[라이브 멘토링] 유니티 뱀파이어 서바이벌 장르 모작

안녕하세요. 뱀서류 게임을보면 캐릭터 주변을 돌면서 적에게 충돌하면 데미지를주는 스킬들이 있는데요 이경우는 충돌체크를 어떤식으로 해야할까요? 스킬이 제자리에서 사용되거나 정지해 있는경우가 아니라 움직이는경우라 질문드립니다.

  • C#
  • unity
  • object-pooling
기초 댓글 1 좋아요 0 조회수 334

스킬개론에서 설명한 xml이 엑셀 상태일땐...

미해결

[라이브 멘토링] 유니티 뱀파이어 서바이벌 장르 모작

스킬개론에서 설명한 xml이 엑셀 상태일땐 어떤 형태인지가 궁금해 지네요. 관련되어서 예시 이미지나 관련 정보 페이지가 있을까요? 계층구조라서 엑셀로는 어떻게 만들어야하는지 헷갈리네요; 엑셀에서 표를 만들어 나오면 xml 파일로 수정하고 내부의 내용을 순서대로 정렬하고 이런 작업을 추가적으로 해야하는 것처럼 보여서요.

  • C#
  • unity
  • object-pooling
Wind mill 댓글 1 좋아요 0 조회수 319

스프라이트 로그가 안됩니다. 이유를 모르겠어요...

미해결

[라이브 멘토링] 유니티 뱀파이어 서바이벌 장르 모작

아래와 같이 강좌를 통해서 이유를 찾고있는데요. 폴더에 있는 최신 참조 파일과도 다른 점이 없었고, 유니티를 재부팅을 통해서도 확인해보았으나 현상은 동일했습니다. 33:40분에 이야기한 소문자 이야기에 계속 돌려서 보았으나 소문자 부분을 찾지 못하였습니다. 혹시 문제가 무엇일까요....? 디버그.로그를 통해서 확인해보니 최초에 정상 로드가 확인되지만, 이후 생성할려고 할때 Null 값이 노출되는 것을 확인하였습니다.. using System; using System.Collections; using System.Collections.Generic; using System.Diagnostics; using Unity.Mathematics; using Unity.VisualScripting; using UnityEngine; public class ObjectManager { public PlayerController Player { get; private set; } // 플레이어는 따로 관리 public HashSet<MonsterController> Monsters { get; } = new HashSet<MonsterController>(); // 몬스터도 따로 관리 public HashSet<ProjectileController> Projectiles { get; } = new HashSet<ProjectileController>(); // 발사체도 따로 관리 public HashSet<GemController> Gems { get; } = new HashSet<GemController>(); // 잼 따로 관리 public T Spawn<T>( Vector3 position , int templateID = 0) where T : BaceController { System.Type type = typeof( T ); if( type == typeof(PlayerController) ) { GameObject go = Managers.Resource.Intantsiate("Slime_01.prefab", pooling: true);// 프리팹 불러오기 go.name = "Player"; /////////////////////////////////////////////////////////////////////// //// /// go.transform.position = position; // 좌표에 배치 /////////////////////////////////////////////////////////////////////// PlayerController pc = go.GetOrAddComponent<PlayerController>(); // 컨트롤러 불러오기 Player = pc; // 컨트롤러 붙이기 pc.Init(); //초기화 return pc as T; } else if (type == typeof(MonsterController)) { string name = (templateID == 0 ? "Goblin_01" : "Snake_01"); // 지금은 억지로 부여하지만, 데이터 테이블이 만들어지면 수정할 것 GameObject go = Managers.Resource.Intantsiate( name + ".prefab" , pooling: true ); /////////////////////////////////////////////////////////////////////// //// /// go.transform.position = position; // 좌표에 배치 /////////////////////////////////////////////////////////////////////// MonsterController mc = go.GetOrAddComponent<MonsterController>(); Monsters.Add( mc ); // 만들어지는 동시에 Monsters 안에 관리하에 들어가게 됨. mc.Init(); //초기화 return mc as T; } else if( type == typeof(ProjectileController)) { return null; } else if (type == typeof(GemController)) // 잼 컨트롤러 작동원리 { GameObject go = Managers.Resource.Intantsiate( Define.EXP_GEM_PREFAB , pooling: true); go.transform.position = position; GemController gc = go.GetOrAddComponent<GemController>(); Gems.Add( gc ); // 폴더에 추가 gc.Init(); //초기화 // 아이템 종류 변경하기. ( 하드코딩 : 확인용 ) string key = UnityEngine.Random.Range(0, 2) == 0 ? "EXPGem_01.sprite" : "EXPGem_02.sprite"; Sprite sprite = Managers.Resource.Load<Sprite>(key); go.GetComponent<SpriteRenderer>().sprite = sprite; UnityEngine.Debug.Log( sprite ); //Debug.Log($"sprite Name: {sprite.name}"); if (sprite) { UnityEngine.Debug.Log($"sprite Name: {sprite.name}"); } return gc as T; } return null; } // public void Despawn<T>(T obj) where T : BaceController { System.Type type = typeof(T); if (type == typeof(PlayerController)) { //? } else if (type == typeof(MonsterController)) { Monsters.Remove(obj as MonsterController); Managers.Resource.Destroy(obj.gameObject); } else if (type == typeof(ProjectileController)) { Projectiles.Remove(obj as ProjectileController); Managers.Resource.Destroy(obj.gameObject); } else if (type == typeof(GemController)) { Gems.Remove(obj as GemController); Managers.Resource.Destroy(obj.gameObject); } } } using System.Collections; using System.Collections.Generic; using UnityEngine; using UnityEngine.AddressableAssets; // 에셋 가져오고 using UnityEngine.ResourceManagement.AsyncOperations; // 회색은 필요없다느 뜻임 using System; using Object = UnityEngine.Object; public class ResourceManager { // 리소스를 계속 들고 있도록 Dictionary로 만든다. Dictionary<string, UnityEngine.Object> _resources = new Dictionary<string, UnityEngine.Object>(); // 리소스 로드 ( 이미 위의 Dictionary에서 이미 로드를 한 상태라 부담이 없다. ) public T Load<T>(string key) where T : Object { if (_resources.TryGetValue(key, out Object reource)) { return reource as T; } return null; } // Load 를 사용하여 리소스 된 후 인스텐션해서 복사본을 만든다. public GameObject Intantsiate(string key, Transform parent = null, bool pooling = false) { /////////////////////////////////////////////////////////////// // 원본 프리팹을 가져옴 GameObject prefab = Load<GameObject>($"{key}"); if (prefab == null) { Debug.Log($"Failed to load prefab :{key}"); return null; } /////////////////////////////////////////////////////////////// // Pooling if ( pooling ) { return Managers.Pool.Pop(prefab); } /////////////////////////////////////////////////////////////// /// 부하가 많이 걸리는 부분 => 그래서 오브젝트풀링( 활성/비활성화 )로 진행 GameObject go = Object.Instantiate( prefab , parent ); go.name = prefab.name; return go; } // 오브젝트 삭제 용도.(공용) ( 어드레서블로 만들어지지 않은 애들도 삭제됨 ) public void Destroy(GameObject go) { if ( go == null ) return; if ( Managers.Pool.Push(go) ) { return; } // Pool이 있으면 반납 Object.Destroy(go); // Pool이 없으면 삭제 } #region 어드레서블 public void LoadAsync<T>( string key, Action<T> callback = null ) where T : UnityEngine.Object //LoadAsysnc<T>( 키값 , 알려줄 무언가 ) { // 캐시 확인 if (_resources.TryGetValue(key, out Object resource)) // _resources 키값으로 리소스를 찾은적있다. { callback.Invoke(resource as T); return; // 2번째인경우 리턴 } 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); callback.Invoke(op.Result); }; } // 내가 원하는 라벨을 검색 후, public void LoadAllAsync<T>(string label, Action<string, int, int> callback ) where T : UnityEngine.Object //LoadAllAsync<T>( 라벨명 , 알려줄 무언가 ) { var opHandle = Addressables.LoadResourceLocationsAsync(label, typeof(T)); opHandle.Completed += (op) => { int loadCount = 0; int totalCount = op.Result.Count; foreach (var reult in op.Result) // 원하는 값이 나올때까지 반복 { LoadAsync<T>(reult.PrimaryKey, (obj) => // PrimaryKey 파일의 이름 // loadCount 몇번째인지 { loadCount++; callback?.Invoke(reult.PrimaryKey, loadCount, totalCount); }); } }; } #endregion } ///////////////////////////////// /// 추가함 using System; ///////////////////////////////// using System.Collections; using System.Collections.Generic; ///////////////////////////////// /// 추가함 using Unity.VisualScripting; ///////////////////////////////// using UnityEngine; ///////////////////////////////// /// 추가함 using UnityEngine.Diagnostics; using UnityEngine.EventSystems; public static class Extension // Extension문법은 (this GameObject go)에서 this를 함으로써 this.GetOrAddComponent와 같이 사용할수있는 문법 { public static T GetOrAddComponent<T>(this GameObject go) where T : UnityEngine.Component { return Utils.GetOrAddComponent<T>(go); } public static bool isValid(this GameObject go) { return go != null && go.activeSelf; } public static bool isValid(this BaceController bc) { return bc != null && bc.isActiveAndEnabled; } } using System.Collections; using System.Collections.Generic; using UnityEngine; public static class Define { public enum Scene { Unknown, DevScene, GameScene, } public enum Sound { Bgm, Effect, } public enum ObjectType { Player, Monster, Projectile, Env, } public const int PLAYER_DATA_ID = 1; public const string EXP_GEM_PREFAB = "EXPGem.prefab"; }

  • C#
  • unity
  • object-pooling
Wind mill 댓글 1 좋아요 0 조회수 672

질문있습니다

미해결

[C#과 유니티로 만드는 MMORPG 게임 개발 시리즈] Part3: 유니티 엔진

여기서 찾아달라는 타입을 로그인씬이 아니라 베이스씬으로 해주는 이유가 있나요? 직관적으로 생각했을때는 로그인씬을 찾아줘야 되니까 로그인씬을 제너릭에 넣어줘야 할거 같아서요.. 그리고 저렇게 로그인씬을 찾고싶을때에도 베이스씬을 상속받았으니까 저렇게 해줘도 되는거네요?!

  • C#
  • unity
starbucks50 댓글 1 좋아요 0 조회수 311

인기 태그

인프런 TOP Writers

주간 인기글