월 15,400원
5개월 할부 시다른 수강생들이 자주 물어보는 질문이 궁금하신가요?
- 미해결유니티(Unity)로 시작하는 게임개발: Part 3. 슈팅게임 개발
2분 44초 왜 void 함수를 써야하나욤..?
제가 알기로 void는 값을 출력하지 않는 함수로 알고 있는데요 왜 public void sethp인지 궁금합니다!!
- 미해결유니티(Unity)로 시작하는 게임개발: Part 3. 슈팅게임 개발
해당 부분 업데이트
안녕하세요 혹시 광고추가 강의를 업데이트 해주시면 안될까요? 유니티쪽에서 이 부분을 업데이트 해서 유니티 홈페이지에 있는 예시 코드도 다르고 비슷한 부분에서 혼자서 추가를 해서 실행해 봤는데 광고는 뜨지만 광고를 닫은 뒤에 처리될 부분이 작동을 안합니다 다신규 함수의 이름은 OnUnityAdsShowComplete() 입니다다여기서 뭔가 추가를 해봐도 안됩니다
- 미해결유니티(Unity)로 시작하는 게임개발: Part 3. 슈팅게임 개발
인터페이스를 쓰는 근본적인 이유
안녕하세요 강사님 강의를 듣다가 의문이 생겼습니다 약간 혹은 상당히 일반적인 질문이 될 것 같은데요 왜 인터페이스를 써서 Complete()이라는 함수를 PlayerScript에서 구현을 해야 하는 건가요? 강사님 설명을 듣고 이해는 됐는데 다른 한쪽으로는 그냥 저 Complete()라는 함수를 바로 PlayerScript 클래스에 구현을 해주면 안되는건가요? 아니면 기능별로 클래스를 나눠야 한다는 OOP의 기본 개념 때문에 쓰는 건가요?
- 미해결유니티(Unity)로 시작하는 게임개발: Part 3. 슈팅게임 개발
오류
강의를 따라서 SimpleInput 플러그인을 PlayerScript에 집어 넣는 부분을 해봤는데 뭔가 이상합니다 Public string Axis_Horizontal = "Horizontal"; public string Axis_Vertical = "Vertical"; Float x = SimpleInput.GetAxisRaw(Axis_Horizontal); Float y = SimpleInput.GetAxisRaw(Axis_Vertical); 이렇게 썼는데요 게임상에서는 x는 변수에는 x/y값의 양수 인풋이 한번에 들어오고 Y 변수에는 x/y 값의 음수 인풋이 한번에 들어옵니다 그래서 그냥 GetAxisRaw의 파라미터에 스트링 변수가 아니라 "Vertical"이런식으로 바로 스트링을 넣어주니까 제대로 동작을 합니다 강사님 방식이 왜 작동을 안하는지 이해가 안갑니다
- 미해결유니티(Unity)로 시작하는 게임개발: Part 3. 슈팅게임 개발
실질적으로 적이 파괴되는 코드
안녕하세요 이 강의에서 보여주신 변경사항에 대해서 제가 잘 이해한건지 확인 부탁드립니다 해당 강의에서 보여주신 내용은 HP가 0이 되기도 전에 적 게임 오브젝트가 파괴되어버리는 문제를 고치는 거잖아요? 그 해결책은 HP가 0이 되고 나서 파괴가 이뤄지는 부분 사이에 어느정도의 시간차를 두는 거로 보입니다 그래서 Enemy, Asteroid, Boss에서 각각 DestroyGameObejct() 함수를 수정하는 걸 보여주셨고요 수정 방향은 shotScript에서 호출되는 해당 함수에서 게임 오브젝트가 바로 파괴 되는게 아니라, 해당 함수가 호출되면, 각 Enemy, Asteroid, Boss 클래스로 가서 플래그가 바뀌고 Update내부에서 타이머 로직이 동작한 다음에, 타이머가 지정된 시간에 도달하면 Update()내부에서 비로소 게임 오브젝트가 파괴되도록 한거로 보입니다 다제가 이해한게 맞나요?
- 미해결유니티(Unity)로 시작하는 게임개발: Part 3. 슈팅게임 개발
HP바 위치가 바뀌는 이유
운석의 HP바 위치를 수정하실 때, Awake()에서의 위치랑 Start(), init()에서의 위치가 달랐는데 어째서 바뀌건가요?
- 미해결유니티(Unity)로 시작하는 게임개발: Part 3. 슈팅게임 개발
강의 마지막 부분의 설명
강의 마지막 부분에서 나오는 설명 말인데요 "아래의 코드는 확장이 쉽습니다. 다른 사운드가 있을 경우 하나의 오디오 소스를 가지고 백그라운드 뮤직을 재생하는 것 처럼 공통으로 사용이 가능합니다." 말이 생략이 많이 된 것 같아서 구제척으로 여쭤보고 싶어서요 "하나의 오디오 소스를 가지고 공통으로 사용한다"라는게 예를 들어 폭발에 대한 오디오 파일이 여러가지면 audioSource[2] 하나를 가지고 폭발에 대한 오디오 파일 여러가지를 바꿔가면서 재생한다는 건가요?
- 미해결유니티(Unity)로 시작하는 게임개발: Part 3. 슈팅게임 개발
1:58 경의 설명
1:58 에서 설명 하시는 부분이 이해가 잘 안됩니다 주황색으로 표기하신 audioSource랑 노란색으로 표기하신 audioSource 각각이 구체적으로 뭘 말씀하시는 건가요?
- 미해결유니티(Unity)로 시작하는 게임개발: Part 3. 슈팅게임 개발
코드스타일 문의
안녕하세요. 코드스타일(?)관련 문의를 드립니다.공부하던 도중 업데이트함수를 아래와 같이, 강의교안과 다르게 작성해보았습니다.메모리 구조 관련하여 강의교안처럼 newX, newY를 따로 만드는 것이 좋은지, 아니면 그냥 아래처럼 써도 되는건지 모르겠습니다. using System.Collections; using System.Collections.Generic; using UnityEngine; public class PlayerScript : MonoBehaviour { public float speed = 5; Vector3 min, max; Vector2 colSize; Vector2 chrSize; void Start() { min = Camera.main.ViewportToWorldPoint(new Vector3(0, 0, 0)); max = Camera.main.ViewportToWorldPoint(new Vector3(1, 1, 0)); print("min: " + min + ", max: " + max); colSize = GetComponent<BoxCollider2D>().size; chrSize = new Vector2(colSize.x / 2, colSize.y / 2); print(chrSize); } void Update() { float x = Input.GetAxisRaw("Horizontal"); float y = Input.GetAxisRaw("Vertical"); Vector3 dir = new Vector3(x, y, 0).normalized; transform.position += dir * Time.deltaTime * speed; if(transform.position.x < min.x + chrSize.x) { transform.position = new Vector3(min.x + chrSize.x, transform.position.y, transform.position.z); } if (transform.position.x > max.x - chrSize.x) { transform.position = new Vector3(max.x - chrSize.x, transform.position.y, transform.position.z); } if (transform.position.y < min.y + chrSize.y) { transform.position = new Vector3(transform.position.x, min.y + chrSize.y, transform.position.z); } if (transform.position.y > max.y - chrSize.y) { transform.position = new Vector3(transform.position.x, max.y - chrSize.y, transform.position.z); } } }
- 미해결유니티(Unity)로 시작하는 게임개발: Part 3. 슈팅게임 개발
단위를 정할 때 3으로 나누는 이유
단위 문자를 정할 떄 3을 가지고 나누는 이유가 서양에서 숫자 3자리마다 쉼표를 찍는것과 연관이 있나요?
- 미해결유니티(Unity)로 시작하는 게임개발: Part 3. 슈팅게임 개발
소행성의 HP UI 위치가 리셋 됩니다
강의 따라서 똑같이 코드를 넣었는데 이상하게 소행성 프리펩에서 UI 위치 잡아 둔게 적용이 안되고 생성만 되면 UI의 위치가 (0,0,0) 이렇게 됩니다 현재는 오리진 좌표를 얻는 부분에다가 임의로 Vector3()를 더해주는 걸로 해결 했는데 왜 이러는지 도대체 이해가 안됩니다
- 미해결유니티(Unity)로 시작하는 게임개발: Part 3. 슈팅게임 개발
보스의 HP 바를 초기화 두번 시켜주는 이유
안녕하세요 보스의 HP바의 스케일을 왜 Init()과 Start()에서 각 각 총 두번 초기화를 시켜주는 건가요? GameManager.cs에서 보스가 생성 되는 과정에서 보면 Instantiate를 하고, 그 다음에 Init()을 호출 하는데 보스가 생성 되자 마자(Instantiate()) BossScript의 Start()가 호출 될 것이고 곧이어 Init()이 호출이 되는데 어째서 두번 초기화 시켜주는건지 궁금합니다
- 미해결유니티(Unity)로 시작하는 게임개발: Part 3. 슈팅게임 개발
Asteroid에는 엑셀 파일은 쓰지 않는게 좋다는 이유
강의 초반에, 엑셀 파일의 장단점 설명 하시다가 Asteoid에는 쓰지 않는게 좋다고 하시면서 그 이유가 구조가 독립되어 있다고 하셨는데 이게 무슨 말씀인가요?
- 미해결유니티(Unity)로 시작하는 게임개발: Part 3. 슈팅게임 개발
제대로 이해한건지 확인 부탁드립니다
안녕하세요!이해를 한 것 같은데 조금 헷갈리는 부분이 있어서, 확인을 부탁드려요 강의 중반부에 GameManager에서 적을 생성하는 부분을 수정할 때, EnemyScript enemyPrefabScript = tr.GetComponent<EnemyScript>() ..... GameObjec enemyObj = ... ... EnemyScript enemyScript = enemyObj.GetComponent<EnemyScript>() 이렇게 나오는 부분에서 처음에 나온 EnemyScript랑 두번째 나온 EnemyScript는 다른 인스턴스에서 나온거죠? 예전 강의에서, 프리펩은 유니티 엔진만을 사용해서, 클래스 같은 걸 만들어 둔거라고 하셨잖아요 그리고 이부분에서 프리펩을 적 웨이브의 도안으로 사용하고 계시고요 처음에 나온 EnemyScript는 프리펩에서 적 타입을 읽어오기 위한 거지 실제로 게임에서 인스턴스화 되는 EnemyScript 클래스가 아니죠? 두번째로 나온 EnemyScript야 말로, 첫번째 EnemyScript로 만든 실제 EnemyScript 인스턴스에 부착된 EnemyScript인거죠?
- 미해결유니티(Unity)로 시작하는 게임개발: Part 3. 슈팅게임 개발
Serializable 사용 이유
다른 강의들에서 보긴 했는데 아직까지 Serializable, Serialzed Field 같은 것의 정확한 용도와 목적을 모르겠습니다 강의에서 강사님께서, 인스펙터에서 해당 필드들을 보기 위함이라고 하셨는데 public으로 해도 인스펙터에 나오지 않나요? 그리고, 제가 처음 c#을 배울때, private, public 같은 접근 제한자에 대해서 가진 인상이, public을 써서 보여주는건 안좋은거다 이런거라 아직가지도 변수들을 public으로 정할 때, 좀 어색합니다 혹시 이 부분에 대해서 조언을 해주실 수 있을까요?
- 해결됨유니티(Unity)로 시작하는 게임개발: Part 3. 슈팅게임 개발
버그를 찾아서 해결을 했는데 이해가 안됩니다
안녕하세요! 강의를 따라하면서, 테스트를 해보는데 버그 2개를 찾아냈습니다 일단, 버그 발생 원인은 저의 오타 때문이었구요 그런데 그 버그 증상이 이해가 잘 가서 혹시 설명을 부탁드려도 될지 궁금해서요 첫번째 버그는 이렇습니다 ShotScriptEnemy.cs의 DestroyGameObject()에서 실수로 ObjectPoolManager.instance.playerShot.Create()를 넣어버렸습니다 적의 탄환이 아니라 플레이어의 탄환을 숨겨버리게 된거죠 증상이 좀 많이 황상한데요 플레이어로 탄환을 발사를 잘 하다가 어느 시점에 가면, 스페이스바를 누르면, 플레이어 우주선 바로 앞에(shotPosition) 적 탄환이 나타납니다 PlayerScript.cs에서 탄환 프리팹을 생성하고 PlayerShot.cs 접근을 하려는데 당연히 적 탄환이 생성되어 버렸으니 해당 스크립트가 없어서 NullReferenceException이 발생합니다 위의 오타를 발견하기 전까지 10번은 확인했는데 인스펙터에서 Player랑 Enemy들에 적용해준 프리펩들이 얽힌건 전혀 없더라고요 도대체 어떻게 전혀 상관도 없는 프리펩이 생성된건지 궁금합니다 두번째 버그는 이렇습니다 적들이 쏘는 탄환이 어느 순간부터 가끔씩, 왼쪽 끝에 도달 하기도 전에 사라집니다 버그의 원인은 PlayerScript.cs에서 적 탄환을 플레이어가 맞았을때, 그리고 EnemyShotScript.cs에서 적 탄환이 플레이어와 충돌 했을때 각각 한번씩, 총 두번 DestroyGameObeject()함수가 호출 됐더라고요 이건 제가 원인을 생각을 해봤는데 오브젝트 풀에, 적 탄환 a가 생성이 되고 화면 끝에 도달을 하건, 플레이어와 충돌을 하건해서 사라지게 됩니다 그런데 사라지게 하는 함수가 2번 호출 된거죠. 문제는 이 오브젝트가 사라지면서 SetActive(false)가 되는 겁니다 그래서 두번째 호출된게 나중에 a 탄환이 다시 나타날 때, 뒤 늦게 적용된게 아닐까요? 바로 사라지지 않는건...... 유니티의 작업 사이클 때문이고요 혹시 실험 해보시고 의견을 알려주실 수 있을까요?
- 해결됨유니티(Unity)로 시작하는 게임개발: Part 3. 슈팅게임 개발
제대로 이해한건지 확인 부탁 드립니다
안녕하세요두가지 질문이 있습니다 첫번째는 제가 제대로 이해를 한건지 확인부탁드립니다 오브젝트풀을 적용하고, 적을 파괴할 때는 ObjectPoolManager.instance.Pool_Asteroid.Destroy(collision.gameObject); Asteroid를 파괴할 때와는 다르게 Enemy enemy = collision.GetComponent<Enemy>(); enemy.GetDestroyed(); 직접 해당 게임 오브젝트속에 있는 Enemy Class에 들어가서 파괴하는 함수를 불렀잖아요 Enemy종류가 여러가지 임에 따라 오브젝트 풀도 여러가지이고, 앞에서 Enemy를 생성할 때는, type이라는 변수를 통해서 특정 Enemy의 오브젝트 풀에 일일이 들어가야 했죠. 하지만 Enemy가 파괴되는 곳은 Player클래스고 type이라는 변수를 가져와서 ObjectPoolManager 클래스에 들어가는 것 보다는 그냥 바로 Enemy에 들어가서 파괴하는 함수를 불러오는게 편해서 이렇게 하신게 맞나요?
- 미해결유니티(Unity)로 시작하는 게임개발: Part 3. 슈팅게임 개발
버그가 되는 이유
안녕하세요 지금 설명하시는 부분이 버그인 이유와 벌어지는 이유가 맞는지 확인 부탁 드립니다 현재 버그는 적, 운석 게임 오브젝트가 만들어졌지만 아직 화면속에 나타나질 않았을 시점에, 그 오브젝트를 쏴서 부숴버리는 경우를 말씀 하시는 거죠? Destroy()야 playerShot에서 호출 되는 거니까 맞추는 데로, 게임 오브젝트가 부숴지는 건 실행이 되겠지만 OnbecameInvisible은 본래 보였던게 안보여야하는건데, 부숴지는 시점에 어직 보여지지도 않기 때문에 실행이 안되는 게 맞나요? 더불어 남아있는 적 카운터도 작동을 하지 않는 거구요?
- 해결됨유니티(Unity)로 시작하는 게임개발: Part 3. 슈팅게임 개발
scene 로드 후 missing
안녕하세요 강의를 따라하던 도중에, 강의에서 나온 것과 다른 증상이 나타나서 질문을 드립니다 증상은 이렇습니다 플레이어가 죽거나, 스테이지를 클리어 한 뒤, Retry나 Next Stage 버튼을 눌러서 Scene이 로드 되면, GameManager에 연결 되어야 하는 UI 들이 전부 Missing으로 나타납니다 더군다나, 그 다음 스테이지에서 적들도 나오지 않습니다 이유와 해결책을 알 수 있을까요?
- 해결됨유니티(Unity)로 시작하는 게임개발: Part 3. 슈팅게임 개발
좋은 코드
안녕하세요 강사님 원론적인 질문이 될 것 같은데요 해당 강의에서 구현 하신 건, 요역하자면, 플레이어가 죽고, 파괴 애니메이션을 보여주기 위해서 게임오버ui가 나타나기전에 약간의 딜레이를 추가 하는 거였잖아요 그 방법이 3가지가 있을거라고 하시면서 For 루프 Invoke coroutine을 말씀하셨는데 저는 invoke는 몰랐었기에, 생각을 못 했고 For는 초반부에 타이머를 만드는 것과 같은 방식으로 구현 하실 테고 Coroutine이야 불러줄 함수를 coroutine으로 만들어 주면 될거라 생각을 했습니다 이렇게, 같은 결과가 도출이 되는 여러가지 코드가 있을 경우 어떤 코드가 보다 좋은 코드인지 어떻게 결정을 하나요?