묻고 답해요
156만명의 커뮤니티!! 함께 토론해봐요.
인프런 TOP Writers
-
해결됨[Unity] 함께 만들어가는 방치형 게임 개발
TextProMesh에서 그라디언트 활성화 방법
if (critical) Text.GetComponent<TMP_Text>().enableVertexGradient = true; 도 가능하던데 참고 부탁드리겠습니다.
-
해결됨[Unity] 함께 만들어가는 방치형 게임 개발
Layer1> "HIT_TEXT" 풀에 반환시
Parent of RectTransform is being set with parent property. Consider using the SetParent method instead, with the worldPositionStays argument set to false. This will retain local orientation and scale rather than world orientation and scale, which can prevent common UI scaling issues.UnityEngine.Transform:set_parent (UnityEngine.Transform)Object_Pool:Return (UnityEngine.GameObject,System.Action`1<UnityEngine.GameObject>) (at Assets/00_Scripts/Mng/Pool_Mng.cs:66)Base_Mng/<Return_Pool_Coroutine>d__8:MoveNext () (at Assets/00_Scripts/Mng/Base_Mng.cs:69)UnityEngine.SetupCoroutine:InvokeMoveNext (System.Collections.IEnumerator,intptr) public void Return(GameObject obj, Action<GameObject> action = null) { pool.Enqueue(obj); //풀안으로 새로운 오브젝트가 들어감. obj.transform.parent = parentTransform; //obj.transform.parent.SetParent(parentTransform, false); //이거는 오류가나타남 //obj.transform.parent.SetParent(parentTransform, true); //true이든 false이든.. 오류발생 obj.SetActive(false); if(action != null) { action?.Invoke(obj); } } transform의 parent 속성대신에 SetParent 를 쓰라고 경고메세지가 나타나는데요Parent of RectTransform is being set with parent property. Consider using the SetParent method instead, with the worldPositionStays argument set to false. This will retain local orientation and scale rather than world orientation and scale, which can prevent common UI scaling issues.근데 /obj.transform.parent.SetParent(parentTransform, false)이런식으로 사용했더니, HIT_TEXT가 풀로 반환되면서 부모인 Layer1도 같이 반환되어서 UnityException: Transform child out of bounds Base_Canvas.Holder_Layer (System.Int32 value) (at Assets/00_Scripts/Base_Canvas.cs:28) HIT_TEXT.Init (UnityEngine.Vector3 pos, System.Double dmg, System.Boolean Critical) (at Assets/00_Scripts/HIT_TEXT.cs:76) Monster+<>c__DisplayClass6_0.<GetDamage>b__0 (UnityEngine.GameObject value) (at Assets/00_Scripts/Monster.cs:113) Object_Pool.Get (System.Action1[T] action) (at Assets/00_Scripts/Mng/Pool_Mng.cs:58) Monster.GetDamage (System.Double dmg) (at Assets/00_Scripts/Monster.cs:111) Bullet.Update () (at Assets/00_Scripts/Bullet.cs:83)-------------------------------Layers의 자식이 Layer3밖에 남지않아서Base_Canvas 스크립트의 public Transform Holder_Layer(int value) { return LAYER.GetChild(value);함수 호출시에 에러가 나더라구요결국에는 그냥 transform.parent = parentTransform.로 사용하고있는데 SetParent를 사용하라고 계속 경고메세지가 뜹니다. ㅠㅠSetParent(parentTransform, ture) 이던, false이던 Canvas>Layer1>HitText, 에서 Pool로 반환될때 Layer1도 같이 반환됩니다.Layer0>"COIN_PARENT"도 마찬가지로 Layer0도 같이 반환됩니다.그냥 경고메세지를 띄울수밖에없는건가요?
-
해결됨[Unity] 함께 만들어가는 방치형 게임 개발
오브젝트 풀링 파트에서 겟과 리턴을 만들때
안녕하세요 강의 너무 잘 보고 있는 지망생입니다 . 한가지 궁금한게 생겨서 여쭤봅니다 . 겟과 리턴을 만들 때 액션의 널 체크를 하잖아요 . 이 부분을 if로 널 체크를 한번 하고 ? 로 널 체크를 한번 더 하는데 이렇게 두번 해야하는 이유가 있을까 조심히 여쭤봅니다.
-
해결됨[Unity] 함께 만들어가는 방치형 게임 개발
해당 강의 자료를 유니티6로 마이그레이션이 가능할까요?
질문1) 유니티6로 해당 강의를 진행해도 문제가 되지 않는 지 궁금합니다.질문2) 혹시 기존 학습을 진행했던 대상이, 유니티6로 마이그레이션이 가능하다면 방법적인 부분도 추가 안내해주실 계획이 있는 지 문의 드립니다.
-
해결됨[Unity] 함께 만들어가는 방치형 게임 개발
Ui 팝업 생성 clone문제, 강의 내용 문의
안녕하세요!영웅소환 부 강의를 듣고 Ui 팝업 생성을 구현했습니다.하지만 버튼을 누를 때마다, 팝업 clone이 계속 생성됩니다.요부분 싱글턴 처리라던지, 이미 해당 팝업이 열려있는지 여부를 확인하는 부분과 같은 방어 로직 내용이 있는 강의가 있나요? 있다면 강의가 꽤 길어 제가 못찾고 있는 것 같아요 ㅠㅠ 강의 너무 잘 듣고 있습니다~그리고 제가 게임개발 인강에 기대했던 부분이로딩시에 서버에서 리소스 다운받는 것, 저녁 이벤트 보상 같은 앱 푸시 어떻게 구현했나 궁금했는데요. 뒷 강의에 있는지 또는 추후에 강의하실 예정인지 문의드려요!
-
해결됨[Unity] 함께 만들어가는 방치형 게임 개발
인터페이스 클래스 사용이유
오브젝트 풀링에서 IPool이라는 인터페이스 클래스를 만든 이유가 궁금합니다.
-
해결됨[Unity] 함께 만들어가는 방치형 게임 개발
ui 생성 질문 있습니다.
ui 생성할 때 메모리 관련 질문 있습니다. 강의를 쭉 듣는 중입니다. UI 생성시에는프리팹 제작, Instantiate(Resources.Load<>("UI/xxxx"))로 ui 생성하고팝업 안에 아이템이 있는 경우에는 전부 생성 사용 종료 후 destroy 하는 방식 으로 이해했습니다. gameObject 생성 때 Object Pool 방식 구현 강의에서 메모리 관련해서 얘기 주셨는데요, 이런 ui 생성,destroy사용방식이 메모리 부하는 따로 없을까요?방치형 게임에서 유아이도 많이 눌러서 많이 일어날거라 생각이 들어서요. SetActive로 관리하면 어떤지.. 다른 방법이 없나?? 궁금하여 문의드립니다.
-
해결됨[Unity] 함께 만들어가는 방치형 게임 개발
소환위치질문있습니다
안녕하세요 선생님 왜 이렇게 한칸씩 밀리는 걸까요..혹시 캐릭터 피벗? 때문에 그런가요?? .. 어디를 수정해야 할지 아무리 찾아도 헷갈려서 질문합니다
-
해결됨[Unity] 함께 만들어가는 방치형 게임 개발
싱글톤 매니저와 씬
만약에 로딩씬에서온갖 싱글턴 매니저를 초기화한 후메인씬으로 넘어가는 로직을 만든 경우,매니저 오브젝트들이 전부 로딩씬에 배치해서 메인씬에서 개발할때는 Hierarchy 창에 아무것도 안보이고, 개발 모드에 들어가도 로딩씬을 거치지 않으니 아무 매니저도 안생길것 같은데, 이럴때는 어떻게 해결할수 있나요?
-
해결됨[Unity] 함께 만들어가는 방치형 게임 개발
파이어베이스로 가챠시스템을 연동시키는 것과 관련해 질문드립니다
안녕하세요! 강의를 시청하면서 가챠시스템을 배웠는데요다름이 아니라 클라이언트에서만 가챠시스템을 운용한다면 위조나 보안에 취약하다는 생각이 들었습니다따라서 앞서 배운 강의내용인 파이어베이스와 연동을 해서가챠시스템을 연동하면 좋겠단 생각을 했는데그럴 경우, 어떤 식으로 내용을 구성해야 효율적으로 관리할 수 있을지의견을 여쭙고자 합니다.
-
해결됨[Unity] 함께 만들어가는 방치형 게임 개발
안녕하세요 소스코드를 다운 받고 싶은데요.. 언제 제공 받을 수 있을까요?
안녕하세요. 게임 구현 중에서 일부분적으로 이해가 안되는 부분이 있어서 강의 학습을 시작하였습니다.다 따라쳐서 하는 기초 목적으로 수강하지 않아서, 일단 유니티 에디터에서 플레이는 되게하고 응용해보고 싶은데요. 강의 종료 후 제공된다고 글이 있는 것 같은데요.. 지금 커리큘럼이 출시?로 보이는데 다 끝난건지, 소스 코드가 언제 제공되는지 궁금합니다 ...
-
해결됨[Unity] 함께 만들어가는 방치형 게임 개발
근접 공격 강좌에서 NRE이 발생하는데 시점 문제로 발생한 문제인지 이슈를 쳐내기가 곤란합니다.
이러한 이슈가 발생해 찾은 결과 Monster Script의 37번 째 줄인 FindClosetTarget 함수에서 타겟을 찾지 못해 NPR이 발생한 내용으로 확인되었는데Spawner에 Players를 넣어주어 플레이어인 Cleric과 Barbarian이 잡히나, 간헐적으로 Null을 return 해주는 현상이 발생하는데, 이게 Update 문 안에서 실행되어 FindClosetTarget 구문이 매우 빠른 속도로 실행되어 발생한 시점 문제인지 궁금합니다. 현재 강사분과 코드는 동일한 것으로 확인됩니다.
-
해결됨[Unity] 함께 만들어가는 방치형 게임 개발
파이어베이스 유저 저장 주기가 고민되요.
첫번째 질문..유저데이터 저장을 위해서 주기적으로 파이어베이스 리얼타임 데이터베이스에쓰기로 저장을 해주고 싶은데요.. 요즘 파이어 베이스에 관심을 가지고 이래저래 알아보고있는데1분주기로 데이터를 리얼타임데이터에 쓰기(저장)을 하게되면 유저가 적을경우는 괜찮을수있겠지만, 왠지.... 많은 유저가 접속을 한 상황에서그 유저들의 데이터가 1분마다 저장이 계속 된다면 파이어베이스 서버이용요금?? 도 엄청날것같은데일정시간마다 주기적으로 파베에 저장되게 해도 괜찮을까요?한명 유저당 파베에 아무리 자주 저장하더라도 파베 사용량 데이터량 변화는 크게 없는것인지...아직 파베에 대한 지식과 파베 요금 관련해서 아무런 개념이 없어서인지 잘 모르겠네요 ㅜㅜ ----------------------------------------------------------------------------------------두번째 질문..게임을 빌드 한 후 APK 파일을 앱플레이어(녹스, LD플레이어)에 설치후 플레이 하다가(정상적인 게임종료를 누르는게 아닌, 상단탭의 x버튼을 눌러서) 강제로 게임을 꺼버리는경우 OnDestroy 함수가 제대로 호출이 안되는건지.. 게임 데이터를 저장하지않은채로게임이 꺼지더라구요.(혹시나해서, OnApplicationQuit() 함수와 OnDestroy() 함수 내용에도 게임이 꺼지거나파괴될때 '파베에 쓰기'가 되게 코드를 짰을때, 정상적으로 백버튼을 눌러서 게임종료하겠다는버튼을 누르면 저장이 잘됬는데, 갑자기 또는 강제로 게임이 의도치 않게 게임이 꺼지게되면 데이터가 저장이 안되던데... 혹시 좋은 방법이 있을까요?? )
-
해결됨[Unity] 함께 만들어가는 방치형 게임 개발
안녕하세요 초반 프로젝트 생성 버전 관련해서 질문 드립니다.(2022.3.6f1)
https://unity.com/kr/releases/editor/archive안녕하세요 강사님 ! 현재 유니티 공식 홈페이지에서 지원하는 유니티 LTS의 경우 2022.3.51이 최신으로 나와있고 이후에는 2023으로 넘어가는것 같습니다. 구글링을 통해 찾아보니 유니티 공식 홈페이지가 아니라 다른 깃허브나 외부 링크를 통해 다운로드를 받을 수는 있지만 안정성 면에서 공식 홈페이지를 통해 다운로드를 하는 것이 좋아보여서 질문을 남깁니다. 혹시 2022.3.6f1 버전을 공식 홈페이지가 아니라 다른 경로로 설치를 해야 할까요? 아니면 최신 2022인 3.5를 통해 프로젝트를 진행해도 괜찮을까요??
-
해결됨[Unity] 함께 만들어가는 방치형 게임 개발
스테이지 반복이 진행될 수록 몬스터 스케일이 작아집니다.
현재 스테이트패턴 Dead 까지 수강한 상태이구요,스테이지의 반복이 진행될수록, 몬스터 스케일이 불규칙적으로 작아집니다.처음에는, 몬스터 스케일이 불규칙적으로 작아지는것에 있어서 몬스터가 스폰되는 중에 캐릭터가 100%까지 처치를 완료하여, SpawnStart 코루틴메서드를 통해 LocalScale이 커지고 있는 도중, Return 메서드가 호출되어 비활성화가 된듯한 느낌을 받아(게임오브젝트가 비활성화가 되면 코루틴메서드가 중단되지않나요?) 확인해보았으나, 정확하게 원인을 파악하지 못했습니다 ㅠ 그리고 몬스터가 스폰되지 않았음에도 허공에 어택모션을 계속 취하는 버그도 있습니다.분명 풀링에는 전부 비활성화인데, 타겟이 있는것처럼 허공에 공격모션을 계속 취하다가, 몬스터가 실제로 스폰되면 추적하여 공격을 실행합니다. 제가 혹시 코드에 잘못된부분이 있다면 리뷰 한번만 부탁드립니다. ㅠ 추가적으로 필요하신 코드나, 직접적인 버그영상이 필요하시면 댓글한번만 남겨주시면 동영상을 개인메일이나, 유튜브 링크로 첨부해서 보여드리겠습니다. using System.Collections; using System.Collections.Generic; using UnityEngine; public class Spawner : MonoBehaviour { public int M_Count; // 몬스터의 수 public float M_SpawnTime; // 몇 초마다 스폰이 될 것인지 결정. // 1. 몬스터는 여러마리가 몇 초 마다 수시로 여러번 스폰 되어야 한다. //Spawner 에 손쉽게 접근하기 위해, static으로 설계 public static List<Monster> m_monsters = new List<Monster>(); public static List<Player> m_players = new List<Player>(); private Coroutine coroutine; private void Start() { Base_Manager.Stage.M_PlayEvent += OnPlay; Base_Manager.Stage.M_BossEvent += OnBoss; } public void OnPlay() { coroutine = StartCoroutine(SpawnCoroutine()); } public void OnBoss() { if(coroutine != null) { StopCoroutine(coroutine); } for(int i = 0; i<m_monsters.Count; i++) { Base_Manager.Pool.m_pool_Dictionary["Monster"].Return(m_monsters[i].gameObject); //Destroy(m_monsters[i].gameObject); } m_monsters.Clear(); StartCoroutine(BossSetCoroutine()); } IEnumerator BossSetCoroutine() { yield return new WaitForSeconds(2.0f); var monster = Instantiate(Resources.Load<Monster>("Boss"), Vector3.zero, Quaternion.Euler(0, 180, 0)); // 보스 생성 monster.Init(); Vector3 Pos = monster.transform.position; // 같은 변수를 사용할 때는, 한 변수로 묶어서 사용하면 메모리 절약이 됨. (중복계산방지) // 일정 소환거리 내부에 플레이어가 존재하면, 보스 소환 시, 넉백을 합니다. for(int i = 0; i<m_players.Count; i++) { if(Vector3.Distance(Pos, m_players[i].transform.position) <= 3.0f) { m_players[i].transform.LookAt(monster.transform.position); m_players[i].Knock_Back(); } } yield return new WaitForSeconds(1.5f); m_monsters.Add(monster); Base_Manager.Stage.State_Change(Stage_State.BossPlay); } //Random.insideUnitSphere = Vector3(x,y,z) //Random.insideUnitCircle = Vector3(x,y) IEnumerator SpawnCoroutine() { Vector3 pos; for(int i = 0; i < M_Count; i++) { pos = Vector3.zero + Random.insideUnitSphere * 5.0f; pos.y = 0.0f; Vector3 returnPos = Vector3.zero; while (Vector3.Distance(pos, Vector3.zero) <= 3.0f) { pos = Vector3.zero + Random.insideUnitSphere * 5.0f; pos.y = 0.0f; } //몬스터 스폰 var go = Base_Manager.Pool.Pooling_OBJ("Monster").Get((value) => { // 풀링이 생성될때의 기능을 구현한다. value.GetComponent<Monster>().Init(); value.transform.position = pos; value.transform.LookAt(Vector3.zero); m_monsters.Add(value.GetComponent<Monster>()); }); } yield return new WaitForSeconds(M_SpawnTime); coroutine = StartCoroutine(SpawnCoroutine()); } } using System.Collections; using System.Collections.Generic; using UnityEngine; public class Monster : Character { /// <summary> /// 몬스터가 스폰이 될 때, 스케일의 크기변화를 줍니다. /// </summary> /// <returns></returns> IEnumerator Spawn_Start() { float current = 0.0f; float percent = 0.0f; float start = 0.0f; float end = transform.localScale.x; // 몬스터의 로컬스케일 Debug.Log($"몬스터의 로컬스케일 변화 :{transform.localScale.x}"); while(percent < 1) { current += Time.deltaTime; percent = current / 0.2f; float LerpPos = Mathf.Lerp(start,end, percent); // 선형보간 (시작값,끝값,시간) transform.localScale = new Vector3(LerpPos, LerpPos, LerpPos); yield return null; } yield return new WaitForSeconds(0.3f); isSpawn = true; } private void Dead_Event() { if (!isBoss) { Stage_Manager.Count++; Main_UI.Instance.Monster_Slider_Count(); } else { Base_Manager.Stage.State_Change(Stage_State.Clear); } Spawner.m_monsters.Remove(this); Base_Manager.Pool.Pooling_OBJ("Smoke").Get((value) => { value.transform.position = new Vector3(transform.position.x, 0.5f, transform.position.z); Base_Manager.instance.Return_Pool(value.GetComponent<ParticleSystem>().duration, value, "Smoke"); }); Base_Manager.Pool.Pooling_OBJ("COIN_PARENT").Get((value) => { value.GetComponent<Coin_Parent>().Init(transform.position); }); for (int i = 0; i < 3; i++) { Base_Manager.Pool.Pooling_OBJ("Item_OBJ").Get((value) => { value.GetComponent<Item_OBJ>().Init(transform.position); // 몬스터 위치 삽입 }); } if (!isBoss) { Base_Manager.Pool.m_pool_Dictionary["Monster"].Return(this.gameObject); } else { Destroy(this.gameObject); // 보스몬스터는 풀링하지않고 파괴한다. } } }
-
해결됨[Unity] 함께 만들어가는 방치형 게임 개발
채팅 시스테 ㅁ구현
안녕하세요! 유니티 초보이지만 개발 경력이 쪼끔 있어 파이누스님의 기초 유니티 강의를 빠르게 듣고 방치형 강의를 들으려고하는 학생입니다. 방치형 게임은 솔로 플레이인데 혹시 다른 유저들과 소통할 수 있는 채팅 기능 구현하는게 있을까요~? 궁금합니다!
-
해결됨새싹부터 시작하는 Unity 게임 개발
Start 자동 완성이 안됩니다.
학습에 관련된 상세한 질문을 남겨주세요 🙂그 외에도 여러분들이 자체적으로 게임을 개발하면서 생긴 여러 오류들도 남겨주신다면 제가 아는 선에서 최대한 답변드리겠습니다 ! 😃
-
해결됨[Unity] 함께 만들어가는 방치형 게임 개발
리얼타임 데이터베이스 정렬보기 같은게 있을까요?
파이어베이스 리얼타임 데이터베이스에USER 하위 항목으로 저장된 내용들을 보니까제가 저장에 쓰이게 했던 변수들의 순서 나열과 다르게변수이름 시작부분 a~z 순으로 데이터가 저장되는것 같더라구요.....예를들어 제가 변수를public int zzz;public int ccc;public int aaa;이렇게 코드를 쳤다면........파이어베이스 데이터 쪽에는 (USER 하위에)public int aaa;public int ccc;public int zzz;로.... 제가 코드로 순서 맞춰 쓴 변수와 다르게a순부터 z 순까지 자동정렬 되더라구용;;이거 그냥 a~z순 말고 제가 쓴 변수 순서대로 정렬되서저장되게 하는법이 있을까요??
-
해결됨[Unity] 함께 만들어가는 방치형 게임 개발
파이어베이스 데이터베이스 불러오기 궁금한점이 있어요.
데이터 베이스 불러올때 public void ReadData() 함수에서만약에, 저장된 파일이 없을때 불러오려고 하면 에러날수도있을거같아서 혹시if(그 유저의 저장된파일이 있다면){ ReadData(); //데이터를 불러온다. }else{ return;} 이렇게 코드를 짜보고싶은데위에서 if 안에 들어갈만한 (그 유저의 저장된파일이 있다면) 에혹시 뭐라고 쓰는게 좋을까요? ㅠㅠ
-
해결됨[Unity] 함께 만들어가는 방치형 게임 개발
강의 제공 에셋 import
제일 마지막 공유 에셋 파일 import 하면지금까지 올려주신 모든 에셋 파일을 한번에 import 할 수 있는건가요?총 9개의 다운로드 파일이 있던데 이거를 전부 다운받아서 import 해야하는지 궁금합니다