유니티 충돌시 게임오버 - yuniti chungdolsi geim-obeo

특정 오브젝트에 주인공 유닛이 충돌하였을때 게임을 중지시킬 수 있다.

게임을 중지 시킬때 중요한 코드는 하기와 같다.

게임 역시 영화처럼 시간 개념이 있기때문에 Time.timescale = 0 으로 하면 게임씬이 정지하게 된다.

반대로 Time.timescale=1 이면 정상적인 속도로 시간이 움직인다.

Time.timescale = 2 하면 그럼 어떻게 될까? 그렇다 2배속으로 빨리 재생이 되어진다.

유니티에서 게임은 영화의 한씬처럼 생각하면 된다.

지난 시간에 이어 소방차를 활용해보자.

특정 블럭에 충돌되면 멈추어서게된다. 하기 처럼 말이다.

https://youtu.be/7Xs04chErck

유니티 충돌시 게임오버 - yuniti chungdolsi geim-obeo

지난 시간과 동일하게 

블럭 과 자동차에 동일 컴포넌트를 적용하고 하기 처럼 코드를 작성한다.

이 코드는 자동차가 특정 블럭에 충돌시 게임을 정지하는 효과를 가져다 준다.

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

26

27

28

29

30

31

32

33

34

35

36

37

38

39

40

41

42

43

using System.Collections;

using System.Collections.Generic;

using UnityEngine;

public class MoveOnRightLeft : MonoBehaviour

{

public float speed = 1;

Rigidbody2D rbody;

public string targetObject;

// Start is called before the first frame update

void Start()

{

// 게임 시작.

Time.timeScale = 2;

rbody = GetComponent<Rigidbody2D>();

// 소스상에서 중력 무시 및 Z축 회전 방지를 한다

rbody.gravityScale = 0;

rbody.constraints = RigidbodyConstraints2D.FreezeRotation;    

}

// Update is called once per frame

void FixedUpdate()

{

// 물리엔진의 속도로 X축으로 이동

rbody.velocity = new Vector2(speed, 0);        

}

private void OnCollisionEnter2D(Collision2D collision)

{

// 충돌오브젝트가 타겟 오브젝트라면.. 게임을 중지

if(collision.gameObject.name  == targetObject)

{

Time.timeScale = 0;

}

// 충돌시 방향을 바꾼다.

speed = -speed;

this.GetComponent<SpriteRenderer>().flipX = (speed < 0);

}

}

cs

OnCollisionEnter2D 함수에서 게임을 중지하기 위한 하기 코드가 중요하다.

   // 충돌오브젝트가 타겟 오브젝트라면.. 게임을 중지

        if(collision.gameObject.name  == targetObject)

        {

            Time.timeScale = 0;

        }

유니티 게임은 마치 영화의 씬과 같이 동작한다는 것이 주요하다

감사합니다. 

도트 게임 기획 :

running game - 수집형 게임 

개발 tool : unity / 그래픽 : unity asset store + BK2001님

2020.12.06 시작 - 1일차

2020.12.13 - 2일차

2020.12.19 - 3일차

저번 계획(해야할 일) :

0. 배경 찾아서 넣어주기 (선택)

1. 장애물 설정 (완료)

2. 충돌 처리 설정 (선택)

3. 점수 UI 제작 등등

장애물 종류 : 돌, 톱니바퀴, 불, 위에 돌, 바늘 총 5개 설정

1. 장애물 충돌처리하기

- 사용자가 장애물과 충돌되자마자 땅이 움직이는 것과 장애물 생성되는 것을 멈추게 설정

- 이때 충돌 감지하는 방법은 Collision 과 Trigger가 있는데 이는 다른 블로그에도 잘 정리되있으니 참고

- 아래는 Collision을 사용하였으며 Collision은 물리적인 연산을 하며 충돌을 감지한다. Collision 처리를 하려면 둘 중 하나에는 반드시 Rigidbody가 붙여져 있어야 하며, 이 Rigidbody의 Kinematic 속성이 꺼져 있어야 한다.

void OnCollisionEnter2D(Collision2D other) //충돌되자마자 아래 실행
    {
        Debug.Log("collider"); 
        print(other.gameObject.name); //충돌 객체 이름 출력
        if (other.gameObject.name == "coin") //만약 충돌 객체 이름이 coin이라면 아래 실행
        {
            print(other.gameObject.name); //충돌 객체 이름 출력
        }
        start = false; //게임이 진행 중인지 아닌지 표시해주는 bool 형 변수
        GameObject.Find("Trap").GetComponent<BlockManager>().change_start();
        GameObject.Find("Ground").GetComponent<Ground>().change_start();
        GameOver.SetActive(true); //게임 오버 화면 띄워쥐기
    }

