-
[TIL] Unity로 2D 게임 만들기 과제게임 기획/내일배움캠프 2025. 4. 8. 14:22
Scripts
빗방울이 바닥(Ground로 태그 설정)이나 캐릭터(Player로 태그 설정)와 충돌하면 사라지게 하기.
private void OnCollisionEnter2D(Collision2D collision) { if (collision.gameObject.CompareTag("Ground")) { Destroy(this.gameObject); } if(collision.gameObject.CompareTag("Player")) { GameManager.Instance.AddScore(score); Destroy(this.gameObject); } }
타입별 속도 설정
게임의 재미를 위해 빗방울마다 랜덤한 속도로 떨어지게끔 설정하고 싶었다.
float fallspeed 설정 후 타입별로 적용하면 같은 타입마다 지정 된 속도로 떨어지게끔 설정 가능!!
public class Rain : MonoBehaviour { float size = 1.0f; int score = 1; float fallspeed = 2.0f; SpriteRenderer renderer; Rigidbody2D rb; // Start is called before the first frame update void Start() { renderer = GetComponent<SpriteRenderer>(); rb = GetComponent<Rigidbody2D>(); float x = Random.Range(-2.4f, 2.4f); float y = Random.Range(3.0f, 5.0f); transform.position = new Vector3(x, y, 0); int type = Random.Range(1, 4); // 최댓값인 4는 포함 안 됨. 1~3을 뽑고 싶으면 4까지 적어주기 if (type == 1) { size = 0.8f; score = 1; fallspeed = 2f; renderer.color = new Color(100 / 255f, 100 / 255f, 1f, 1f); } else if (type == 2) { size = 1.0f; score = 2; fallspeed = 3f; renderer.color = new Color(130 / 255f, 130 / 255f, 1f, 1f); } else if (type == 3) { size = 1.2f; score = 3; fallspeed = 4f; renderer.color = new Color(150 / 255f, 150 / 255f, 1f, 1f); } transform.localScale = new Vector3(size, size, 0); rb.velocity = Vector2.down * fallspeed; }
그치만 타입에 관계없이 랜덤한 속도로 떨어지게 설정하고 싶어서 타입별 코드는 건들지 않고 마지막에 random range를 설정해 랜덤으로 떨어질 수 있게끔 설정했다.
public class Rain : MonoBehaviour { float fallspeed; SpriteRenderer renderer; Rigidbody2D rb; void Start() { renderer = GetComponent<SpriteRenderer>(); rb = GetComponent<Rigidbody2D>(); fallspeed = Random.Range(1.0f, 4.0f); // 떨어지는 속도 랜덤 설정 rb.velocity = Vector2.down * fallspeed; } }
Layer
빨간 빗방울과 파란 빗방울이 같은 공간에서 생성되어도 서로 튕겨져 나가지 않도록 하고싶어 레이어 설정을 알아봤다.
Edit > Project Settings > Tags and Layers에서 레이어를 생성해준다.
Physics 2D에서 만든 레이어들이 겹쳐지는 부분을 체크 해제!
Inspector창에서 원하는 개체에 레이어를 설정해주면
원래는 같은 공간에서 생성되면 서로 튕겨져 나와 뭔가 어색했는데 자연스레 두 빗방울이 겹쳐서 생성된다오류 수정
RedRain(패널티 빗방울)을 추가하는 과제를 진행하면서 구현, 마이너스 점수 부여 까지는 성공적으로 코딩했는데 다시 시작 버튼을 눌렀더니 빨간 빗방울만 재실행 되지 않는 오류가 생겼다.
튜터님이랑 수정해 다시 구현을 성공시켰는데 그 과정에서 배운 코드 2줄이 있어 정리해보겠다.
DontDestroyOnLoad(gameObject);
다시 시작 버튼을 눌렀을 때 콘솔 창에서 RedRain이 지정되지 않았다는 오류가 발생했다. 첫 번째 플레이에는 실행이 되는데 다시 시작을 했을 때 실행되지 않는거라 해당 코드를 입력해보았다.
해당 코드를 입력하니 다시 시작을 했을 때 빗방울이 생성되는 것을 확인했다. 다만 생성만 되고 바닥으로 떨어지지 않는 오류가 발생했다.
1. 튜터님이 이 코드를 알려주신 이유는 새로운 씬을 불러왔을 때 RedRain이 사라지지 않도록 오브젝트를 유지하기 위해 사용한 것이었다. 실제로 빗방울이 화면 상단에 생성되는 것까지는 성공했다. 씬이 변경 되어도 오브젝트는 파괴되지 않도록 도와주는 코드였다.
2. 다만 이 코드는 GameManager가 다음 씬까지 유지되게 해주는 것이기 때문에 Awake()나 Start()가 다시 실행되지 않는다고 한다. 그렇기에 InvokeRepeating 역시 다시 실행되지 않아 씬 자체는 초기로 돌아갔지만 빗방울이 떨어지지 않는 것이었다.
이 코드가 해결방법이 아니었기에 삭제 후 새로운 방법을 찾아봤다.SceneManager.LoadScene(SceneManager.GetActiveScene().name);
이 코드를 사용하고 오류가 수정되었다.
1. SceneManager.LoadScene()은 씬을 전환하거나 새로 로딩 할 때 사용하는 함수
2. GetActiveScene().name은 현재 열려있는 씬의 이름을 가져와주는 기능을 한다.
즉 2번을 1번 함수에 넣게 되면 현재 씬을 다시 로드 해주게 된다!
저번 시간에도 RetryButton에서 로드씬 이름을 다르게 설정해 재실행이 되지 않는 오류를 겪었었는데 이 과정에서 문제가 생긴 것인지 제대로 이름을 넣었는데도 RedRain까지는 구현이 안 되었던 것 같다.
아예 현재 열려있는 씬을 불러와주는 기능을 사용하니 오류 없이 실행 되는 것을 확인했다.오류가 수정되고 정상적으로 실행됐다고 좋아하는 나를 보시더니 튜터님께서 실행된 것에 기뻐하는 것보다는 어떤 방식으로 오류가 수정된 것인지에 대해 알아야 한다고 하셨다. 그래서 설명해주시는 것을 들었더니 조급함이 사라지고 오류를 수정하는 과정에서 배울게 많다는 것을 다시 한 번 깨달았다. 다음 주차 수업을 들으며 적어도 똑같은 오류는 생기지 않도록 코드를 짜봐야겠다!!
참고로 과제를 다 마친 후 과제 힌트를 보니 기존 Rain.cs 파일에 빨간 빗방울로 점수랑 색상 추가해 타입만 하나 더 추가하면 되는거였다. 아주 어렵게 돌아돌아 완성했지만 그 과정에서 많이 배운걸로 만족해야겠다 ㅎ,,
'게임 기획 > 내일배움캠프' 카테고리의 다른 글
[TIL] 고양이 밥 주기 게임 (1) 2025.04.10 [TIL] 풍선을 지켜라 2D 게임 만들기 (0) 2025.04.09 [TIL] Unity로 2D 게임 만들기 (0) 2025.04.07 [TIL] C# 사전문법 기초 (연산자, 조건문) (0) 2025.04.03 [TIL] C# 사전문법 기초 (데이터 다루기) (0) 2025.04.03