묻고 답해요
141만명의 커뮤니티!! 함께 토론해봐요.
인프런 TOP Writers
-
해결됨[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 해야하는지 궁금합니다
-
미해결[Unity] 함께 만들어가는 방치형 게임 개발
코드 다운로드에 관해서
다른 질문글도 있지만개발 진행하며, 관련 코드가 없어 화면을 일일이 찾아야되는 부분이 있어 그런데,혹시 지금까지 하셨던 내용선에서라도 한번 전체 소스코드를 올려주시는건 가능하신지 문의드립니다.
-
해결됨새싹부터 시작하는 Unity 게임 개발
섹션2. 메서드와 접근자에서 잘못된 설명이 있어요.
안녕하세요. public 접근자를 붙인 변수를 전역 변수,private 접근자를 붙인 변수를 지역 변수라고 설명하셨는데 이는 잘못된 설명 같습니다. 확인 후 수정 부탁드립니다.수고하세요.
-
미해결새싹부터 시작하는 Unity 게임 개발
애니메이션 점프 적용되지 않는 문제
새싹부터 시작하는 Unity 게임 개발 섹션3 2D게임 애니메이션강의 시청 중 점프 애니메이션이 적용되지 않습니다. 유니티에서 transition은 아래와 같이 설정한 상태이고 코드는 강의와 똑같이 작성한 상태입니다.if (Input.GetKeyDown(KeyCode.Space) && isJump == false) { anim.SetTrigger("isJUMP"); isJump = true; anim.SetBool("isIDLE", false); anim.SetBool("isRUN", false); rigidbody.velocity = new Vector2(rigidbody.velocity.x, jumpPower); } if(rigidbody.velocity.y == 0f ) { isJump = false; } JUMP 애니메이션만 다시 재생해보면 점프하는 동작이 나오긴 합니다. 강의를 듣던 중GetComponent<SpriteRenderer>().sprite = JumpSprite;이런 코드가 있던데 저는 작성하지 않은 상태입니다혹시 이 코드가 점프가 안 되는 이유 중 하나인지 질문 남깁니다.
-
해결됨[Unity] 함께 만들어가는 방치형 게임 개발
코드오류 (버전문제인지 궁금합니다)
유니티 버전을 22.3.6f 로 하라고 하셨었는데 lts버전이 아니여서 22.3.47f 로했는데그래서 그런건지 여기도 이렇게 글씨에 이렇게 그어져있고 자꾸 오류가 뜨네요 ㅠ#pragma warning disable CS0618 // 형식 또는 멤버는 사용되지 않습니다. 이렇게 넣어서 오류 문구는 안뜨는데 상관없는 걸까요??
-
미해결[Unity] 함께 만들어가는 방치형 게임 개발
이 오류가 계속뜨는데 어떻게 잡아야할지 모르겠습니다.
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/Manager/Pool_Mng.cs:48)Pool_Mng:Add_Queue (string) (at Assets/00_Scripts/Manager/Pool_Mng.cs:111)Pool_Mng:Pooling_OBJ (string) (at Assets/00_Scripts/Manager/Pool_Mng.cs:83)Monster:GetDamage (double) (at Assets/00_Scripts/Monster/Monster.cs:62)Bullet:Update () (at Assets/00_Scripts/Bullet.cs:71)공격할 때 마다 계속 쌓이네요 ㅠ
-
해결됨[Unity] 함께 만들어가는 방치형 게임 개발
기능 구현 질문드립니다.
강의 영상 알차게 잘 보고 있습니다!출시까지 목표로 두고 있는 프로젝트라고 하셔서 캐릭터 장비요소는 필수라 생각되어 혹시나 장비드랍 및 장착기능 구현이 업데이트 내용에 있나 궁금해서 여쭤봅니다.1.장비아이템도 드랍 및 가챠뽑기방식2.장비아이템이 추가된다면 같은 장비라도 옵션이 다르게 보여지고 인벤토리로 저장되는 방식으로 구현되는지 궁금합니다. (예시 : 디아블로 아이템 옵션수치 및 옵션랜덤 방식)
-
해결됨[Unity] 함께 만들어가는 방치형 게임 개발
안녕하세요 강의 무한로딩 문의합니다.
9월 20일 추가 하신 강의 중 가챠 2 강의 제외하고 모두 무한 로딩 뜨는데요 혹시 무슨 문제 일까요?
-
해결됨[Unity] 함께 만들어가는 방치형 게임 개발
작성된 코드 다운로드 에 대해서 질문드려요
안녕하세요다름이 아니라 파트가 끝난 코드는 다운로드 받을수 있게 안되나요? 똑같이 따라 친거같은데 무언가 오류도 많이 발생하고 잘안되네요 파트가 끝난 부분에 대해서 코드 다운로드 를 제공해주실수 있는지 문의드립니다.
-
해결됨[Unity] 함께 만들어가는 방치형 게임 개발
안녕하세요 어플 에서 실행
안녕하세요 선생님 컴퓨터로 강의 실행은 잘되는데 인프런 어플로 재생했을때 34강 부터 실행이 안됩니다 ㅠㅠ 동영상을 준비중에 있습니다 이렇게 나옵니다 확인 부탁드립니다
-
해결됨[Unity] 함께 만들어가는 방치형 게임 개발
Item 깨짐 현상
10강 수강 중 Other > Item에 있는 아이템 삽입 시 화면처럼 마젠타 색으로 모든 아이템이 전부 깨져서 표시됩니다제가 가지고 있는 패키지에는 Item 항목이 없어 섹션3의 패키지 파일을 다운 받아 유니티에 드래그드롭으로 넣고 Import 된 Item을 꺼냈더니 저렇게 뜹니다 어떻게 해결해야 하는지 질문 드립니다
-
해결됨[Unity] 함께 만들어가는 방치형 게임 개발
오브젝트 폴링 문의 합니다.
Add_Queue 함수에서 go.transform.parent = m_pool_Dictionary[path].parentTransform;부모 설정을 하고 다시 Return 함수로 가서 obj.transform.parent = parentTransform; 다시 부모 설정 하는 이유가 궁금 합니다. 아 그리고 스킬 구현 아이디어는 끝났나요 ?