10강까지 강의를 따라오면서 강의를 누락한 부분이 있기 때문에 생기는 이슈인지 궁금합니다. 누락으로 생긴 이슈라면 드릴 말씀은 없지만, 다른 분들도 따라하시다가 당황하실 수 있는 이슈로 여겨져서 글을 남겨 봅니다. 몬스터를 풀링하면서 몬스터가 생성될 때 프리팹에 적혀있는 좌표로 우선 생성되니까 해당 좌표에서 충돌 처리가 생기는 것 같습니다. 몬스터 생성 몬스터가 프리팹에 적혀 있는 0,0,0 위치에 생성 0,0,0 위치에서 콜라이더 충돌이 발생함 value.transform.position = spawnPos; 작동 작동하면서 좌표 값 변경 이후 강의에서 해결됐을 가능성이 농후하지만, 10강까지 따라왔을 때 누구에게나 생길 수 있는 이슈라고 느껴져서 글을 남깁니다. 몬스터 프리팹의 포지션 값을 변경하면서 일단 해결하였는데 제가 놓친 부분이 있었다면 참고하겠습니다.
안녕하세요 강사님! 수업 유익하게 잘 수강 중 입니다! 다름이 아니라, BaseMng, PoolMng 구현 중 궁금한 점이 생겨 질문드립니다. BaseMng의 경우 PoolMng를 관리하고 있고, PoolMng에서는 BaseMng.instance.InstantiatePath() 등으로 BaseMng를 참조하고 있는데, 추후에 순환참조되는 문제가 발생하지는 않는지 궁금하여 질문드립니다. 좋은 강의 제공해주셔서 감사드립니다!
강의에서 코루틴의 개념은 계산이 오래 걸리는 작업을 다른 루프에서 도와주는 거라고 했는데 그저 머즐 플래쉬를 발생시킬 때 딜레이를 주려는 것뿐인데 코루틴을 사용하는 이유가 뭔가요? 계산이 복잡해 보이지 않는데요. yield return new WaitForSeconds(0.2f); "yield return [조건]" 조건을 만족할 때까지 메인 루프에 양보한댔는데 위 코드가 어떻게 나온 건지 이해가 안 됩니다. 코루틴을 정확히 언제 쓰는 것인지 개념을 확실하게 알고 싶습니다.
안녕하세요! 제공해주신 강의 도움이 많이 되고 있습니다. Lobby 씬 구조 및 디자인 패턴 (LobbyManager, LobbyUIController) 강의 질문있습니다. Q. "LobbyManager, LobbyUIController를 구분하여 관리하자" 이해했습니다. 궁금한 부분은 해당 cs 파일들을 프리팹화 할때, 2개의 프리팹으로 나누었는데 1개의 프리팹에 몰아서 붙이고 Lobby라는 프리팹으로 관리해도 되지않을까? 라는 생각이 났는데 2개로 나누었을때 혹시 관리적인 부분에서 이점이 있을까요? Lobby 씬 구조 및 디자인 패턴 (LobbyManager, LobbyUIController)
else { foreach (T compo in go.GetComponentsInChildren<T>()) { if (string.IsNullOrEmpty(name) || compo.name == name) { return compo; } } } public static T FineChild<T>(GameObject go, string name = null, bool recursive = false) where T : UnityEngine.Object { if (go == null) { return null; } if (recursive == false) { for (int i = 0; i < go.transform.childCount; i++) { Transform trf = go.transform.GetChild(i); if (string.IsNullOrEmpty(name) || trf.name == name) { T compo = trf.GetComponent<T>(); if (compo != null) { return compo; } } } } else { foreach (T compo in go.GetComponentsInChildren<T>()) { if (string.IsNullOrEmpty(name) || compo.name == name) { return compo; } } } return null; } string name =null 로 한 이유 -> enum에서 null 자체가 생성이 안되는데 저렇게 한 이유 [연계질문] if (string.IsNullOrEmpry(name) 으로 component를 리턴하는 이유 -> 이름이 없는데 왜 해당 컴포넌트를 리턴하는지.. 답변부탁드립니다.
저는 30대 넘어서 코딩 입문하게된 비전공자입니다. 기존에 웹개발하다가 게임개발 흥미가 느껴서 여기로 취업하고자하는데요 학원에서는 유니티 클라이언트 쪽으로 준비하는게 낫다고 해서 일단 유니티쪽 공부하고있습니다. 아무래도 비전공자이다보니 CS지식도 부족하다고 느끼고 C/C++ 필요성도 느끼고 있는데요 취업시에 유니티클라이언트를 깊게 파서 구현하는것을 목표로할지 CS공부겸 서버쪽도 조금 추가해서 공부하는것을 목표로 할지 고민이됩니다. 어느쪽이 더 나을까요? ㅠㅠ (일단 취업목표기간은 8개월~1년 잡고있습니다.)
저는 현재 10.Object Pooling을 듣고 있는 학생입니다(초보) 저는 현재 이와 같이 풀링이 제대로 작동하지 않고 있습니다. 분명 강의에서는 풀링이 제대로 작동하여 들어갔다가 나오는게 되지만 저는 코드에서 오류가 났는지 제대로 작동하질 않고 있어요ㅠㅠ. 제 코드 보시고 어떤 문제점이 있는지 알려주셨으면 합니다. (Projectile만 문제 있어요) using System.Collections; using UnityEngine; public class Player_Attacker : MonoBehaviour { public GameObject bulletPrefab; private void Start() { StartCoroutine(FireCoroutine()); } IEnumerator FireCoroutine() { yield return new WaitForSeconds(1.0f); FireProjectile(); StartCoroutine(FireCoroutine()); } void FireProjectile() { Vector3 fireDir; if ( Player.instance.target != null) { fireDir = Player.instance.Direction(); } else { fireDir = transform.forward; } var bullet = MANAGER.POOL.Pooling_OBJ("Projectile").Get((value) => { Vector3 pos = transform.position + new Vector3(0, 1.0f, 0) + fireDir * 1.0f; value.transform.position = pos; value.GetComponent<Bullet>().Initalize(fireDir); }); } } 이 코드가 문제가 맞는지 확인해주셨으면 감사하겠습니다.
[C#과 유니티로 만드는 MMORPG 게임 개발 시리즈] Part7: MMO 컨텐츠 구현 (Unity + C# 서버 연동 기초)
안녕하세요. 강의 잘 듣고 있습니다. 강의를 듣다보니 Map <-> Hero(or Object) <-> Session 이 서로 참조를 하고 있는데요. 이론 공부할 때는 순환참조의 객체 생성, 무한 호출 등의 문제로 인해 객체 간 순환참조를 금지한다고 학습했는데, 게임처럼 상호작용이 필요한 도메인은 순환참조 문제를 엔지니어 역량으로 막는걸까요? 자바-스프링 같은 프레임워크를 쓸 때는 객체 간 순환참조를 프레임워크단에서 체크해서 애플리케이션 실행 시점에 막더라구요.
SetSkillFrame함수에서 먼저 frame들을 다 삭제시키고 다시 생성하고있는데요 frame내에서 saveCooltime도 다 삭제가되니 레벨업을하고 다시 UI가 초기화될때 쿨타임도 아예 초기화가 되버리는 것같은데 제가 놓친부분이 있나요? 그리고 SetSkillFrame함수는 MANAGER.SESSION.onSelectedCard 델리게이트에 바인딩 시켜놓으면 되는건가요?
강의 중에 사용하신 init 관련 코드에서 하나 궁금한 점이 있습니다. BaseController 의 Awake() 안에서 _init = true 를 먼저 설정한 다음 init() 을 호출하게 되면, init() 안에서는 이미 _init == true 상태라서 실제 초기화 로직이 수행되지 않고 false 만 반환하게 되는 것 같습니다. 그런데 MonsterController 에서는 base.init() 이 true일 때 return 하도록 돼 있어서, 결과적으로 자식 클래스의 초기화 로직이 실행되지 않을 수도 있어 보인다 는 생각이 들었습니다. 혹시 의도된 흐름이 맞는지, 아니면 _init = true 설정 위치나 분기 조건 쪽에 조정이 필요한 부분이 있는지 궁금합니다.
안녕하세요 강의 공부하다가 궁금증이 생겨서 질문합니다. 강의에서는 .csv를 사용해서 레벨 데이터를 저장하고 가져오는 방법을 사용하셨는데 서드파티 데이터베이스로 구현을 해놓고 넣었다 빼는 방식을 사용해도 괜찮을까요? 그러면 앱 업데이트를 할 필요없이 DB상의 값을 바꾸는 것만으로도 난이도를 조정할 수 있을 것 같아서요. 현직에서는 어떻게 구현하는지 궁금해서 질문합니다.
각 상황에 맞는 사운드를 플레이하도록 구현하고 있는데요. Interaction 함수 안에서 사운드 출력 코드를 추가했는데 소리가 제대로 나오지 않고 계속 반복되서 출력되는 것처럼 치지지직 하다가 끝나버립니다. void OnMoneyInteraction(WorkerController wc) { if (!wc.Tray.IsPlayer || _moneyPile.ObjectCount == 0) return; _moneyPile.DeSpawnObjectWithJump(wc.transform.position, () => { GameManager.Instance.AddMoney(Define.MONEY_PER_BURGER); GameManager.Instance.AddExp(1f); SoundManager.Instance.PlaySFX("SFX_Money_Get"); }); } 그래서 제대로 한번만 사운드가 출력되도록 하기 위해 bool형 예외처리를 해서 코드를 수정했더니 0.1초만에 소리가 났다가 사라집니다. audioSource 제대로 부착했고 loop 체크x, PlayOnAwake 체크 등 기본적인 것들은 다 제대로 세팅했습니다. 어떻게 해야 제대로 된 소리를 출력할 수 있나요? public class SoundManager : Singleton<SoundManager> { [Header("BGM")] public AudioSource bgmSource; [Header("SFX")] public AudioSource sfxSource; [Header("SFX Clips")] public List<AudioClip> sfxClips; [Header("BGM Clips")] public List<AudioClip> bgmClips; public void PlaySFX(string clipName) { AudioClip clip = sfxClips.Find(c => c.name == clipName); if (clip != null) { sfxSource.volume = 1f; sfxSource.PlayOneShot(clip); } else { Debug.LogError($"SFX clip not found: {clipName}"); } }
게임들 중에 건물을 짓고 일정 시간이 지나면 건물이 완공이 되는 게임들이 있잖아요. 그 시간은 게임을 실행하지 않더라도 시간이 흐르고 게임에 접속하면 건물이 완공되는 식으로 진행이 되는데, 그럼 그런 건물들의 내용들도 다 DB에 저장을 하고 게임을 켤 때와의 시간 계산을 하나요 ?
안녕하세요, 최근 강의 듣고 따라가고 있는 unity 입문자입니다. 매번 테스트 하실 때 따라 테스트 하면서 진행했는데, 이번 강의 편 마지막 테스트 할 때 보니 파워업 아이템을 먹었는데 player가 파괴되면서 enemy bullet 1이 player 파괴된 자리 근처에 생성되는 현상이 있습니다. 디버깅을 어떻게든 해보고 해결하고 싶은데, 사실 방법을 잘 모르겠습니다 ㅠㅠ 어떻게 확인해볼 수 있을까요? ItemController, PlayerController, PowerUpController 내용은 확인했습니다만 별다른 점을 못 느꼈습니다.. EnemyBulletController에서도 어느 부분을 건드려야 할 지 고민입니다.. 혹시 참고할 만한 팁이 있을까요?