유니티 배경과 장애물 넣고 물리엔진 적용하기

카고챵

·

2022. 7. 27. 14:45

반응형

유니티 배경과 장애물 넣고 물리엔진 적용하기

이번 포스팅에서는 저번에 만든 프로젝트에 배경을 넣고 장애물과 물리엔진 넣는 방법을 알아보겠습니다.

1. 배경 추가하기

배경으로 쓸 사진을 프로젝트에 넣고 씬으로 끌어옵니다. 그러나 이렇게 하면 기존에 넣어뒀던 오리가 보이지 않습니다.

그렇기 때문에 이미지 순서를 조정하도록 하겠습니다. 

오리 오브젝트의 인스펙터 창에서 레이어 순서를 배경의 레이어 순서보다 더 큰 숫자로 맞춰줍니다.

저는 1로 설정하겠습니다.

이렇게 오리 오브젝트가 앞으로 나오게 됩니다. 그리고 바닥도 추가해주도록 하겠습니다.

바닥의 레이어 순서는 2로 설정해주겠습니다. 바닥 오브젝트의 인스펙터에서

컴포넌트 추가 - 물리 2D - 박스 콜라이더를 선택해주세요.

그리고 오리 오브젝트를 클릭 후 인스펙터에서

컴포넌트 추가 - 물리 2D - 캡슐 콜라이더를 선택하고 추가된 캡슐 콜라이더의 방향을 가로로 설정해줍니다.

그럼 저렇게 초록색 테두리가 생길 텐데 이를 오브젝트의 모양에 맞게 조절해주겠습니다.

이후 게임을 실행해보면 오리가 바닥과 맞닿아 있는 것을 볼 수 있습니다.

2. 장애물 추가하기

이제 장애물을 추가해보도록 하겠습니다.

추가하기에 앞서 메커니즘을 간략하게 설명하자면, 두 개의 장애물이 랜덤한 위치에 생성되고

오른쪽에서 왼쪽으로 점점 이동합니다. 게임 화면을 벗어난 장애물은 렉을 방지하기 위해 삭제시킬 것입니다.

그렇다면 장애물을 계속 생성할 수 있도록 해야겠죠. 일단 장애물의 모양을 잡아주도록 하겠습니다.

장애물을 추가하고 인스펙터에서

컴포넌트 추가 - 물리 2D - 박스 콜라이더를 적용하고 크기를 알맞게 조정해줍니다.

플래피 버드는 장애물 2개가 띄워져 있기 때문에 이 장애물을 복사해주겠습니다.

복사한 후 Shift 키를 누른 상태로 움직이면 수직으로만 움직일 수 있습니다.

적당한 위치에 놓겠습니다.

이 모양이 장애물의 모양입니다. 이것을 계속 생성하기 위해 프리팹이라는 것을 만들어주도록 하겠습니다.

프리팹이란 원본을 복사하는 것이라고 할 수 있습니다. 원본 이미지를 복사하여 오브젝트로 계속 추가하는 방식이죠.

계층 구조 탭에서 우클릭 - 빈 오브젝트 생성을 눌러줍니다. 그리고 장애물 오브젝트 2개를 컨트롤을 눌러서 동시에 선택한 뒤, 빈 오브젝트 안에 넣습니다.

묶인 오브젝트(plain_obstacle)에 컴포넌트 추가 - 새 스크립트를 눌러줍니다.

스크립트에 코드를 작성하겠습니다.

{
    public float speed;
   
    void Start()
    {
        
    }


    void Update()
    {
        transform.position += Vector3.left * speed * Time.deltaTime;
    }
}

speed라는 변수를 생성하고

transform.position은 위치를 말합니다.

Vector3.left는 왼쪽 이동을 말하고, Time.deltaTime은 FPS를 보정하기 위해 사용합니다. 이걸 사용하지 않으면 컴퓨터마다

다른 FPS가 게임에 적용되어 게임이 기기마다 다르게 실행됩니다. 이를 막기 위해 Time.daltaTime을 곱해주는 것입니다.

그리고 프리팹을 만들기 위해서 생성한 빈 오브젝트를 Assets 쪽으로 드래그해 끌어와줍니다.

그럼 오브젝트의 아이콘이 파랗게 변경되었을 겁니다. 다음으로 계층 구조에서 다시 빈 오브젝트를 생성해주세요.

이 오브젝트를 프리팹을 생성하게끔 만들 것입니다. 이 오브젝트의 인스펙터 - 컴포넌트 추가 - 새 스크립트를 생성하고

코드를 작성해주겠습니다.

public GameObject (프리팹 이름); 이렇게 코드를 작성하고 유니티로 돌아가

아까 생성한 빈 오브젝트의 인스펙터 창으로 가주시면 스크립트 아래에 plain_obstacle(프리팹 이름)으로 된 변수가 생깁니다.

이곳에 Assets 안의 만들었던 프리팹을 끌어다 놓겠습니다.

이제 생성하는 코드를 짜보겠습니다.

public GameObject plain_obstacle_pre;
    public float time;
    float timer = 0;
    // Start is called before the first frame update
    void Start()
    {
        
    }

    // Update is called once per frame
    void Update()
    {
        timer += Time.deltaTime;
        if(timer > time) {
            GameObject new_obstacle = Instantiate(plain_obstacle_pre);
            new_obstacle.transform.position = new Vector3(6, Random.Range(0.0f, 4.0f), 0);
            timer = 0;
            Destroy(new_obstacle, 9.0f);
        }
       
    }

public GameObject를 통해 프리팹을 불러오고, time과 timer라는 변수를 생성해줍니다.

timer += Time.deltaTime은 timer에 계속 Time.deltaTime을 더한다는 뜻인데, Time.deltaTime은 6 FPS이면 1/6 이런식이기 때문에 어떤 기기를 사용해도 1초에 1씩 timer에 추가될 겁니다.

if 이후를 보면 timer > time 설정한 time 값보다 timer가 커진다면, 불러온 프리팹을 복제하고,

그 오브젝트의 생성 위치를 바꿔줍니다. 그 후 timer를 초기화하고, 복제된 오브젝트는 일정한 시간 뒤 삭제될 겁니다.

지금까지 배경과 장애물을 추가하고, 물리엔진을 적용해보았습니다. 다음 포스팅에서는 점수 시스템을 만들어보도록 하겠습니다.

반응형