부트캠프/사전캠프

[내일배움 사전캠프_2025JUN12] 쉽게 배우는 모바일 게임 1주차 - 빗물 받는 르탄이 1

Young_A 2025. 6. 12. 17:19

쉽게 배우는 모바일 게임 1주차  - 빗물 받는 르탄이 시작

 

 

캐릭터이동

transform.position x //단 x는 변수가 아니므로 해당 값을 수정할 수 없다. (불러올 수는 있다.)

//position은 Vector3 형식이므로
transform.position += new Vector3(1f, 0, 0);

//C#에서 지원하는 더욱 간단한 방법
transform.position += Vector3.right * 0.05f;	//(0.05배의 속도로 이동)

 

단, 컴퓨터 사양에 따라 지원하는 프레임이 다를 수 있으므로 속도를 맞추기 위해서 Start() 메소드에

Application.targetFrameRate = 60;

 

캐릭터 이동영역 제한 및 마우스 클릭 시 반대방향 이동

캐릭터 이동영역 제한은 Update() 메소드에서 if문을 활용해 transform.position.x의 값이 제한 영역에 도달할 경우 캐릭터를 Flip 시키고 방향전환을 하면 된다. 

//캐릭터 이동영역 제한
if(transform.position.x > 2.6f)
{
    renderer.flipX = true;
    direction = -0.05f;
}

if(transform.position.x < -2.6f)
{
    renderer.flipX = false;
    direction = 0.05f;
}


캐릭터 좌우(상하)반전
은 SpriteRenderer를 이용

클래스 안에 SpriteRenderer을 선언 (renderer)

Start() 메소드 안에 renderer를 GetComponent<SpriteRenderer>();로 초기화하면 해당 스크립트가 적용된 오브젝트의 컴포넌트를 가져올 수 있다.

//class
SpriteRenderer renderer; //선언

//Start()
renderer = GetComponent<SpriteRenderer>(); //초기화

//활용예시
renderer.flipX = !renderer.flipX;

 

마우스 클릭 시 방향 전환은 스스로 먼저 찾아보라고 하셔서 해봤는데 아래와 같은 결과가 나왔다.

 

트리플악셀 시전하는 르탄이
//나의 솔루션
if (Input.GetMouseButton(0))
{
    renderer.flipX = !renderer.flipX;
    direction *= -1;
}

//강사님 솔루션
if (Input.GetMouseButtonDown(0))
{
    direction *= -1;
    renderer.flipX = !renderer.flipX;
}

 

찾아보니 마우스 입력을 받으려면

GetMouseButtonDown 마우스 버튼을 클릭했을때 true 값을 반환
GetMouseButton 마우스 버튼을 클릭하고 있는 동안에 true 값을 반환
GetMouseButtonUp 마우스 버튼을 클릭하고 있다 벗어났을때 true값을 반환

과 같은 함수를 쓸 수 있는데, 클릭하고 있는 프레임마다 방향을 변경하니 르탄이가 열정적으로 턴을 하는 거였다.

 

빗방울 구현하기

Rain Component에

Rigid 2D 추가: 물리값 설정

Circle Collider 2D 추가: 충돌값 설정

//Rain Script
private void OnCollisionEnter2D(Collision2D collision)
{
    if (collision.gameObject.name == "Ground") //Ground Object와 충돌시
    {
        Destroy(this.gameObject);	//this(rain) Object 파괴
    }
}

/*
    혹은 Tag 옵션을 활용해서
    collision.gameObject.CompareTag("Ground")
    로 구현할 수 있음.
*/

Tag 옵션은 추후 다양한 종류의 Rain을 생성할테니 그때 이용하려나? 싶음

 

빗방울 랜덤 위치 설정

//Rain Start()
float x = Random.Range(-2.4f, 2.4f);
float y = Random.Range(3.0f, 5.0f);

transform.position = new Vector3(x, y, 0);

 

빗방울 타입 랜덤 설정

//Rain Start()
int type = Random.Range(1, 4); //Random에서 최댓값은 포함되지 않고 생성됨. (1, 2, 3 만 생성)

if (type == 1)
{
    size = 0.8f;
    score = 1;
    renderer.color = new Color(100 / 255f, 100 / 255f, 1f, 1f); //0-1의 float값을 입력받으므로 255f로 나눠줌. //RGBT 값
} 
else if (type == 2)
{
    size = 1f;
    score = 2;
    renderer.color = new Color(130 / 255f, 130 / 255f, 1f, 1f);
} 
else if (type == 3)
{
    size = 1.2f;
    score = 3;
    renderer.color = new Color(150 / 255f, 150 / 255f, 1f, 1f);
}

transform.localScale = new Vector3(size, size, 0);

 

빗방울 여러개 생성하기

GameManager 빈 오브젝트 생성.

//GameManager class
public GameObject rain; //Inspector에서 Script 하위에 새로 Rain 항목 생성됨. Prefeb 넣어주기.

//Rain Object 생성
Instantiate(rain);

//반복 실행 MakeRain() 이라는 Rain Object 생성하는 함수 작성해두기
InvokeRepeating("MakeRain", 0f, 1f);    //함수이름, 최초 생성 시간(몇초후), 반복 시간

 

Prefeb이란?

일종의 틀과 같으며, 생성한 오브젝트를 Project Assets 폴더 안에 끌어놓으면 자동 생성됨


 

느낀점

역시 개발은 재밌다!

하면서 역기획서를 틈틈히 작성해야지, 가 내 계획이었는데 재밌어서 역기획서 쪽으로는 눈도 돌리지 않았다.

어젯밤에 1-2 중간까지 학습해서 학습 목표를 1-7까지로 늘렸는데 딱 알맞게 목표를 달성했다.

역기획서를 작성하지 못하긴 했지만 TIL 작성 중인 지금 40분 정도 여유가 있으니 남은 시간 + 저녁 먹고 난 후의 시간을 약간 투자해서 작성하면 괜찮을 것 같다.


내일 학습 할 것은 무엇인지

1주차 마무리하는 것이 목표.

더해서 숙제 하는 김에 시간이 남는다면 빗방울 사라지는 애니메이션을 넣고, 빌드 내보내보고 싶다.