본문 바로가기
게임 개발 일지/내일배움캠프 TIL

마우스로 object 이동 / 게임 종료 로직

by 빛하_ 2023. 10. 30.

 

 

오늘의 학습 키워드

 

1. Asset 없이 Sprite에 애니메이션 부여하기

Animation의 녹화 기능을 활용해 특정 시간에 Sprite가 어떤 형태(색, 모양 등)를 가져야 하는지 지정할 수 있다.

 

 

2. 마우스 포인터로 요소 움직이기

< Logic >

1) 지금 마우스의 위치가 어디인가?

   = mouse의 좌표계를 카메라 좌표계로 바꾸고, 요소의 위치에 넣어주기

2) 마우스의 위치를 요의 위치와 동일시하기

   = 요소의 위치를 변경시키는 방법 : transform.position 과 벡터값 활용

 

void Update()
{
    Vector3 mousePos = Camera.main.ScreenToWorldPoint(Input.mousePosition);
    transform.position = new Vector3(mousePos.x, mousePos.y, 0);
}

위 코드에서는 ScreenToWorld 가 핵심 키워드!

코드 전체를 암기하기보다 키워드 중심으로 외우면 효율적이다.

 

 

3. 게임 종료시키기 / 종료 시 상황 만들기

1) 게임 종료시키기

 balloon에 square가 닿으면 게임이 종료된다. => balloon에 태그를 걸어준다.

void OnCollisionEnter2D(Collision2D coll)
{
    if (coll.gameObject.tag == "balloon")
    {
        gameManager.I.gameOver();
    }
}

 

2) 게임이 종료될 때 무슨 일이 일어나는가?

 2-1) 시간 정지 : 더 이상 새로운 요소가 발생하지 않는다. => Time.timeScale = 0.0f

 2-2) endPanel 띄우기 : endPanel.Setactive(true) 

public GameObject endPanel;

public void gameOver()
{
    Time.timeScale = 0.0f;
    endPanel.SetActive(true);
}

 

 

4. 게임종료 시 기록된 시간과 실제 기록된 시간의 차이를 없애는 방법

 * 왜 오차가 발생하는가?   

  = 게임종료 시에도 Update가 계속 이루어지고 있기 때문에 시간 기록에 오차가 발생한다.

 * 해결방법

 bool isRunning = true;  를 먼저 선언하고
 Update를 if (isRunning) 상태일 때만 가동하도록,
 그리고 void gameOver 상황에서 즉시 isRunning 을 false 로 만들면 된다.

bool isRunning = true;

void Update()
{
    if (isRunning)
    {
        alive += Time.deltaTime;
        timeTxt.text = alive.ToString("N2");
    }
}

public void gameOver()
{
    isRunning = false;
    Time.timeScale = 0.0f;
    thisScoreTxt.text = alive.ToString("N2");
    endPanel.SetActive(true);
}

이를 통해 Update()와 gameOver() 간의 시간차를 없앨 수 있다.

 

 

5. 최고 점수 기록하는 방법 (새 게임이 실행되어도 유지되도록)

PlayerPrefs 를 활용해 Unity 내에 특정 값을 계속 기록하고 저장할 수 있다.

PlayerPrefs 는 데이터를 항상 key-value 페어로 저장한다.

이는 내가 저장하고 싶은 값에 라벨을 붙여 나중에 불러올 수 있게 하는 매커니즘이다.

 

<Logic>

if 최고 점수가 없으면 : 지금 점수 = 최고 점수
else 
if 최고 점수 < 지금 점수 이면 : 지금 점수 = 최고 점수

public void gameOver()
{
    isRunning = false;
    Time.timeScale = 0.0f;
    thisScoreTxt.text = alive.ToString("N2");
    endPanel.SetActive(true);

    if (PlayerPrefs.HasKey("bestScore") == false)
    {
        PlayerPrefs.SetFloat("bestScore", alive);
    }
    else
    {
        if (PlayerPrefs.GetFloat("bestScore") < alive)
        {
            PlayerPrefs.SetFloat("bestScore", alive);
        }
    }
}

* 함수 이해하기

1) bestScore가 존재하는가?

PlayerPrefs.HasKey("bestScore") == false 이면 bestScore가 없기 때문에 지금 점수 = 최고 점수 로 기록

2) PlayerPrefs.HasKey("bestScore") == false 가 아닐 때

bestScore < alive 라면 지금 점수 = 최고점수 로 기록

 

 

Unity 기능 복습
1) rigidbody : 요소를 위에서 아래로 떨어지게 만든다.
2) collider : 다른 요소와 만나면 충돌시킨다.
3) target graphic : 특정 상황에서 해당 요소의 그래픽에 변화를 주겠다.
C# 기능 복습
1) public : 여러 곳에서 부를 수 있는 존재를 선언할 때 사용한다.
 ex) public static gameManager I; 의 뜻 : 여러 곳에서 부를 수 있는 게임매니저 I 라는 것이 있다.
(주의) gameManager를 싱글톤화 하지 않으면 viod Awake 했을 때마다 새로운 gameManager가 등장할 것.

 

 

 

오늘의 회고

Unity 게임개발 부트캠프 1일차

17조 팀원들과 팀명 정하기, 팀장 정하기, 팀 노션 작성, 계획표 작성을 했다.

게임개발 종합반 2주차 강의를 듣고 3주차로 넘어갔는데 프로젝트가 중간에 먹통이 돼서 힘들었다.

Play 버튼을 누르는 데 약간의 공포심이 생겼다. 영문 에러 창이 뜰 때 무척 당황스러웠다.

구글 검색, 질문게시판 검색 등 찾아봐도 결국 어디서 꼬인건지 직접 찾아야만 했기에..

결국 리셋시키고 처음부터 다시 했다.

교훈 : 유니티와 스크립트 그 어디에서도 오타를 내선 안 된다.. 특히 대소문자랑 부호!!

 

리셋시킨 이후로는 집중력이 조금 떨어졌다.

오늘 계획한 2주차 강의는 깔끔하게 끝내서 다행이다. 

이번 주 안으로 모든 강의를 흡수해야 해서 마음이 좀 급하다.

집중력을 올려서 공부 시간을 최대한 활용해야겠다.

 

내일 계획

오전 ) 3주차 강의 끝내기

오후 2시 ) 튜터님의 Git 특강

오후 ) 4주차 강의 도전

 

 

 

댓글