본문 바로가기
App && Game

[유니티] 도트 게임 만들기 - 3일차 (장애물 충돌처리 / UI가 제일 위에 출력하도록 도와주는 UI 카메라 / 다른 스크립트에서 변수 가져오기 / 다른 스크립트 함수 호출하기)

by 배애앰이 좋아 2020. 12. 20.
반응형

도트 게임 기획 :

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 추가 (한글은 따로 추가해줘야해서 나중에)

 

 

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

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

 

수정 전 화면

 

이를 해결하기 위해서, 

 

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보다 크게 설정

 

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

 

수정 후 화면

 

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 로드
}

 

< 위 과정 후 결과 영상 >

 

 

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

 

받은 자료

 

다음에 해야할 일 :

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

1. 장애물 설정 (완료)

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

3. 점수 UI 제작 (예정)

4. 무기 도감 만들기

5. 캐릭터 도감 만들기

 

 

반응형

댓글