[Bolt Into Scripts] 캐주얼 디펜스(2)

2022. 4. 19. 22:07유니티

https://github.com/Sanghun2/Bolt-Into-Scripts-CasualDefense

 

GitHub - Sanghun2/Bolt-Into-Scripts-CasualDefense: 볼트로 작성된 캐주얼 디펜스게임을 보고 스크립트로 바

볼트로 작성된 캐주얼 디펜스게임을 보고 스크립트로 바꿔서 구현한 버전. Contribute to Sanghun2/Bolt-Into-Scripts-CasualDefense development by creating an account on GitHub.

github.com

 

오늘은 카메라 이동 작업을 했습니다.

카메라를 직접 이동 시키는 것은 CameraManager.cs에서 작업했고, 카메라 이동과 별개로 패럴렉스는

BackgroundScroller.cs라는 클래스를 새로 만들어 패럴렉스를 적용시킬 오브젝트들을 따로 관리해 줬습니다.

만약 나중에 패럴렉스를 해야 할 오브젝트가 추가된다면 BackgroundScroller에서 관리를 해주면 될 것입니다.

 

<CameraManager.cs>

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

//카메라를 관리하는 클래스
public class CameraManager : MonoBehaviour
{
    [Header("카메라")]
    [SerializeField] private Camera mainCamera;

    private bool isMovable = default;
    private float cameraSpeed = default;
    private readonly float SPEED_VALUE = 2; //카메라가 이동할 때의 속도를 한 번에 관리하기 위해 상수로 만들어 줬습니다.

    private Vector3 rightVec;

    void Awake()
    {
        rightVec = Vector3.right; //Update에서 매번 vector 객체를 생성해서 할당하게 되면 가비지가 쌓여서 좋지 않기 때문에 초기화 해두고 참조해서 사용했습니다.
    }

    void Update()
    {
        if (IsMovable())
        {
            MoveCamera();
            BackgroundScroller.Instance.MoveBackground(cameraSpeed / SPEED_VALUE); //여기서 매개변수를 이렇게 전달해 준 이유는 현재값의 방향(+,-)을 알려주기 위함인데 단위값을 전달해 속도값이 바뀌어도 방향을 알 수 있도록 하기 위함입니다.
        }
    }

    //카메라 이동. by상훈
    public void MoveCamera(int dir)
    {
        if(dir == 1)
        {
            cameraSpeed += SPEED_VALUE;
        }
        else if (dir == -1)
        {
            cameraSpeed -= SPEED_VALUE;
        }
        else
        {
            Debug.LogWarning($"존재하지 않는 방향: {dir} in MoveCamera()");
        }
    }

    //카메라 정지. by상훈
    public void InitMove(int dir)
    {
        if (dir == 1)
        {
            cameraSpeed -= SPEED_VALUE;
        }
        else if (dir == -1)
        {
            cameraSpeed += SPEED_VALUE;
        }
        else
        {
            Debug.LogWarning($"존재하지 않는 방향: {dir} in MoveCamera()");
        }
    }

    //현재 이동가능한지 판별. by상훈
    bool IsMovable()
    {
        if ((mainCamera.transform.position.x <= SPEED_VALUE && cameraSpeed > 0) || (mainCamera.transform.position.x >= -SPEED_VALUE && cameraSpeed < 0))
        {
            isMovable = true;
        }
        else
        {
            isMovable = false;
        }

        return isMovable;
    }
    
    public void MoveCamera()
    {
        mainCamera.transform.position += rightVec * cameraSpeed * Time.deltaTime;
    }
}

 

<BackgroundScroller.cs>

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

//배경스크롤링을 관리하는 클래스
public class BackgroundScroller : MonoBehaviour
{
    [Header("움직일 배경")]
    [SerializeField] private ScrollInfo[] scrollInfo;

    Vector3 rightVec;

    private static BackgroundScroller instance;
    public static BackgroundScroller Instance => instance;

    void Awake()
    {
        instance = this;

        rightVec = Vector3.right;
    }

    public void MoveBackground(float unitValue)
    {
        foreach (var s in scrollInfo)
        {
        	//스크롤 정보를 가진 오브젝트의 transform에 접근해 위치값을 변경시킵니다.
            s.gameObject.transform.position += unitValue * rightVec * s.ScrollSpeed * Time.deltaTime;
        }
    }
}

 

<ScrollInfo.cs>

패럴렉스가 적용되는 오브젝트에 붙여서 정보값을 가지도록 했고, private으로 설정해 함부로 접근하지 못하게 하면서 프로퍼티로 값을 반환해 이용할 수 있도록 했습니다.

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

//배경 스크롤에 대한 정보
public class ScrollInfo : MonoBehaviour
{
    [SerializeField] private float scrollSpeed;

    public float ScrollSpeed => scrollSpeed;
}

 

이 카메라 이동 코드를 버튼에 EventTrigger에 붙여주면 끝.

이렇게 버튼으로 카메라 이동과 패럴렉스 구현을 해 보았습니다.

아래의 결과물을 보면서 포스팅 마치도록 하겠습니다. 감사합니다.