I'm still here, I wish I could speak Korean, English auto generated subtitles are quite useless. So far I learnt a lot and most of my questions about tile repetition were satisfied with the code! Thank you for this tutorial!
English and Korean have different word order, so the quality of automatic translation is inevitably low. I would like to provide subtitles, but it is difficult due to lack of time. Nevertheless, thank you very much for watching my lectures consistently! 😇
@@goldmetal So far a really good tutorial, despite of the subtitles I could experiment new things, I always struggle with inheritance and passing data through other scripts!
항상 유익한 내용 재미있게 공부하고있습니다. 공부중 잘안풀리는 부분이 있습니다! spawnPoint = GetComponentsInChildren(); 사용 후 enemy.transform.position = spawnPoint[Random.Range(1, spawnPoint.Length)].position; 사용해서 랜덤레인지 1 부터했음에도 플레이어 옆에서 몹들이 젠이 되는데 이유가 뭘까요? ㅠ
1. 지역변수 사용하는 이유는 잠깐 연산해서 다른 곳으로 값을 넘기거나 사용하기 위해 담아두기 위함입니다. select 또한 무언가 필요한 게임오브젝트를 담아두기 위해 미리 상자를 만들어둔거죠. 단순히 연산을 위한 것만 아니라 개발자에게 의미를 보여주기 위한 가독성 향상도 있습니다. blog.naver.com/thebaleuncoding/221739096238
골메님 오늘도 잘보고 배우고 있습니다~ 사소한 질문 일지도 모르지만 if 문이나 foreach 문 같은 거는 if ( ) 이렇게 적고 중괄호를 적어주잖아요 그때 저는 증괄호를 적고 엔터를 치면 if () { } --> if () { } 이런식으로 if 글씨 밑으로 중괄호가 이동하는데 골메님은 if () { } 위에 처럼 여는 중괄호가 안내려 가더라구요~ 저도 저렇게 보는게 편해서 일일이 해주고 있는데 혹시 단축키 같은게 있으면 알려주시면 감사하겠습니다~
항상 재미있게 보고 있습니다. 골드메탈님. 우연히 지나갔다가 궁금해서 늦은시간에 질문남겨요. 죄송합니다. Pool[index] = new List(); 문장을 통해서 Pool리스트에 어떤 값을 넣는것이죠?? Pool[0]에 있는 리스트에는 prefabs[0]에 저장된 에너미를 저장하기 위한 공간이 맞나요?
안녕하세요. 명 강의에 감사드리며, 질문하나 드립니다. 영상 후반 부에 스폰 포인터를 배치할때, 캐릭터 주위에 콜라이드 영역처럼 보이는 사각형 테두리가 보이는데, 저의 플젝에서 스폰/포인트를 선택하면 보이지 않고, 하이어라키에서 Player를 선택했을 때만 보입니다. 혹시 원인이 뭘까요?
안녕하세요 골드메탈님, 튜토리얼영상들 잘 보며 덕분에 잘 배우고 있습니다. 그런데 이번 영상을 따라서 만들 때에 Spawn()주기를 0.2초로 잡고나니, 소환은 제대로 됩니다만 이동하면서 계속해서 소환할 시에 화면 바깥이 아닌 화면 안쪽에서 몬스터가 생성되는 경우가 잦더라구요. 혹시 reposition이 문제일까 싶어서 시도해보면 그건 아닌거같고, spawn을 일정 시간이 아니라 손으로 직접 눌러보기도 해보니 이미 충분히 많은 수가 소환된 후에도 연속적으로 다수가 생성될 때에 그런 현상이 일어나는것 같았습니다. instantiate가 너무 잦게 호출되면 spriterenderer가 뒤늦게 일을해서 이미지가 생기기까지 살짝 딜레이가 걸린다거나 하는 일이 있을까요? 혹여 spawnPoint를 너무 가까이 두었나 싶어서 더 멀리 떨어뜨려놔도 같은 현상이 일어납니다. 그리고 움직이지 않고 가만히 있는 상태에서는 화면안에 생성되는 일이 거의 없었구요.
이번 강의도 재밌게 잘 배웠습니다! 몇 가지 궁금증이 생겨서 질문 남겨요 1. instantiate 함수 매개변수로 포지션을 설정하는 vector3값을 넣을 수 있는 거로 아는데 거기서 바로 spawnPoint 랜덤을 넣어서 포지션을 설정하지 않고 따로 포지션을 설정한 이유가 있나요 ? 그렇게 되면 스폰포인트까지 풀매니저에서 처리해야하니 그냥 역할 분리를 위해 따로 하신건지 궁금해요! 2. GameManager.instance.~~ 이 접근방식이 생소해서 너무 어색하더라구요. 원래 같으면 Player player; player = GetComponent(); 이런식으로 선언과 할당을 하고 접근하는데 바로 쓰는게 신기해요. 전 강의 다시보니 정적변수는 즉시 클래스에서 부를 수 있다는 편리함이 있다고 하셨는데 이 부분에 관한 자세한 설명이 궁금해졌어요. 제 생각에는 다른 스크립트에서 GameManager instance; instance = GetComponent(); 로 해서 선언할당 할 것을 미리 GameManager 내부에서 instance라는 GameManager 타입의 변수를 만든 느낌인가요 ? 그리고 그것은 다른 스크립트(클래스)에서 별도의 조치없이 바로 부를 수 있구요. 3. 그리고 굳이 GameManager로 접근해서 가져오는 이유가 마치 다이소가 여러가지 물건을 다 가지고 있어서 우리는 각각 필요한걸 찾아다닐 필요없이 다이소 한 곳만 가면 다 구할 수 있는 느낌의 편리함 때문인가요? 너무 흐름대로 쓰다보니 질문이 두서없이 적혔네요 ㅠㅠ 언제나 좋은 강의 감사합니다!
1. Instantiate에서 바로 position, rotation, parent 설정 가능합니다. 이 강좌에서는 instantiate의 함수 반환 값이 생성된 오브젝트라서 이것을 바로 활용할 수 있다는 것을 보여주기 위해 코드가 작성되었음을 말슴드립니다. 2,3. 다른 오브젝트의 스크립트가 플레이어 스크립트를 바로 가져오려면 Find를 사용하거나 인스펙터에서 초기화를 미리 해줘야 합니다. 하지만 몬스터의 경우 프리펩으로 instantiate로 새로 생성하기 때문에 미리 초기화는 불가능하므로 Find를 사용해야 하는데 Find는 비용이 많이 드는 무거운 함수 (장면의 모든 오브젝트를 탐색하는 비용)이라 가급적 사용을 자제해야 합니다. 때문에 미리 GameManager에 저장해두고 필요할 때마다 GameManager.instance.~ 여기로 접근하여 사용하는거죠. instance가 더 붙는 이유는 정적 메모리와 관련된 내용입니다. 그냥 GameManager.는 게임 상에 올라오지 않은 청사진 상태라면 GameManager.instance. 는 정적 메모리 중에서도 게임에 올라간 GameManager 분신을 접근한다는 것으로 이해해주시면 되겠습니다.
여기까지 진행했을 때 Enemy가 Area를 벗어나도 재배치가 작동하지 않고 플레이어쪽으로 따라만 오는데 어떤 문제일까요? 5번 영상까지는 재배치가 잘 되었었는데.. 5번 영상에서는 Area 안에 이미 배치가 되어있어서 재배치됐지만 이번 영상에서는 Area 밖에 Spawn Point가 있어 재배치가 작동하지 않는거라고 이해하면 될까요?
안녕하세요. 정말 많은 도움 받고 있습니다. 질문이 있는데요. 유니티에서 참조 순서를 어떻게 정하는지 궁금합니다. GameManager의 Awake에서 instance를 this로 할당하고 30:08 에 나왔던것 처럼, Enemy 클래스, Spawner 클래스 등에서 GameManager.instance를 사용하잖아요. 근데 만약 GameManager의 Awake 호출 전에 다른곳에서 GameManager.instance를 사용하면 Null Exception이 발생하는데 이런 순서에 대한 걱정은 어디서 찾아봐야할까요? 이와 비슷하게 스크립트간 순서에 대해 걱정할 필요가 있는지 궁금합니다. 감사합니다.
void Update() { if(Input.GetButtonDown("Jump") } 부분이 작동이 안돼서 스페이스를 눌러도 스폰이 안되는거 같습니다. 만약 플레이어 이동 입력을 Input System 패키지를 이용해 만들면 발생하는 오류일까요? 콘솔 오류메세지를 확인했을 때 그런게 원인인것 같더라고요
안녕하세요 골드메탈님 강의 잘 보고 있습니다. 다름이 아니라 27:20 쯤에서 스페이스바를 눌러도 몹이 소환되질 않습니다.. Input Manager에서 Jump의 positive button이 space로 되어있는것도 확인했고, wasd와 방향키로 플레이어를 움직이게 하는것은 됩니다. GetKeyDown 같은 다른 함수로 진행해도 안되네요.. Debug.Log로 스페이스바가 눌릴때마다 확인하려고 했는데 누르면 로그에 뜨질 않아요 오류 메세지도 없고 분명 똑같이 따라했는데도 스페이스가 인식이 안돼서 미치겠습니다 어떤게 문제인건가요? 그리고 한가지 질문이 더 있는데 제 비주얼 스튜디오에서는 골드메탈님처럼 코드 작성할때 빨간줄이 아예 뜨지 않고, 단어들의 색깔 또한 골드메탈님과는 다릅니다. 거기에 유니티에서 제공하는 자동완성? 또한 마찬가지로 아예 안뜨고 그냥 기본 자동완성만 뜨더라구요 External Tools에서 현재 비주얼 스튜디오 버전으로 되어있는것도 확인했습니다. 이것도 어떻게 해결할 방법이 있을까요?
영상 잘 보고 있습니다 골드메탈님! 풀링 사용해보기 부분에서 질문이 있는데요, 실행 후에 스페이스바를 누르면 IndexOutOfRangeException이라는 오류가 뜨면서 게임창에 프리펩이 생성되지 않습니다. 해당 오류가 난 코드는 foreach (GameObject item in pools[index]) 이라는데요, 배열의 범위를 벗어났다는 것 같은데...무슨 말인지 정확히 해석이 어려워서요... 이런 오류는 어떻게 해결할 수 있을까요? +현재 사용하고 있는 버전은 2022.3.7f1 입니다
안녕하세요 골드메탈님 ! 이번 강좌도 아주 잘 듣고 있습니다 ! 한 가지 질문이 있어서 댓글 남기는데요 씬 창에서 포지션이 (0, 0, 0)인 곳에 Enemy B(검정색 Enemy)가 생성되어있는데 마우스로 선택을 해서 지우려고 해도 선택이 안되고 하이라이키 창에서도 표시가 되지 않아요 게임을 시작하여도 Enemy B(검정색 Enemy)는 그대로 생성되어 있고 움직이지도 않는데 이러한 문제는 어떻게 해결해야할까요? ㅠㅠ
@@DigDix3858 감사합니다 공부중이라 ai쳇봇이랑 문제 되는 부분을 1시간 넘게 찾고 있었는데 ;; 답답해서 댓글 보러 와서 해결하네요 감사합니다 껏다키니까 콘솔에 뜨던 NullReferenceException: Object reference not set to an instance of an object 이 오류까지 사라졌네요;;
선생님 좋은 강의 너무 감사합니다! 질문이 하나 있어서 댓글 남깁니다. 계속해서 에러가 하나 뜨는데 어떻게 해결할지를 모르겠습니다. 도와주세요. NullReferenceException: Object reference not set to an instance of an object UnityEditor.Graphs.Edge.WakeUp () (at :0) 이 오류 어떻게 해결하면 좋을까요..? 답변 부탁드립니다!
안녕하세요 골드메탈님! 제가 오브젝트 풀링에 관해 제대로 이해한 게 맞는지 여쭈어보고 싶습니다! Get() 함수의 내용이 그러니까, foreach (GameObject item in pools[index]) { if (!item.activeSelf) { select = item; select.SetActive(true); break; } } 의 경우에는 생성된 오브젝트 중 비활성화되어 있는 오브젝트(이 경우, 해당 오브젝트는 이미 생성이 되었다가 게임 시스템 상으로 비활성화된 오브젝트인가요? 그러니까, 적이 죽었다, 등의 이유로 모습이 사라지게 된 경우요.)를 찾아 활성화시키는 것이고, if (!select) { select = Instantiate(prefabs[index], transform); pools[index].Add(select); } return select; 의 경우에는 위에서 비활성화된 물체를 찾지 못했을 때, (이 강의의 경우, 생성된 적이 전부 살아있다. 등의 경우인가요?) 새로운 오브젝트를 생성시켜 그 오브젝트를 나타나게 한다... 그런건가요? 요컨대 몬스터처럼 무수한 수의 오브젝트가 끊임없이 생성(Instantiate)되고 파괴(Destroy)될 때, 잉여 메모리가 생기는 것을 방지하기 위해, 이미 생성된 물체를 Destroy 시키지 않고 비활성화시킨 다음, 필요할 때 그 비활성화된 오브젝트를 찾아 다시 활성화시켜서 재활용하는 방식인건가요?
네 오브젝트 풀링의 요점은 Destory를 사용하지 않고 SetActiva(false)로 비활성화만 해두고 나중에는 다시 활성화해서 재활용하는 것입니다. 이번 시간은 비활성화에 대해 다루지는 않았기 때문에 오브젝트 풀링의 기능을 모두 보여주지는 않았습니다. 차후 공격 기능이 추가되면 오브젝트 풀링의 작동을 하이어라키에서 실시간으로 확인하실 수 있어요.
메탈형 reposition스크립트에서 static선언한 gamemanager안에 player 정보를 가져 올 때, 정적 데이터로 가져온 player의 position정보가 garbage되지않고 계속 남아있지 않나요? 그럼 플레이어가 계속 움직일 때마다 위치 데이터가 garbage되지않고 무한으로 쌓이나요? 아니면 gamemanager만 정적 데이터고 안에 데이터는 동적 데이터인가요?? garbage랑 데이터 관련해서 좀 헷갈리네요...
안녕하세요! 강의 보고 만들고 있는데요, 영상 보고 따라 만들었는데 enemy가 자동소환이 되지 않습니다 ㅠㅠ.. 혹시 이유를 알 수있을까요? 아래는 제가 작성한 코드 입니다 using System.Collections; using System.Collections.Generic; using UnityEngine; public class Spwaner : MonoBehaviour { public Transform[] spawnPoint; float timer; void Awake() { spawnPoint = GetComponentsInChildren(); } void Update() { timer += Time.deltaTime; if (timer > 0.2f) { timer = 0; Spawn(); } } void Spawn() { GameObject enemy = GameManger.Instance.pool.Get(Random.Range(0, 2)); enemy.transform.position = spawnPoint[Random.Range(1, spawnPoint.Length)].position; } }
@@goldmetal 안녕하세요. Inspector 하단의 Spawn Point는 영상에서 알려주신 것 처럼 0으로 그냥 냅뒀습니다. 그리고 진행할때 Console에서 [!]표에서 NullReferenceException: Object reference not set to an instance of an object Spwaner.Spawn () (at Assets/Undead Survivor/Code/Spwaner.cs:27) 27번째 코드는 GameObject enemy = GameManger.Instance.pool.Get(Random.Range(0, 2)); 입니다
@@phm-1008 원래 랜덤하게 나타나는거라 그게 맞습니다.카메라 범위가 너무 넓게 비추면 몬스터가 뿅하고 나타나는게 보이기 때문에 어느정도 플레이어를 크게 비추거나 반대로 스폰 Point를 카메라 영역 바깥으로 빼주셔야 합니다. 근데 후자 방법은 플레이어와의 거리도 늘어나는 셈이니까 리스폰되지마자 바로 Reposition 될 수도 있으니 이 점 주의하시길 바랍니다
안녕하세요 골드메탈님 강좌 정말 잘 보고 있습니다. 뱀서라이크 강좌를 따라 구현중에 오류가 생겼는데요 해결방법을 몰라 댓글에 적어 봅니다. 강좌는 9번까지 완료했습니다. 오류 내용은 아래와 같습니다. -아래- 스크립트 PoolManager에서 아래 부분 이 에러 납니다. // 선택한 풀의 비활성화 된 게임 오브젝트에 접근 foreach (GameObject item in pools[index]) {
너무 좋은 강의네요. 게임메니저에 public PoolManager pool; 를 추가하면 error CS0246: The type or namespace name 'PoolManager' could not be found (are you missing a using directive or an assembly reference?) 라는 오류가 뜹니다.
제가 조금 바꾸면서 하다 보니 타겟 설정하는 부분에서 target이 겹친다는 오류가 떠서 임의로 enemytarget을 써서 public Transform target; public Rigidbody2D enemytarget; 이렇게 두 가지를 선언했거든요 문제가 없을까요??
실행하면 이렇게 떠요..... MissingReferenceException: The object of type 'GameObject' has been destroyed but you are still trying to access it. Your script should either check if it is null or you should not destroy the object. 뭔가요?
26:51초 처럼 입력했는데 error CS1061: 'object' does not contain a definition for 'Get' and no accessible extension method 'Get' accepting a first argument of type 'object' could be found (are you missing a using directive or an assembly reference?) 라고 뜹니다 뭘 어떻게 해야하는지 모르겠습니다
@@Lunahypixel과금 기능은 IAP라고 부르며 유니티에서 기본적으로 패키지로 지원해주고 있습니다. velog.io/@kimwonseop/Unity-IAP docs.unity3d.com/kr/2021.3/Manual/UnityIAPSettingUp.html 두 자료를 참고하시면 도움이 많이 되실 겁니다.
Scene 과 Project Assets은 별개의 공간이기 때문입니다. 연극의 무대(Scene)와 창고(Assets)의 개념이라고 생각하시면 조금 이해하시기 편할거에요. Scene 안에 있는 오브젝트끼리는 접근이 가능하지만 Asset 형태로 있는 오브젝트가 Scene에 접근할 수는 없습니다. 그래서 미리 설정해둔 변수도 프리펩으로 만들면 접근불가로 풀려버리는 것입니다. 좀 더 확장해보면 프리펩과 프리펩끼리는 접근이 가능합니다.
하이어라키를 확인해보니 poolmanager 안에서 Enemy A와 B 한 개체씩만 복제되지 않고 무한 리스폰되어 사라지는 것처럼 보이는 현상이 생겼습니다. 해결방법이 있을까요? using System.Collections; using System.Collections.Generic; using UnityEngine; public class Spwaner : MonoBehaviour { public Transform[] spawnPoint; float timer; void Awake() { spawnPoint = GetComponentsInChildren(); } void Update() { timer += Time.deltaTime; if (timer > 0.2f) { timer = 0; Spawn(); } } void Spawn() { GameObject enemy = GameManager.instance.pool.Get(Random.Range(0, 2)); enemy.transform.position = spawnPoint[Random.Range(1, spawnPoint.Length)].position; } } 코드는 이렇습니다!
안녕하세요 골드메탈님 현재 여기 강좌까지 따라하다가 Jump키가 인식되지 않아서 그런데.. 어떻게 해결할수있을까요? Fire 로도 해보려고 했지만 인식되지 않습니다. 디버그를 사용해서 확인해볼려고했는데 눌렀을때 로그창에 아무것도 표시되지 않더군요.. 방향키는 지금 인식을 잘하는데 왜 다른키들은 인식을 못할까요?
골드메탈님 스크립트 작성 및 작동은 잘 되었는데, 왜 NullReferenceException이 뜨면서 Scene 창에서는 복사된 적의 모습이 보이는데 Game 창에서는 복사된 적의 모습이 안보일까요? 에러: NullReferenceException: Object reference not set to an instance of an object Enemy.OnEnable () (at Assets/Undead Survivor/Scripts/Enemy.cs:38) 38번째 줄: target = GameManager.Instance.player.GetComponent(); (instance가 아닌 Instance로 저장해놓았습니다)
스크립트를 다 작성한 후 테스트를 해봤는데 UnassignedReferenceException: The variable target of Enemy has not been assigned. You probably need to assign the target variable of the Enemy script in the inspector. 이라는 오류문장이 나옵니다.. 해결할 수 있는 방법이 있을까요??
저는 플레이어를 이동하다보면 몬스터가 눈앞에 풀링되는 경우가 생기던데 왜 이럴까요? 카메라 밖에 스폰 포인트를 뒀는데도 이러네요 ㅠㅠ 그리고 카메라가 이동하면서 타일이 생기긴하는데 기존 타일이 카메라(캐릭터)가 다 이동하기도 전에 사라지는 문제가 있습니다. 혹시 이 두 문제를 해결할 수 있는 팁 좀 주실 수 있을까요?
카메라 넓이(길이)가 20이 넘을 경우 보일 수도 있겠네요. 몬스터 생성 포인트를 중심으로부터 더 멀리 떨어뜨려보세요. 카메라가 맵 크기보다 크기 때문에 옮겨지는게 게임상에서 보일 수도 있겠으니 카메라 크기를 좀 줄여보는 것도 좋겠습니자. 이것은 픽셀 퍼펙트 카메라의 해상도를 낮춰보세요
종스크롤 슈팅게임 때 보다 코드도 간단해지고 설명이 엄청 직관적이면서도 자세하셔서 한번에 이해했습니다
감사합니다!!
요즘 삶의 낙입니다, 오늘도 때맞는 인공호흡 감사합니다
뭔가 앞선 기초 강의들과 다르게 코드가 굉장히 깔끔하고 실용성있게 짜여진게 느껴지네요 조금 생소하긴하지만 그래도 더 배워가는게 있는거같아 좋네요
좋은 강의 영상 감사합니다.
아 최고입니다!!
너무 설명 잘해주시고 잘 따라 하고 있습니다
좋댓구!!
이번에는 엄청 빨리 올라왔네요! 정말 감사합니다!
코딩도 설명도 깔끔합니다. 최고의 강의입니다.
최신 강의로 갈수록 코드 퀄리티가 높아지는 느낌입니다
정적변수로 게임매니저 접근하는건 정말 간편하네여
골드메탈님 기다렸습니다!!! 유니티 최고의 강의! 선 댓글달고 저녁에 보고 열심히 공부하겠습니다 ㅎㅎ 매번 좋은강의 너무 감사드립니다~
새 강의 금방 나왔네요! 늘 감사합니다
설명이 너무 재밌어요!! 유니티가 이렇게 재밌는건줄 몰랐어요! ㅎㅎㅎ 좋은 강의 감사합니다!
유니티 초보자도 따라할 수 있는 최고의 강의 입니다!ㅎㅎ
오브젝트 풀링은 언제나 아름답다
항상 좋은 강의 감사합니다!
감사합니다!!😀 정말 잘보고 있습니다 2023년!!
강좌 길어져서 오히려 좋네요!!! 짱입니다ㅎㅎ
쉬운 설명 감사드립니다.
오늘도 영양가 높은 영상 감사히 시청하였습니다~
오늘도좋은강의감사합니다
오 이번엔 빨리올라왔네요~~ 좋은 강의 감사합니다~~
I'm still here, I wish I could speak Korean, English auto generated subtitles are quite useless. So far I learnt a lot and most of my questions about tile repetition were satisfied with the code! Thank you for this tutorial!
English and Korean have different word order, so the quality of automatic translation is inevitably low. I would like to provide subtitles, but it is difficult due to lack of time. Nevertheless, thank you very much for watching my lectures consistently! 😇
@@goldmetal So far a really good tutorial, despite of the subtitles I could experiment new things, I always struggle with inheritance and passing data through other scripts!
오늘도 무사히 잘 마쳤습니다. ㅎㅎ 그냥 하면서 든 생각인데 스폰에서 몬스터 불러 올 때 지금 랜덤함수로 (0,2) 아렇게 범위를 숫자로 지정하는데 나중에 이거 풀의 길이?로 가져오게 해도 되는거죠? ㅎㅎ 나중에 바꾸실거 같긴한데 그냥 생각나서 여쭤봅니다 ㅎㅎ
넵 말씀하신 내용은 16회차 강좌 마지막 챕터에서 다룹니다!
강의 빠르게 올려주셔서 감사드립니다~!!
저장하고 보겠습니당
이해하기에 쪼끔 어렵지만(제가 스크립트 작성이 익숙하지 않아서 그럴듯)
좋은 강의였습니다! 감사합니다 ㅎ
기다리고 있었습니다!!!
골드메탈님 질문 해도될까요? Get함수를 만들면서 GameObject를 반환값으로 만드셨는데 어차피 GameObject를 instantiate나 active 시키는데 굳이 반환값말고 void를 해도 되지않나요?
진짜 궁금해서 질문 드립니다.
38:58에 답이 나옵니다.
Get 함수는 오브젝트를 반환하기 때문에 Spwaner 스크립트에서 소환된 몬스터의 position을 변경할 수 있던 것이죠.
함수 반환 값은 호출을 하고 있는 부분에서 무언가 더 활용하기 위한 것임을 이해하시면 되겠습니다.
황금같은 강좌 감사합니다!
항상 유익한 내용 재미있게 공부하고있습니다.
공부중 잘안풀리는 부분이 있습니다!
spawnPoint = GetComponentsInChildren(); 사용 후
enemy.transform.position = spawnPoint[Random.Range(1, spawnPoint.Length)].position;
사용해서 랜덤레인지 1 부터했음에도 플레이어 옆에서 몹들이 젠이 되는데 이유가 뭘까요? ㅠ
SpawnPoint 중에서 가운데에 위치한 오브젝트가 있는지 확인해주시고
혹은 게임 실행 후에 인스펙터에서 Spanwer의 spawnPoint 항목을 한번 살펴보시는 것도 좋겠습니다.
27:10
왜 스페이스바를 눌러도 Enemy가 소환이 안되지 하고 있었는데 알고보니 왼쪽 위에 Game이 Simulator로 되어있어서 소환이 안되었던거네요 ^^; 만약 저같은 사람이 있으면 꼭 Game으로 바꾸세요!!
늘 좋은 강의 영상 감사드립니다. ^^
감사합니다 😂
감사합니다!
감사합니다 ㅋㅋ
선생님 혹시 강의에서 말하시는 코드들 설명하실때 '지역함수' 나
GameObject select = null; 같은걸
이해할라면 어떤걸 참고하면 될까요?
아님 함수 자체가 이해가 좀 안된다면 다른 어떤걸 참고해야하나요..?
1. 지역변수 사용하는 이유는 잠깐 연산해서 다른 곳으로 값을 넘기거나 사용하기 위해
담아두기 위함입니다.
select 또한 무언가 필요한 게임오브젝트를 담아두기 위해 미리 상자를 만들어둔거죠.
단순히 연산을 위한 것만 아니라 개발자에게 의미를 보여주기 위한 가독성 향상도 있습니다.
blog.naver.com/thebaleuncoding/221739096238
몬스터가 투명하게 생성될땐 PoolManager - inspector - position z값이 0이여야 해요. 20분동안 고생해서 알아냇서요 ㅎㅎ
저는 실행하면 몬스터가 전혀 생성되지 않는데, 투명하게 생성되고 있는걸까요??
@@YOU-AIKA 혹시 해결 되셨나요? 안 되셨다면 Spawner 오브젝트에 스크립트가 내장 되었는지 확인해 보세요.
안녕하세요 골드메탈님! 양질의 강의 너무 감사드립니다 ㅎㅎ
강의 따라하다보니 스페이스바를 누를 때 좀비가 생성되는 것이 왼쪽 화면이 game일 때는 되는데 simulator일 때는 안되어서 한참 고생했네요 ㅠ;
혹시 왜 이런 현상이 나타나는 것인가요?
Simulator는 모바일 환경을 시뮬레이션하는거라 물리 키보드가 없는 환경으로 간주되어 그냥 Input 은 먹히지 않습니다.
소환되는거 테스트만 하는거니까 넘어가셔도 됩니다.
@@goldmetal 답변 감사합니다 :)
골메님 오늘도 잘보고 배우고 있습니다~
사소한 질문 일지도 모르지만
if 문이나 foreach 문 같은 거는 if ( ) 이렇게 적고 중괄호를 적어주잖아요 그때 저는 증괄호를 적고 엔터를 치면 if () { } --> if ()
{
}
이런식으로 if 글씨 밑으로 중괄호가 이동하는데 골메님은 if () {
}
위에 처럼 여는 중괄호가 안내려 가더라구요~
저도 저렇게 보는게 편해서 일일이 해주고 있는데 혹시 단축키 같은게 있으면 알려주시면 감사하겠습니다~
단축키는 아니고 Visual Studio 설정에 있습니다.
Text Editor - C# 쪽보시면 해당 옵션을 보실 수 있어요
골드메탈님 혹시 지역변수는 어떨 대
지역변수를 사용하는지 알려주실 수 있을까요?
그 함수 내에서만 필요하면서도, 임시로 데이터를 잠시 저장이 필요할 때 많이 사용합니다.
또한 코드의 가독성을 위해서 일부러 사용하는 경우도 있습니다
감사합니다!
와... 처음에 프리펩 삭제할 때 실수로 다 삭제해 버려서 다시 만들어야 하나 하면서 식겁했네요 ㅠㅠㅠ 다행히도 간?단하게 복구 완료!
항상 재미있게 보고 있습니다. 골드메탈님. 우연히 지나갔다가 궁금해서 늦은시간에 질문남겨요. 죄송합니다.
Pool[index] = new List();
문장을 통해서 Pool리스트에 어떤 값을 넣는것이죠??
Pool[0]에 있는 리스트에는 prefabs[0]에 저장된 에너미를 저장하기 위한 공간이 맞나요?
Pool 배열 자체가 리스트들을 넣는 변수라서 한칸씩 순회하면서 리스트들을 초기화하는 겁니다.
각 칸의 리스트들은 말씀하신대로 prefabs 각각 해당하는 인스턴스화된 오브젝트들을 저장하는 용도입니다.
안녕하세요. 명 강의에 감사드리며, 질문하나 드립니다. 영상 후반 부에 스폰 포인터를 배치할때, 캐릭터 주위에 콜라이드 영역처럼 보이는 사각형 테두리가 보이는데, 저의 플젝에서 스폰/포인트를 선택하면 보이지 않고, 하이어라키에서 Player를 선택했을 때만 보입니다. 혹시 원인이 뭘까요?
저 사각형은 카메라가 비추는 영역입니다.
카메라 영역은 누르지 않아도 항상 보여지니까 카메라 위치한번 확인해보세요
안녕하세요 골드메탈님, 튜토리얼영상들 잘 보며 덕분에 잘 배우고 있습니다.
그런데 이번 영상을 따라서 만들 때에 Spawn()주기를 0.2초로 잡고나니, 소환은 제대로 됩니다만 이동하면서 계속해서 소환할 시에 화면 바깥이 아닌 화면 안쪽에서 몬스터가 생성되는 경우가 잦더라구요.
혹시 reposition이 문제일까 싶어서 시도해보면 그건 아닌거같고, spawn을 일정 시간이 아니라 손으로 직접 눌러보기도 해보니 이미 충분히 많은 수가 소환된 후에도 연속적으로 다수가 생성될 때에 그런 현상이 일어나는것 같았습니다.
instantiate가 너무 잦게 호출되면 spriterenderer가 뒤늦게 일을해서 이미지가 생기기까지 살짝 딜레이가 걸린다거나 하는 일이 있을까요? 혹여 spawnPoint를 너무 가까이 두었나 싶어서 더 멀리 떨어뜨려놔도 같은 현상이 일어납니다. 그리고 움직이지 않고 가만히 있는 상태에서는 화면안에 생성되는 일이 거의 없었구요.
만약 그 문제가 맞다면 일단은 플레이어가 가는 방향 쪽의 spawnpoint가 선택되면 playerDir*offset만큼의 거리를 추가한 위치에 소환 시켜보는 방법도 생각은 해보고 있습니다. 아직 시도는 안했지만요.
화면 안에 들어온 몬스터는 스폰이 아닌 Reposition에 의해 순간이동 된 것 같네요
Reposition에서 Enemy를 어디로 이동시키는지 점검해보시길 바랍니다.
이번 강의도 재밌게 잘 배웠습니다!
몇 가지 궁금증이 생겨서 질문 남겨요
1.
instantiate 함수 매개변수로 포지션을 설정하는 vector3값을 넣을 수 있는 거로 아는데 거기서 바로 spawnPoint 랜덤을 넣어서 포지션을 설정하지 않고 따로 포지션을 설정한 이유가 있나요 ?
그렇게 되면 스폰포인트까지 풀매니저에서 처리해야하니 그냥 역할 분리를 위해 따로 하신건지 궁금해요!
2.
GameManager.instance.~~
이 접근방식이 생소해서 너무 어색하더라구요.
원래 같으면
Player player;
player = GetComponent();
이런식으로 선언과 할당을 하고 접근하는데
바로 쓰는게 신기해요.
전 강의 다시보니 정적변수는 즉시 클래스에서 부를 수 있다는 편리함이 있다고 하셨는데
이 부분에 관한 자세한 설명이 궁금해졌어요.
제 생각에는 다른 스크립트에서
GameManager instance;
instance = GetComponent();
로 해서 선언할당 할 것을 미리 GameManager 내부에서 instance라는 GameManager 타입의 변수를 만든 느낌인가요 ?
그리고 그것은 다른 스크립트(클래스)에서 별도의 조치없이 바로 부를 수 있구요.
3.
그리고 굳이 GameManager로 접근해서 가져오는 이유가
마치 다이소가 여러가지 물건을 다 가지고 있어서 우리는 각각 필요한걸 찾아다닐 필요없이
다이소 한 곳만 가면 다 구할 수 있는 느낌의 편리함 때문인가요?
너무 흐름대로 쓰다보니 질문이 두서없이 적혔네요 ㅠㅠ
언제나 좋은 강의 감사합니다!
1. Instantiate에서 바로 position, rotation, parent 설정 가능합니다.
이 강좌에서는 instantiate의 함수 반환 값이 생성된 오브젝트라서 이것을 바로 활용할 수 있다는 것을 보여주기 위해
코드가 작성되었음을 말슴드립니다.
2,3. 다른 오브젝트의 스크립트가 플레이어 스크립트를 바로 가져오려면 Find를 사용하거나 인스펙터에서 초기화를 미리 해줘야 합니다. 하지만 몬스터의 경우 프리펩으로 instantiate로 새로 생성하기 때문에 미리 초기화는 불가능하므로 Find를 사용해야 하는데 Find는 비용이 많이 드는 무거운 함수 (장면의 모든 오브젝트를 탐색하는 비용)이라 가급적 사용을 자제해야 합니다.
때문에 미리 GameManager에 저장해두고 필요할 때마다 GameManager.instance.~ 여기로 접근하여 사용하는거죠.
instance가 더 붙는 이유는 정적 메모리와 관련된 내용입니다. 그냥 GameManager.는 게임 상에 올라오지 않은 청사진 상태라면 GameManager.instance. 는 정적 메모리 중에서도 게임에 올라간 GameManager 분신을 접근한다는 것으로 이해해주시면 되겠습니다.
@@goldmetal 답변 감사합니다! 궁금한게 해결됐어요!
instance를 사용하는게 분신을 접근하는 느낌이라고 하셨는데 그냥 Gamemanager로 접근하는 것보다 미리 만들어진 intance에 접근하는게 더 효율적인 측면이 있는 건가요?
@@glesu 효율적이라기 보단 GameManager 클래스는 장면 안의 내용까진 접근할 수 없기 때문에 같은 장면에 있는 .instance 까지 접근하는 것입니다. GameManager의 Awake에서 미리 자기자신을 instance에 넣는 것이 이것 때문이죠.
@@goldmetal 아! 인스펙터로 할당할 수 없는건 마찬가지니 위에 1에 대한 답변과 같은 이유군요.
그러면 ground같이 프리팹이 아닌 게임상에 존재하는 것도 그 방식을 쓰는건 그냥 통일성을 위한 것일까요 ?
@@glesu 바닥 오브젝트는 생성을 사용하지 않았습니다. 단순히 TAG를 사용해서 로직을 만든 것이니 이번 질문과는 좀 다른 내용이에요.
좋은 강의 감사합니다.
한 가지 궁금한 점이 있는데요. Spawner를 Player 하위에 두는 이유가 있나요?
항상 플레이어 주변에서 소환하기 위해서 입니다. 자식 오브젝트는 부모오브젝트와 같이 움직이거든요
3D 프로젝트에서도 이 강의를 거의 대부분 문제없이 응용할 수 있을까요~? Vector2를 Vector3등으로 바꾼다던지 하는 단순한 방법으로요~? 아니면 3D는 다른 방식으로 몬스터들을 생성하는 편으로 하는지요~ 그리고 늘 좋은 강의 정말 감사드립니다~!
벡터와 특히 물리만 잘 바꾸시면 문제없이 바꿀 수 있습니다.
컴포넌트도 2D가 빠지고 스크립트 에서도 OnTrigger 이벤트 뒤에도 2D 빼주셔야 합니다.
@@goldmetal 답변 정말 감사드립니다!!
여기까지 진행했을 때 Enemy가 Area를 벗어나도 재배치가 작동하지 않고 플레이어쪽으로 따라만 오는데 어떤 문제일까요? 5번 영상까지는 재배치가 잘 되었었는데..
5번 영상에서는 Area 안에 이미 배치가 되어있어서 재배치됐지만 이번 영상에서는 Area 밖에 Spawn Point가 있어 재배치가 작동하지 않는거라고 이해하면 될까요?
몬스터 프리펩의 태그가 Enemy 로 되어있는지 확인해주세요
@@goldmetal 되어있습니다. Enemy의 재배치 if문 안에 Debug.Log로 체크해보니 콘솔에서 로그들이 뜨기는 합니다. 만 재배치 코드만 작동하지 않네요
@@goldmetal 되어있습니다. Debug.Log로 체크도 해봤는데 콘솔은 또 잘 나오더라구요
@@goldmetal 되어있습니다. if(coll.enabled) 안에 Debug.Log 넣어서 확인해보니 콘솔에 로그는 또 잘 나오네요
감사합니다!!
골드메탈님 질문이 있습니다! Maxmize하고 플레이해보니 화면 외곽선의 하얀선이 있고 타일의 가로부분에 하얀선이 보이는데 어떻게 해결 할 수 있을까요? 저번에 댓글로 달아주셨던 떨림 현상은 해결하였습니다 ㅎㅎ
게임 창 좌특 위에보시면 빨간 에러가 있을겁니다.
게임 창 자체가 해상도가 홀수 픽셀이라 픽셀 퍼펙트가 작동하지 않는 것이니
게임창 크기를 마우스로 조절해서 작수로 맞춰주세요.
@@goldmetal 크 항상 친절한 답변 감사드립니다 지금까지나온 뱀서 강좌 다 듣고 도트찍어서 바꾸는중입니다 언젠가 출시가 목표입니다ㅎㅎ항상 도움 많이 받습니다 감사합니다ㅎㅎ
안녕하세요. 정말 많은 도움 받고 있습니다.
질문이 있는데요. 유니티에서 참조 순서를 어떻게 정하는지 궁금합니다.
GameManager의 Awake에서 instance를 this로 할당하고
30:08 에 나왔던것 처럼, Enemy 클래스, Spawner 클래스 등에서 GameManager.instance를 사용하잖아요.
근데 만약 GameManager의 Awake 호출 전에 다른곳에서 GameManager.instance를 사용하면 Null Exception이 발생하는데
이런 순서에 대한 걱정은 어디서 찾아봐야할까요?
이와 비슷하게 스크립트간 순서에 대해 걱정할 필요가 있는지 궁금합니다.
감사합니다.
그래서 라이프사이클 순서를 고려하면서 Start 이하부터 GameManager.instance를 호출하는 것처럼 유연하게 코딩하시면 됩니다.
라이프사이클 순서는 다음 링크를 참고해주세요. cafe.naver.com/unityhub/59
@@goldmetal 감사합니다
void Update()
{
if(Input.GetButtonDown("Jump")
}
부분이 작동이 안돼서 스페이스를 눌러도 스폰이 안되는거 같습니다.
만약 플레이어 이동 입력을 Input System 패키지를 이용해 만들면 발생하는 오류일까요?
콘솔 오류메세지를 확인했을 때 그런게 원인인것 같더라고요
네 그래서 Edit > Project Settings > Player Setting > Other > Input Handler 여기서 Both로 바꿔주시면 해결됩니다. 이걸 바꾸기 전에 Scene을 먼저 저장하셔야 하니 주의바랍니다.
안녕하세요 골드메탈님 강의 잘 보고 있습니다.
다름이 아니라 27:20 쯤에서 스페이스바를 눌러도 몹이 소환되질 않습니다..
Input Manager에서 Jump의 positive button이 space로 되어있는것도 확인했고, wasd와 방향키로 플레이어를 움직이게 하는것은 됩니다.
GetKeyDown 같은 다른 함수로 진행해도 안되네요..
Debug.Log로 스페이스바가 눌릴때마다 확인하려고 했는데 누르면 로그에 뜨질 않아요
오류 메세지도 없고 분명 똑같이 따라했는데도 스페이스가 인식이 안돼서 미치겠습니다 어떤게 문제인건가요?
그리고 한가지 질문이 더 있는데 제 비주얼 스튜디오에서는 골드메탈님처럼 코드 작성할때 빨간줄이 아예 뜨지 않고, 단어들의 색깔 또한 골드메탈님과는 다릅니다.
거기에 유니티에서 제공하는 자동완성? 또한 마찬가지로 아예 안뜨고 그냥 기본 자동완성만 뜨더라구요
External Tools에서 현재 비주얼 스튜디오 버전으로 되어있는것도 확인했습니다.
이것도 어떻게 해결할 방법이 있을까요?
Spawner.cs 스크립트 컴포넌트로 추가했는지 확인해보세요.
Hierachy에 있는 Spawner의 Inspector에 Spawner.cs 스크립트 파일을 컴포넌트로 추가했는지를 말씀하시는거죠? 만약 그렇다면 했습니다.@@ChunYongCY
스크립트 에디터에 Monobehaviour가 청록색이면 정상 작돈하는겁니다.
키가 안먹힌다면 Edit > Project Settings > Player > Other > Input Handling을 Both로 바꾸어주세요
@@goldmetal 전 Monobehaviour가 흰색? 인지 살구색입니다.
두번째줄에서 Player까진 들어갔는데 Other라는 옵션은 안보입니다 혹시 몰라 Other Settings를 들어가봤는데 Input Handling은 없네요
@@goldmetal 유니티, 비주얼 스튜디오 모두 재설치를 해봐도 비주얼 스튜디오와 유니티 연동이 안되네요
검색해서 나온 방법들 전부 해봐도 안되구요
제 노트북 문제인 것 같아요
그냥.. 하나하나 다 타이핑 하겠습니다
게임매니저의 플레이어 변수에 영상과 다르게 프리팹을 할당하니 타겟의 위치가 플레이어의 위치와 상관없이 계속 (0,0)으로 고정 됩니다. 무슨 문제가 있나요?
프리펩의 Transform-Position을 가져오므로 프리펩이 가진 (0,0)으로 되는것입니다.
우리가 필요한건 현재 장면에서 돌아다니는 플레이어 게임오브젝트의 위치이므로 프리펩이 아닌 장면에 있는 플레이어를 넣으셔야 합니다.
@@goldmetal 프리팹에서 생성된 클론을 타겟으로 하는 방법은 없는건가요?
@@sugarcola 정확한 시나리오를 말씀해주셔야합니다. 지금은 프리펩으로 생성된 클론이 몬스터인데 이 몬스터가 또 다른 생성하는 클론을 따라가야한다는건지 제가 이해가 잘 안되네요
저는 비주얼 스튜디오를 사용하는데요. 함수 Awake() 함수 만들 때 private 안생기게 하는 법좀 알수 있을까요?
있어도 되긴 한다고 하지만, 매번 지우기 너무 불편해서요..
딱 맞는 해결 영상이 있습니다. ruclips.net/video/kQGZKHp51r4/видео.html
@@goldmetal 다른 분들도 불편하지 않게 꼭 좀 옵션 설정 했으면 좋겠네요. 속이 다 시원하네요. 감사합니다!
영상 잘 보고 있습니다 골드메탈님!
풀링 사용해보기 부분에서 질문이 있는데요,
실행 후에 스페이스바를 누르면 IndexOutOfRangeException이라는 오류가 뜨면서 게임창에 프리펩이 생성되지 않습니다.
해당 오류가 난 코드는 foreach (GameObject item in pools[index]) 이라는데요,
배열의 범위를 벗어났다는 것 같은데...무슨 말인지 정확히 해석이 어려워서요...
이런 오류는 어떻게 해결할 수 있을까요?
+현재 사용하고 있는 버전은 2022.3.7f1 입니다
게임매니저의 풀 매니저를 선택하시고 프리펩 넣어두셨는지 인스펙터를 확인해주세요.
@@goldmetal 아하 이부분이 문제였군요! 감사합니다!
프리펩에 넣으면 target에 들어간 player가 없어지는데 왜 그런걸까요? 프리펩 상태에서 넣을려고 하면 안 들어가고 하이어라키창에 꺼내고 넣으면 또 들어가요..
프리펩은 에셋이라서 장면에 넣어져있는 오브젝트를 가져올 수 없습니다. 그래서 프리펩이 장면에 생성하자마자 스크립트로 변수를 초기화시켜주셔야 합니다.
감사합니다!@
골드메탈님 늘 즐겨보고있는데요 혹시 몬스터가 포인트에서 나오자마자 사라지는건 어떤 오륜가요...
하이어라키에서 비활성화 되는 건지 확인이 필요하겠네요.
비활성화 된다면 몬스터가 타일맵 콜라이더와 충돌할 가능성이 있습니다.
그게 아니라면 어디 멀리 튕겨나가는 것이니 Transform 의 Position을 확인해보세요.
안녕하세요 골드메탈님 !
이번 강좌도 아주 잘 듣고 있습니다 !
한 가지 질문이 있어서 댓글 남기는데요
씬 창에서 포지션이 (0, 0, 0)인 곳에 Enemy B(검정색 Enemy)가 생성되어있는데 마우스로 선택을 해서 지우려고 해도 선택이 안되고 하이라이키 창에서도 표시가 되지 않아요
게임을 시작하여도 Enemy B(검정색 Enemy)는 그대로 생성되어 있고 움직이지도 않는데 이러한 문제는 어떻게 해결해야할까요? ㅠㅠ
하이어라키에서 오브젝트 옆에 손가락 모양이 체크되어있으면 얼리기 상태가 되고 선택되지 않는 상태가 됩니다. 한번 확인해보세요
아마 콘솔창 보시면 UnityEditor.Graphs.Edge.WakeUp () 이런 오류 있을껀데 유니티 버그라는 말들이 있네요 껏다켜면 된다고 하는데 맞나 모르겠네요;
@@DigDix3858 감사합니다 공부중이라 ai쳇봇이랑 문제 되는 부분을 1시간 넘게 찾고 있었는데 ;; 답답해서 댓글 보러 와서 해결하네요 감사합니다 껏다키니까 콘솔에 뜨던 NullReferenceException: Object reference not set to an instance of an object 이 오류까지 사라졌네요;;
근데 prefabs 드래그 해서 배열이름에 드랍할때 PoolManager 오브젝트 자물쇠로 잠궈놓고 하는 이유는 뭔가요??
프리펩을 다중 선택해서 풀 매니저의 변수에 넣어야하는데 다중선택 하게 되면 인스펙터 내용 바뀌어버리기 때문입니다
몬스터 프리팹 클론이 여러개가 나와야 하는데 하나가 여러 스폰 포인트에 순간이동해서 해결이 안됩니다 도와주세요 ㅠㅠ
일단 플레이 했을 때 에디터에 에러메세지가 나타나는지 확인해보세요.
그리고 순간이동은 Reposition이 책임지고 있으니 프리펩에서 이 스크립트만 비활성화 해보시고 테스트해보시는게 좋겠습니다.
선생님 좋은 강의 너무 감사합니다! 질문이 하나 있어서 댓글 남깁니다. 계속해서 에러가 하나 뜨는데 어떻게 해결할지를 모르겠습니다. 도와주세요.
NullReferenceException: Object reference not set to an instance of an object
UnityEditor.Graphs.Edge.WakeUp () (at :0)
이 오류 어떻게 해결하면 좋을까요..? 답변 부탁드립니다!
이 에러는 Animator 창 내부 에러입니다. Animator 창 닫아주시고
File > Save, Save Project 한 다음, Assets > ReImport All 한번 해주시면 됩니다.
안녕하세요 골드메탈님!
제가 유니티 초보라 개념적인 부분이 많이 약한데..
풀에서 빌려줬던 오브젝트를 다시 반환받는 함수는 안보이던데요
풀이 어떤 로직으로 빌려줬던 오브젝트를 다시 가져오는지 궁금합니다~~
반환은 따로 매커니즘은 없고 오브젝트가 비활성화 SetActive(false)하는 것으로 대신합니다.
이미 모든 오브젝트는 리스트에 들어가 있으므로 다음에 다시 사용할 때
비활성화된 오브젝트를 꺼내어 줄 것입니다.
안녕하세요 골드메탈님! 제가 오브젝트 풀링에 관해 제대로 이해한 게 맞는지 여쭈어보고 싶습니다!
Get() 함수의 내용이 그러니까,
foreach (GameObject item in pools[index])
{
if (!item.activeSelf)
{
select = item;
select.SetActive(true);
break;
}
}
의 경우에는 생성된 오브젝트 중 비활성화되어 있는 오브젝트(이 경우, 해당 오브젝트는 이미 생성이 되었다가 게임 시스템 상으로 비활성화된 오브젝트인가요? 그러니까, 적이 죽었다, 등의 이유로 모습이 사라지게 된 경우요.)를 찾아 활성화시키는 것이고,
if (!select)
{
select = Instantiate(prefabs[index], transform);
pools[index].Add(select);
}
return select;
의 경우에는 위에서 비활성화된 물체를 찾지 못했을 때, (이 강의의 경우, 생성된 적이 전부 살아있다. 등의 경우인가요?) 새로운 오브젝트를 생성시켜 그 오브젝트를 나타나게 한다... 그런건가요?
요컨대 몬스터처럼 무수한 수의 오브젝트가 끊임없이 생성(Instantiate)되고 파괴(Destroy)될 때, 잉여 메모리가 생기는 것을 방지하기 위해,
이미 생성된 물체를 Destroy 시키지 않고 비활성화시킨 다음, 필요할 때 그 비활성화된 오브젝트를 찾아 다시 활성화시켜서 재활용하는 방식인건가요?
네 오브젝트 풀링의 요점은 Destory를 사용하지 않고 SetActiva(false)로 비활성화만 해두고 나중에는 다시 활성화해서 재활용하는 것입니다. 이번 시간은 비활성화에 대해 다루지는 않았기 때문에 오브젝트 풀링의 기능을 모두 보여주지는 않았습니다. 차후 공격 기능이 추가되면 오브젝트 풀링의 작동을 하이어라키에서 실시간으로 확인하실 수 있어요.
@@goldmetal 감사합니다!
메탈형 reposition스크립트에서
static선언한 gamemanager안에 player 정보를 가져 올 때,
정적 데이터로 가져온 player의 position정보가 garbage되지않고 계속 남아있지 않나요?
그럼 플레이어가 계속 움직일 때마다 위치 데이터가 garbage되지않고 무한으로 쌓이나요?
아니면 gamemanager만 정적 데이터고 안에 데이터는 동적 데이터인가요??
garbage랑 데이터 관련해서 좀 헷갈리네요...
플레이어 변수는 Call by Reference 입니다. seongju0007.tistory.com/175
호출하면 변수에 저장된 플레이어 값을 가지고 오는게 아니라 연결된 장면의 플레이어 오브젝트로 접근하게 되는거죠.
그래서 메모리를 크게 차지하지 않습니다.
@@goldmetal 정보를 보고 설명을 들으니 이해가 됐습니다!!
본래 복사하여 저장된 동일한 주소의 데이터 안에서 값만 바꾸는군요!!!!
감사해요 메탈에몽!
골드메탈님!! 강의 잘 보고 있습니다.
한가지 문제점이 있는데요, 실행시켰을 때 Scene에서는 Pool에서 생성된 몹들이 모두 보이는데 Game화면에서는 보이지 않고 투명한 물체로 보입니다. 어떻게 해야 될까요...?
몬스터 프리펩에서의 스프라이트 렌더러 Order inLayer 숫자를 타일맵보다 올려주세요
@@goldmetal 올렸는데도 Scene에서는 잘 보이는데 게임화면에서만 안보이는듯 합니다...ㅠ 콜라이더 문제는 없는듯 한데 스프라이트가 보이지 않습니다.
@@jaehyunkim3551Scene에서 보이고 Game에서 압노이는 것은 스프라이트 정렬 문제 밖에 없습니다. 타일맵 렌더러의 Order in Layer를 한번 확인해보세요. 혹은 몬스터의 Z축이 0으로 되어있는지도 살펴봐주세요.
안녕하세요! 강의 보고 만들고 있는데요, 영상 보고 따라 만들었는데 enemy가 자동소환이 되지 않습니다 ㅠㅠ.. 혹시 이유를 알 수있을까요?
아래는 제가 작성한 코드 입니다
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
public class Spwaner : MonoBehaviour
{
public Transform[] spawnPoint;
float timer;
void Awake()
{
spawnPoint = GetComponentsInChildren();
}
void Update()
{
timer += Time.deltaTime;
if (timer > 0.2f) {
timer = 0;
Spawn();
}
}
void Spawn()
{
GameObject enemy = GameManger.Instance.pool.Get(Random.Range(0, 2));
enemy.transform.position = spawnPoint[Random.Range(1, spawnPoint.Length)].position;
}
}
Spawner 오브젝트 선택하시고 인스펟커 창에서 Spawn Points 배열에 소환지점 오브젝트들을 넣어두셨는지 확인해주세요.
또한 게임 플레이 시에 에디커 아래 에러 메세지가 나타나는지도 살펴봐주세요
@@goldmetal 안녕하세요. Inspector 하단의 Spawn Point는 영상에서 알려주신 것 처럼 0으로 그냥 냅뒀습니다. 그리고 진행할때 Console에서 [!]표에서 NullReferenceException: Object reference not set to an instance of an object Spwaner.Spawn () (at Assets/Undead Survivor/Code/Spwaner.cs:27)
27번째 코드는 GameObject enemy = GameManger.Instance.pool.Get(Random.Range(0, 2)); 입니다
조금 더 찾아보니, Hierarchy - GameManager인스펙터에 Player에는 Player(Player)라고 나오는데 Pool의 경우에는 None(Pool Manager)라고 나오네요? 이거 때문일까요?
해결했습니다! ㅎㅎㅎ GameManager에서 Pool Manager를 옮기는 부분을 빼먹었었네요! 골드메탈님 새해 복 많이 받으세요! 내년에도 계속 잘 부탁드립니다
13:00 에서 배열 부분은 오브젝트의 종류를 결정하고 List 부분은 배열에 해당하는 오브젝트의 수를 결정하는거 맞나요?
네 맞습니다!
몬스터 프리팹이 스포너에서 생성되자마자 사라져서 영상 몇번 째 돌려 보는데 해결이 안돼요 ㅠㅠ
몬스터의 콜라이더가 타일맵과 충돌하는지 혹은 다른 콜라이더랑 충돌해서 비활성화되는지
하이어라키에서 enemy (Clone)을 선택해서 상태를 확인해보세요.
트랜스폼의 Position으로 위치도 확인해주시면 더 좋구요
@@goldmetal 계속 확인해보니까 같은 프리팹이 여러 스포너에서 나와서 순간이동 하는것처럼 변한것 같아요ㅠㅠ
@@phm-1008 원래 랜덤하게 나타나는거라 그게 맞습니다.카메라 범위가 너무 넓게 비추면 몬스터가 뿅하고 나타나는게 보이기 때문에 어느정도 플레이어를 크게 비추거나 반대로 스폰 Point를 카메라 영역 바깥으로 빼주셔야 합니다. 근데 후자 방법은 플레이어와의 거리도 늘어나는 셈이니까 리스폰되지마자 바로 Reposition 될 수도 있으니 이 점 주의하시길 바랍니다
@@goldmetal 빠른 답변감사합니다 ♡♡
Spawn 함수 안에서 Get 함수가 호출되지 않아 NullReferenceException: Object reference not set to an instance of an object 이러한 런타임에러가 뜨는데 어떤 이유가 있을까요..?
풀 매니저 가셔서 인스펙터에서 프리펩 넣어주셨는지 확인해보세요
영상을 다 따라하고 실행을 했는데 몬스터들이 spawnPoint에서 스폰되고 바로 다른 spawnPoint로 순간이동하는것처럼 보입니다. 몬스터는 좀비랑 스켈레톤 한 마리씩 밖에 안나오고 하이너리키에서 position이 계속 순간이동 하는것처럼 바뀝니다 문제가 뭘까요
해결 했습니다
개발자 폼 미췄다
안녕하세요 골드메탈님 강좌 정말 잘 보고 있습니다. 뱀서라이크 강좌를 따라 구현중에 오류가 생겼는데요 해결방법을 몰라 댓글에 적어 봅니다. 강좌는 9번까지 완료했습니다.
오류 내용은 아래와 같습니다.
-아래-
스크립트 PoolManager에서 아래 부분 이 에러 납니다.
// 선택한 풀의 비활성화 된 게임 오브젝트에 접근
foreach (GameObject item in pools[index]) {
pools 데이터 개수보다 index가 커서 오버플로우 에러가 난 것입니다. pools초기화가 index만큼이나 되어있는지 살펴봐주세요
감사합니다❤
27:20 부분 Enemy 가 스페이스를 여러번 누르면 여러마리 생성 되는데 저는 여러번 눌러도 처음 한마리만 생기고 바로 옆이 아닌 조금 떨어진 동북쪽에 생성이 되는데 이건 뭐 때문에 그럴까요?
if문 안쪽에 GetButtonDown 잘 되어있는지 확인해보세요.
그리고 이미 랜덤 생성 위치까지 로직 구현된 상태라면 떨어져서 생성되는게 맞으므로 걱정하실 필요 없습니ㅏㄷ.
혹시 해상도에 따른 스폰 포인트 위치 고정에 대한 강의가 후에 있을까요?
또 해상도에 따른 게임 오브젝트의 크기도요!
UI에 대한건 전 강의들을 통해 배웠는데 게임 오브젝트는 어떻게 바꿔야 할지 모르겠네요
카메라 크기(Size)에 따라서는 바꿔야할 필요성이 좀 있을 수 있겠네요.
크기에 따라서 배치한 Point 그룹을 활성화 하는 벙법도 어떨까합니다.
해상도 비율에 따라 바꾸겠다면 조금 복잡할 수 있겠습니다.
강의 감사합니다. 제가 영상끝까지 다 따라해봤는데요.
스폰은 잘 되는데 잘 움직이던 몬스터들이 PC를 향해 움직이지 않는 상태가 되었습니다.
원인이 뭘까요??
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
public class Repositon : MonoBehaviour
{
Collider2D coll;
void Awake()
{
coll = GetComponent();
}
void OnTriggerExit2D(Collider2D collision)
{
if (!collision.CompareTag("Area"))
return;
Vector3 playerPos = GameManager.instance.player.transform.position;
Vector3 myPos = transform.position;
float diffx = Mathf.Abs(playerPos.x - myPos.x);
float diffy = Mathf.Abs(playerPos.y - myPos.y);
Vector3 playerDir = GameManager.instance.player.inputVec;
float dirx = playerDir.x < 0 ? -1 : 1;
float diry = playerDir.y < 0 ? -1 : 1;
switch (transform.tag) {
case "Ground":
if (diffx > diffy) {
transform.Translate(Vector3.right * dirx * 40);
}
else if (diffx < diffy) {
transform.Translate(Vector3.up * diry * 40);
}
break;
case "Enemy":
if (coll.enabled) {
transform.Translate(playerDir * 20 + new Vector3(Random.Range(-3f, 3f), Random.Range(-3f, 3f), 0f));
}
break;
}
}
}
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
public class Enemy : MonoBehaviour
{
public float speed;
public Rigidbody2D target;
bool isLive = true;
Rigidbody2D rigid;
SpriteRenderer spriter;
void Awake()
{
rigid = GetComponent();
spriter = GetComponent();
}
// Update is called once per frame
void FixedUpdate()
{
if (!isLive)
return;
Vector2 dirVec = target.position - rigid.position;
Vector2 nextVec = dirVec.normalized * speed * Time.fixedDeltaTime;
rigid.MovePosition(rigid.position + nextVec);
rigid.velocity = Vector2.zero;
}
void LateUpdate()
{
if (!isLive)
return;
spriter.flipX = target.position.x < rigid.position.x;
}
}
enemy에서 OnEnable 로직 29:48 추가해주세요.
감사합니다
코드 전부 다 따라했고 몬스터가 바깥에서 잘 소환되는데 플레이어한테서도 0.2초마다 소환됩니다
플레이어 위치에서 몬스터 소환 안 되게 하는 법 없나요?
혹시 플레이어에게도 Spawner 스크립트가 붙어있는지 확인해보셔야겠습니다.
@@goldmetal 아니요 Spawner 스크립트 안 붙어 있습니다.
Spawner point에서 플레이어한테 설정도 안 되어 있는 것 같은데
다른 놓친 거 없을까요?
@@xx-se5ip 혹시 SpawnPoint 중에서 플레이어 위치에 있는게 있는지 확인해보셔야겠군요
@@goldmetal 해결했습니다. 정말 감사합니다😃
프리팹으로 소환한 몬스터가 프리팹 총알을 발사하게 하는게 가능할까요?? 원거리 공격 몬스터를 넣고 싶은데 어떻게 하면 좋을지 모르겠습니다
이다다음의 강좌에서 배우는 플레이어가 원거리 무기로 창알을 자동으로 발사하는 것처럼 몬스터에게도 동일하게 해주시면 됩니다.
다만 총알이 플레이어에게만 통하도록 태그, 레이어를 다르게 설정해야 하고 target도 플레이어 오브젝트로 잡는다는 것만 다르겠지요.
@@goldmetal 네 해결했습니다~
너무 좋은 강의네요.
게임메니저에 public PoolManager pool; 를 추가하면
error CS0246: The type or namespace name 'PoolManager' could not be found (are you missing a using directive or an assembly reference?) 라는 오류가 뜹니다.
하이라키 창이랑 코드이름을 잘못써서 오류 났네요.
고쳤습니다!
shadow에 rigidbody2d가 없다고 콘솔창에서 계속 경고가 뜨는데 왜그럴까요.. ㅠㅠ
Shadow 에 스크립트가 붙어있으면 빼주세요
제가 조금 바꾸면서 하다 보니 타겟 설정하는 부분에서 target이 겹친다는 오류가 떠서 임의로 enemytarget을 써서
public Transform target;
public Rigidbody2D enemytarget;
이렇게 두 가지를 선언했거든요 문제가 없을까요??
어떤 에러인지 메세지 그대로 적어주시면 확인해드리겠습니다.
enemy 스크립트는 하나의 목표 대상을 따라가야하므로 target은 하나만 있는 것이 좋습니다.
아뇨 이게 아직 에러는 없는데 이대로 진행해도 되나 해서요.
이렇게 진행했을 때 나중에 무슨 오류가 난다거나 그럴까 물어봅니다.@@goldmetal
@@이영대-d8i 따라갈 타겟이 2개일 때, 어떻게 움직여지는지 따로 구현하시면 큰 문제는 없습니다.
아 네 감사합니다.@@goldmetal
실행하면 이렇게 떠요.....
MissingReferenceException: The object of type 'GameObject' has been destroyed but you are still trying to access it.
Your script should either check if it is null or you should not destroy the object.
뭔가요?
몬스터에 Destroy 함수를 사용하면 안됩니다. 스크립트를 확인해주세요
몬스터가 나오다가 거의 바로 사라지는데 이 부분은 뭐 때문에 그런걸까요?
블로그에 있는 오브젝트 풀링 코드까지 입력해놓은 상태입니다.
하이어라키에서 진짜 사라진건지 비활성화된건지부터 확인이 필요하겠네요.
일단 타일맵과 충돌해서 그런건지 몬스터의 OnTriggerEnter2D에서 Bullet 조건이 작성되어있는지도 확인해보세요.
26:51초 처럼 입력했는데 error CS1061: 'object' does not contain a definition for 'Get' and no accessible extension method 'Get' accepting a first argument of type 'object' could be found (are you missing a using directive or an assembly reference?) 라고 뜹니다
뭘 어떻게 해야하는지 모르겠습니다
게임매니저에 pool 변수가 public으로 잘 선언되었는지 확인해주세요.
이거 제가 디자인바꾸고 여러요소추가해서 스토어 출시되나요?
그럼요 가능합니다! 멋지게 만들어보세요
@@goldmetal 감사합니다! 혹시 현질요소 추가법이랑 뽑기 (캐릭터 & 무기) 추가하는것좀 알려주실수있으실까요? 부탁드려요! 또, 디자인 바꿀때 어떤 프로그램을 써야하나요?
@@Lunahypixel과금 기능은 IAP라고 부르며 유니티에서 기본적으로 패키지로 지원해주고 있습니다.
velog.io/@kimwonseop/Unity-IAP
docs.unity3d.com/kr/2021.3/Manual/UnityIAPSettingUp.html
두 자료를 참고하시면 도움이 많이 되실 겁니다.
@@goldmetal 감사합니다! 혹시 패키지 디자인하고 뽑기화면 디자인, 뽑기확률 설정 여러 스테이지 추가 등 어떻게하나요? 그리고 디스코드있으시나요? 물어볼게많이 생길것같아서요..
@@Lunahypixel 그것은 게임 기획 단계에서 나름대로 스스로 정하고 들어가는거라 게임마다 다를 수 있습니다. 제가 커뮤니티 서버를 다룰만한 시간과 능력이 안되기 때문에 디스코드는 운영하고 있지 않습니다.
GetComponentsInChildren 사용시 스크립트가 포함된 자기 자신의 Transform도 가져오니 주의가 필요할 거 같아요
네 그래서 이후 사용할 때 랜덤 시작을 0 이 아닌 1로 설정하는 것이 좋다고 영상에서도 한번 언급해드렸습니다.
32:30 에서 Point 오브젝트 추가하고 아이콘을 바꾸면 Should not be capturing when is a hotcontrol 이라는 노란색 주의 문구가 뜨고 3D 아이콘이 Sence 창에 활성화 되지 않습니다. 뭐가 문제일까요...
혹시 플레이 중이라면 끄시고 구게 아니라면 File >Save, Save Project 하신 뒤에 Assets > ReImport All 해보세요
@@goldmetal 빠른 답변 감사드립니다! 하지만 문제는 해결 되지 않았습니다. 다시 똑같은 error가 발생합니다.
@@서민욱-q2z 유니티 자체문제로 파악되며 일단 2021 버전이라면 2021.3.2f LTS 최신 버전으로 업그레이드 해보시길 바랍니다. 이전에는 꼭 프로젝트 폴더를 통째로 다른 곳에 복사해서 백업해두세요
30:33초 처럼 OnEnable에서 게임매니저를 사용하지 않고 타켓을 초기화 시키는 다른 방법도 알려주세요
Find 같은 오브젝트 찾는 함수를 사용할 수도 있긴 합니다만 비용이 비싸서 (연산량이 많음) 추천드리지 않습니다.
@@goldmetal 항상 감사합니다 :)
안녕하세요 골드메탈님 강의 넘 잘 듣고 있습니다. 염치불구 질문이 하나 있는데요 Enemy를 프리팹화 하면 자꾸 Target 이 풀리고 프리팹 Target에 Player를 넣으려고 하면 막히는데 왜그럴까요
Scene 과 Project Assets은 별개의 공간이기 때문입니다.
연극의 무대(Scene)와 창고(Assets)의 개념이라고 생각하시면 조금 이해하시기 편할거에요.
Scene 안에 있는 오브젝트끼리는 접근이 가능하지만 Asset 형태로 있는 오브젝트가 Scene에 접근할 수는 없습니다.
그래서 미리 설정해둔 변수도 프리펩으로 만들면 접근불가로 풀려버리는 것입니다.
좀 더 확장해보면 프리펩과 프리펩끼리는 접근이 가능합니다.
@@goldmetal 감사합니다~!
이해를 못하고 있다.... 그냥 따라하고만 있네..ㅠㅠ
이해를 어떻게 해야할까... 응용을 못하고 있는중.
여러 예제 강좌를 하시다보면 어느정도 유니티 툴 만지는데에 익숙해지실 겁니다. 이후에 스스로 작은 게임 프로젝트(정말 간단해야함)를 직접 제작해보세요. 크게 성장하시는 것을 느끼실 수 있습니다.
@@goldmetal 감사힙니다.ㅠ
하이어라키를 확인해보니 poolmanager 안에서 Enemy A와 B 한 개체씩만 복제되지 않고 무한 리스폰되어 사라지는 것처럼 보이는 현상이 생겼습니다. 해결방법이 있을까요?
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
public class Spwaner : MonoBehaviour
{
public Transform[] spawnPoint;
float timer;
void Awake()
{
spawnPoint = GetComponentsInChildren();
}
void Update()
{
timer += Time.deltaTime;
if (timer > 0.2f) {
timer = 0;
Spawn();
}
}
void Spawn()
{
GameObject enemy = GameManager.instance.pool.Get(Random.Range(0, 2));
enemy.transform.position = spawnPoint[Random.Range(1, spawnPoint.Length)].position;
}
}
코드는 이렇습니다!
Awake부분 제거해주시고 spawnPoints 변수는 인스펙터에서 직접 드래그드랍으로 초기화해주세요
안녕하세요 골드메탈님 현재 여기 강좌까지 따라하다가 Jump키가 인식되지 않아서 그런데.. 어떻게 해결할수있을까요? Fire 로도 해보려고 했지만 인식되지 않습니다. 디버그를 사용해서 확인해볼려고했는데 눌렀을때 로그창에 아무것도 표시되지 않더군요.. 방향키는 지금 인식을 잘하는데 왜 다른키들은 인식을 못할까요?
Input system 설치하고 2+ 강좌까지 진행하셨다면, Edit > Project Settings > Player > Other > Input Handle을 Both로 설정해주세요.
@@goldmetal 이 문제는 시뮬레이션말고 게임뷰로 하니 해결되었습니다 감사합니다.
퍼블릭이 아닌 프라이빗으로 오브젝트를 배열로 입력해서 저장하려고 하는데 어떻게 하나요.
리소스 함수를 사용하면 코드로 프리펩을 바로 부를 수 있습니다.
learnandcreate.tistory.com/753
골드메탈님 스크립트 작성 및 작동은 잘 되었는데, 왜 NullReferenceException이 뜨면서 Scene 창에서는 복사된 적의 모습이 보이는데 Game 창에서는 복사된 적의 모습이 안보일까요?
에러: NullReferenceException: Object reference not set to an instance of an object
Enemy.OnEnable () (at Assets/Undead Survivor/Scripts/Enemy.cs:38)
38번째 줄: target = GameManager.Instance.player.GetComponent();
(instance가 아닌 Instance로 저장해놓았습니다)
게임매니저에 Player에 플레이어 오브젝트로 끌어다 놓으셨는지 인스펙터 확인해보세요
@@goldmetal 게임 매니저 인스펙터에는 문제가 없는 것 같아요 + NullReferenceException은 해결 되었습니다,
@@goldmetal 실례지만 Game 창에 복사된 개체가 안보이는데 고치는 방법도 추가로 알려주실 수 있을까요
@@MOON_JW Scene 창으로 보셔서 왜 카메라 안으로 안들어오는지, 어디에 있는지 확인해보세요. 플레이어를 추적하지 않는다면 Enemy 스크립트에서 target을 초기화해주지 않아서 발생하는 문제입니다. 30:30
@@goldmetal 카메라 안에 들어오고, scene창에도 복제된 개체가 보이는데, Game창에서만 안보입니다. 자꾸 귀찮게 해서 죄송합니다.
앙 기분조아 흑흑
이 영상이랑 관련은 없지만 혹시 마우스 커서를 바꾸는 방법도 있나요?
커서 스프라이트만 있다면 File > Build Setting > Player Setting > Cursor 항목으로 설정 가능합니다
@@goldmetal Cursor 항목이 없는뎁쇼?
스크립트를 다 작성한 후 테스트를 해봤는데
UnassignedReferenceException: The variable target of Enemy has not been assigned.
You probably need to assign the target variable of the Enemy script in the inspector.
이라는 오류문장이 나옵니다..
해결할 수 있는 방법이 있을까요??
정확히 28:06 시간대부터 해결 방법 다루고 있습니다. target변수에 플레이어 오브젝트를 초기화해주지 않은 문제이니
참고 바랍니다.
오 좋다
혹시 몬스터가 한마리씩밖에 스폰이 안되는데 코드상에는 문제가 없는것같습니다... 어떤 문제가 생긴걸까요
아직 해결이 안되셨을까요? Spwaner의 인스펙터에서 각 SpawnData의 Time 데이터 확인해보세요.
안녕하세요.
혹시 PoolManager 에서도 적이 0.2초씩 계속 나오는데 왜 그럴까요? ㅋㅋ
Spawner스크립트가 PoolManager 오브젝트에도 컴포넌트로 있는건지 확인해보세요
@@goldmetal 다시 처음부터 만들어 보니깐 정상적으로 됐습니다.^^
저는 플레이어를 이동하다보면 몬스터가 눈앞에 풀링되는 경우가 생기던데 왜 이럴까요? 카메라 밖에 스폰 포인트를 뒀는데도 이러네요 ㅠㅠ 그리고 카메라가 이동하면서 타일이 생기긴하는데 기존 타일이 카메라(캐릭터)가 다 이동하기도 전에 사라지는 문제가 있습니다. 혹시 이 두 문제를 해결할 수 있는 팁 좀 주실 수 있을까요?
카메라 넓이(길이)가 20이 넘을 경우 보일 수도 있겠네요. 몬스터 생성 포인트를 중심으로부터 더 멀리 떨어뜨려보세요. 카메라가 맵 크기보다 크기 때문에 옮겨지는게 게임상에서 보일 수도 있겠으니 카메라 크기를 좀 줄여보는 것도 좋겠습니자. 이것은 픽셀 퍼펙트 카메라의 해상도를 낮춰보세요
@@goldmetal Pixel Perfect Camera의 Assets Pixels Per Unit을 20으로 올리고 Reposition.cs에서 Enemy case 의 transform.Translate에서 playerDir에 20대신 40으로 수정했더니 깔끔하게 해결됐습니다 :)
08:23 여기서 잠금을 하고 Prefabs에 적용 후 다시 잠금 해제 하는데 왜 이렇게 해야하나요??
아아아...이유를 바로 알아버렸습니다. 잠금을 해야 다른 무엇을 클릭 시 인터페이스창이 안사라지고 고정이 되는군요!
플레이어 주변 몬스터가 스폰되자 마자 사라집니다 해결할 방법이 있을까요?
하이너라키를 한번 살펴봐주세요. 몬스터 오브젝트가 활성화 되자마자 다시 비활성화 되는지 확인해보아야 합니자. 그렇다면 타일맵 혹은 플레이어가 가진 콜라이더에 충동 이벤트가 가해져서 그런거니 한번 태그 확인해보세요
@@goldmetal 플레이 누른이후 에너미 오브젝트(클론)이 나올때 비활성화하고 다시 활성화하면 그때 나온 유닛이 적용되지만(정상적으로 나옴)세로운 에너미 칸 클론은 같은현상이 반복됩니다
@@칠리콘-p3i 아뇨. 그냥 생성했을 때 자동으로 사라지는 즉시 하이어라키에도 진짜 사라지는지를 확인해보셔야 합니다. '1) 진짜 비활성화된다' '2) 콜라이더 때문에 밀려서 엄청 멀어졌다.' 이 둘 중 하나이니까요
메탈님은 어떻게 저렇게 심화된 유니티나 C# 을 배우셨어요??
이 강좌도 기초 내용이긴 하나, 저는 유니티 공식 튜토리얼을 시작으로 공부하고 구글검색으로 막힌 부분을 해결하면서 개인 작품을 많이 도전하다보니 노하우가 쌓이더라구요.
또한 저는 애초에 전공이 컴퓨터공학이라 C# 언어에 쉽게 적응할 수 있었습니다.
@@goldmetal 우와.. 대단하시네여ㅠㅠ