유니티

[유니티 2D] 배경 움직이기

labj 2024. 3. 10. 01:06

배경으로 사용할 Hierarchy > 3D Object > Quad를 추가합니다.

게임오브젝트의 이름을 Background로 변경합니다.

화면 사이즈에 맞추어서 크기를 변경합니다.

 

 

 배경으로 사용할 이미지를 다운 받아서 Assets 폴더에 추가합니다.

 

 

배경의 재질로 사용하기 위해서 Material 파일을 하나 만듭니다    Assets > 오른쪽 마우스 버튼 클릭 > Create > Material 선택     이름은 BgM1로 합니다.

 

 

 

 Assets>BgM1 Meterial을 선택하고 Inspector 창에서 ShaderUnit > Texture로 변경합니다.

 

 

background 이미지를 BgM1Inspector창에서 Base(RGB)에 있는 None(Texture)끌어다가 놓습니다.

이제 Background 게임오브젝트에서 사용할수 있는 Meterial이 되었습니다.

 

 

Background 게임오브젝트를 선택하고 Inspector창에서 Materials > Element0에 넣어줍니다.

Background 게임오브젝트에 배경이 적용됩니다.

 

 

Background 게임오브젝트를 선택하고 Inspector창에서 맨 아래에 있는 BgM1(Meterial)Base(RGB)Offset에 있는 X에 마우스 커서를 가져다두고 좌우 드래그하면 값이 자동으로 바뀝니다.   

Offset의 값이 바뀌면서 배경이 움직입니다.

 

 

 

Offset의 값이 바뀌면서 배경이 움직이는데 background 이미지가 반복되도록 설정되지 않아서 제대로 보이지 않습니다.

Assets폴더에서 background 이미지를 선택하고 Inspector 창에서 Wrap ModeRepeat로 변경합니다.

다시 Background 게임오브젝트의 BgM1(Meterial)Base(RGB)Offset의 값을 바뀌면 정상적으로 배경이 움직입니다.

 

 

배경을 움직이기 위해서 C# 스크립트를 추가합니다이름을 BgScroll로 변경합니다다음 코드를 추가합니다.

using System.Collections;
using System.Collections.Generic;
using UnityEngine;

public class BgScroll : MonoBehaviour
{
    private MeshRenderer render;
    public float speed;
    private float offset;

    void Start()
    {
        render = GetComponent<MeshRenderer>();
    }

    void Update()
    {
        offset = offset + Time.deltaTime * speed;
        render.material.mainTextureOffset = new Vector2(offset, 0);
    }
}

 

배경이 움직이는건 BgScroll.cs에서 speed의 값으로 움직입니다Speed+ 값이면 오른쪽으로, - 값이면 왼쪽으로 움직입니다. 0이면 멈춥니다Move.cs에서 speed를 변경하기 위해서 setSpeed() 함수를 만듭니다.

…
public class BgScroll : MonoBehaviour
{
    public float speed;
    MeshRenderer render;
    float offset;

    public void setSpeed(float speed)
    {
        this.speed = speed;
    }
…

 

Move.cs에 키보드의 화살표키를 누르거나 화면의 화살표 게임오브젝트를 누르거나 할 때의 로직이 있습니다.

유니티에서 Square 게임오브젝트에 있는 Move(Script)Background 게임오브젝트를 연결해 줍니다.   

 

…
public class Move : MonoBehaviour
{
    public bool inputUp = false;
    public bool inputDown = false;
    public bool inputRight = false;
    public bool inputLeft = false;

    public GameObject background;
…
    void Update()
    {
        …
        if (inputRight)
        {
            RightButton();
            background.GetComponent<BgScroll>().setSpeed(0.3f);
        } 
        if(inputLeft)
        {
            LeftButton();
            background.GetComponent<BgScroll>().setSpeed(-0.3f);
        }

        if(inputLeft==false && inputRight==false)
        {
            background.GetComponent<BgScroll>().setSpeed(0f);
        }
        …
        if (Input.GetKey(KeyCode.RightArrow))
        {
            RightButton();
            background.GetComponent<BgScroll>().setSpeed(0.3f);
        }
        if (Input.GetKey(KeyCode.LeftArrow))
        {
            LeftButton();
            background.GetComponent<BgScroll>().setSpeed(-0.3f);
        }

        if (!Input.GetKey(KeyCode.RightArrow) && !Input.GetKey(KeyCode.LeftArrow))
        {
            background.GetComponent<BgScroll>().setSpeed(0f);
        }
        …
    }