내일배움캠프 게임개발 종합반 1주차
위와 같은 게임을 완성하는 실습을 진행하는 과정을 다루는 1주차에서 다루었던 햇갈렸던 기능 및 함수를 정리하고자 한다.
함수의 지연 호출, 일정 간격 반복 호출
//GameManager.cs
void Start()
{
InvokeRepeating("MakeRain", 0f, 1f);
}
위 코드에 쓰인 InvokeRepeating 함수를 해석하면 'MakeRain 함수를 0초 후에 1초 간격으로 반복 호출한다.' 라는 의미이다.
특이사항으로는 호출의 대상이 되는 함수의 함수명을 큰따옴표("") 내부에 작성하여 호출한다는 점이다.
1주차 프로젝트에서는 위 함수를 빗물 게임오브젝트의 반복 생성에 사용하였다.
//InvokeExample.cs
Invoke("MakeRain", 0f);
Invoke 함수는 앞서 설명한 InvokeRepeat 함수를 조사하던 중 알게 된 함수로 'MakeRain 함수를 0초 후에 호출한다.' 라는 의미이다.
Invoke 함수에 반복의 속성이 추가된 함수가 바로 InvokeRepeat 함수임을 알 수 있다.
게임 오브젝트의 동적 생성
//GameManager.cs
public GameObject rain;
void MakeRain()
{
Instantiate(rain);
}
Instantiate 함수는 게임 오브젝트 rain을 동적 생성하는 함수이다. 즉, MakeRain 함수가 실행되면 게임 진행 중에 생성되게 되는 것이다. 여기서 주목할 점은 다음이다.
이 프로젝트의 Hierarchy에는 Rain 오브젝트가 존재하지 않는다.
이는 게임 오브젝트 Rain을 프리팹화 하여 함수에서 호출하여 생성하는 방법을 이용했기 때문이다.
게임 내에서 무작위 생성되는 대부분의 요소에 사용 가능하다고 느꼈다.
소수 둘째자리까지 자료형 변환
//GameManager.cs
timeTxt.text = totalTime.ToString("N2");
이 코드는 유니티를 공부하며 알게 된 몰랐던 내용으로 기억하기 위해 작성하였다.
UI의 Text에 남은 시간을 작성하기 위해 float 자료형의 시간을 string 자료형의 문자열로 형 변환을 진행해야 한다.
//GameManager.cs
totalTime -= Time.deltaTime;
하지만 위 코드를 사용하여 남은 시간을 계산하게 되면 float 자료형 totalTime에 저장된 남은 시간은 복잡한 소수가 된다.
이를 UI에 깔끔하게 표시하기 위해 "N2"를 사용하여 '소수 둘째자리까지만 문자열로 형 변환하라' 고 제어한 것이다.
public void와 void
//GameManager.cs
void MakeRain()
{
Instantiate(rain);
}
public void AddScore(int score)
{
totalScore += score;
totalScoreTxt.text = totalScore.ToString();
}
위 코드는 GameManager.cs에 사용된 함수들이다. 두 함수의 선언문에서의 눈에 띄는 차이점은 public의 유무이다.
public은 'instance를 통해 공유된 다른 스크립트에서 이 함수의 사용을 허용하겠다.' 라는 의미를 담고있다.
즉, GameManager.cs가 아닌 다른 스크립트에서의 함수 사용이 가능하다는 의미이다.
숙제 - 빨강 빗방울 만들기
- 사이즈는 `0.8`로 해주세요!
- 색은 `new Color(255 / 255.0f, 100.0f / 255.0f, 100.0f / 255.0f, 255.0f / 255.0f);` 이렇게!
위 조건을 만족하는 빨강 빗방울을 만드는 것이 숙제이다.
하지만 너무 같은 코드를 반복하는 듯 하여 임의로 조건을 수정하여 진행하였다!
- 사이즈는 `0.8`로 해주세요!
- 색은 `new Color(255 / 255.0f, 100.0f / 255.0f, 100.0f / 255.0f, 255.0f / 255.0f);` 이렇게!
- 점수는 4점!
- 추가 시간 5초!
- 빨강 빗방울은 10% 확률로 생성!
이 숙제의 경우 Rain.cs만 수정하여 진행할 수 있었다. 다음은 숙제 내용을 포함한 코드 전문이다.
// Rain.cs
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
public class Rain : MonoBehaviour
{
float size = 1.0f;
int score = 1;
float time = 0f;
SpriteRenderer renderer;
// Start is called before the first frame update
void Start()
{
renderer = GetComponent<SpriteRenderer>();
float x = Random.Range(-2.4f, 2.4f);
float y = Random.Range(3f, 5f);
transform.position = new Vector3(x, y, 0);
int type = Random.Range(1, 11);
if (type >= 1 && type <= 3)
{
size = 0.8f;
score = 1;
time = 0f;
renderer.color = new Color(100 / 255f, 100 / 255f, 1f, 1f);
}
else if (type >= 4 && type <= 6)
{
size = 1.0f;
score = 2;
time = 0f;
renderer.color = new Color(130 / 255f, 130 / 255f, 1f, 1f);
}
else if(type >= 7 && type <= 9)
{
size = 1.2f;
score = 3;
time = 0f;
renderer.color = new Color(150 / 255f, 150 / 255f, 1f, 1f);
}
else if(type == 10)
{
size = 0.8f;
score = 4;
time = 5.0f;
renderer.color = new Color(255 / 255.0f, 100.0f / 255.0f, 100.0f / 255.0f, 255.0f / 255.0f);
}
transform.localScale = new Vector3(size, size, 0);
}
// Update is called once per frame
void Update()
{
}
private void OnCollisionEnter2D(Collision2D collision)
{
if(collision.gameObject.CompareTag("Ground"))
{
Destroy(this.gameObject);
}
if (collision.gameObject.CompareTag("Player"))
{
GameManager.Instance.AddScore(score);
GameManager.Instance.AddTime(time);
Destroy(this.gameObject);
}
}
}
기존에 score 변수를 활용하여 총점을 제어한 방식을 그대로 활용하여 남은 시간을 제어하였다.
정상적으로 작동하는 모습이다.
24.04.15 Today I Learned
'Today I Learned' 카테고리의 다른 글
[TIL] 24.04.23 TIL 쓰기 특강 (0) | 2024.04.23 |
---|---|
[TIL][C#] 24.04.22 내일배움캠프 C# 문법 종합반 1주차 (0) | 2024.04.22 |
[TIL][Unity] 24.04.18 내일배움캠프 게임개발 종합반 4주차 (0) | 2024.04.18 |
[TIL][Unity] 24.04.17 내일배움캠프 게임개발 종합반 3주차 (0) | 2024.04.17 |
[TIL][Unity] 24.04.16 내일배움캠프 게임개발 종합반 2주차 (0) | 2024.04.16 |