2. 게임 오버 화면 만들어주기

- 사용자와 장애물이 충돌이 일어날 시 Game Over Scene을 뛰우면서 로비를 돌아갈지 다시 게임을 실행하게 해줄지 선택할 수 있는 버튼 추가 

- 얼마의 코인을 모았는지 표시해주는 UI 추가 (한글은 따로 추가해줘야해서 나중에)

유니티 충돌시 게임오버 - yuniti chungdolsi geim-obeo

3. 문제점 : UI 위에 그려지는 이미지 / UI가 제일 위에 출력하도록 도와주는 UI 카메라 만들기

- 이유 : UI를 World Space으로 지정하였기 때문에 새롭게 생성되는 객체들은 UI보다 나중 생성으로 표시 우선 순위가 높아져서 그렇다. 또는, World Space 상의 UI들은 Z축의 영향으로 다른 월드 스페이스 상의 오브젝트들에 의해 가려지게 된다.

유니티 충돌시 게임오버 - yuniti chungdolsi geim-obeo
수정 전 화면

이를 해결하기 위해서, 

UI 카메라를 하나를 만들어 UI가 가장 위에 출력될 수 있도록 해주는 방법을 찾았다. Main 카메라 외 새로운 UI 카메라를 추가한 뒤 Main 카메라, UI 카메라의 설정은 아래와 같이 바꾸어 주었다.

Main Camera

 1. Culling Mask에 UI를 체크 해제

UI Camera

 1. Culling Mask에 UI를 제외한 나머지 모두 해제

 2. Clear Flags를 Depth only로 변경

 3. Depth 수치를 Main Camera보다 크게 설정

이후 화면, 잘 가려져서 나오는 것을 확인할 수 있다.

유니티 충돌시 게임오버 - yuniti chungdolsi geim-obeo
수정 후 화면

3. 다른 스크립트에서 변수 가져오기 / 다른 스크립트 함수 호출하기

- 예를 들면, 사용자가 충돌했을 경우 바닥과 장애물 생성을 멈춰주기 위해 사용하였다.

start = GameObject.Find("Player").GetComponent<Player>().start; //다른 스크립트에서 해당 변수 값 가져오기
//변수 이름 = GameObject.Find("불려오고자 하는 스크립트가 붙어있는 객체 이름").GetComponent<불려오고자 하는 스크립트 이름>().불려오고 하는 스크립트 내 변수 이름;
// 이때 주의 점 변수가 지정된 스크립트에서 변수 앞에 public 붙여줘서 선언해야함.
// 예 : public bool start

GameObject.Find("Trap").GetComponent<BlockManager>().change_start(); //다른 스크립트의 함수 호출하기
//GameObject.Find("불려오고자 하는 스크립트가 붙어있는 객체 이름").GetComponent<불려오고자 하는 스크립트 이름>().불려오고 하는 스크립트 내 함수 이름;
// 이때 주의 점 변수가 지정된 스크립트에서 함수 앞에 public 붙여줘서 선언해야함.
// 예 : public void change_start()

4. 다시 시작, 다시 씬 로드

- 아래 코드를 적고 setting에서 따로 설정해줄 것이 있어 관련 자세한 글 : 88-it.tistory.com/57

using UnityEngine.SceneManagement; // Scene 매니저 추가

if(Input.GetKeyDown(KeyCode.B)) // B키를 눌렸을 때
{
	SceneManager.LoadScene(0); /// 다시 시작, 다시 Scene 로드
}

< 위 과정 후 결과 영상 >

유니티 충돌시 게임오버 - yuniti chungdolsi geim-obeo

도트 게임 리소스 담당 : BK2001님 (관련 링크)

유니티 충돌시 게임오버 - yuniti chungdolsi geim-obeo
받은 자료

다음에 해야할 일 :

0. 배경 찾아서 넣어주기 (예정)

1. 장애물 설정 (완료)

2. 충돌 처리 설정 (완료)

3. 점수 UI 제작 (예정)

4. 무기 도감 만들기

5. 캐릭터 도감 만들기