[이후는 이전보다] 리마스터링 - 1

김유원·2024년 6월 11일
0

📝 24.06.11

🔗 : https://github.com/purangi/BTB_Refactor

2022년 진행했던 이후는 이전보다(Better Than Before, 약칭 BTB)의 스크립트를 일부 리팩토링 하던 도중 차라리 리마스터링이 더 낫겠다는 생각이 들었고, 새로운 프로젝트를 만들어 리마스터링을 시작했다. (24.05.31)

자소서 작성 및 지원과 병행하다보니 작업 속도가 빠르진 않지만 천천히 변경점에 대해서 작성해두려고 한다.

1. 맵 구조물 UI Button -> 2D Sprite로 변경

메인 맵의 구조물들은 UI에 속하지 않는 게임 그래픽 요소이므로 UI를 사용하는 것은 부적합하다 판단하여 변경

기존에는 UI Button에 PointerEvent 구현

HouseClick.cs

public void OnPointerEnter(PointerEventData eventData)
{
    ChangeImage();
}

public void OnPointerExit(PointerEventData eventData)
{
    BasicImage();
}

리마스터링 버전에는 2D Sprite에 Collider를 추가하여 PointerEvent 구현함

부모 클래스인 SpriteInteraction를 상속받아 ClickMethod를 재정의하여 메인 맵 요소들에 대한 함수를 구현했다.

SpriteInteraction.cs

public class SpriteInteraction : MonoBehaviour, IPointerEnterHandler, IPointerExitHandler, IPointerClickHandler
{
    public void OnPointerClick(PointerEventData eventData)
    {
        ClickMethod();
    }

    public void OnPointerEnter(PointerEventData eventData)
    {
        EnterMethod();
    }

    public void OnPointerExit(PointerEventData eventData)
    {
        ExitMethod() ;
    }
    
    protected virtual void ClickMethod()
    {

    }

    protected virtual void EnterMethod()
    {

    }

    protected virtual void ExitMethod()
    {

    }
}

MainMapSprites.cs

public class MainMapSprites : SpriteInteraction
{
    [SerializeField] SpriteRenderer spriteRenderer;

    Sprite basicSprite;
    [SerializeField] Sprite lineSprite;
    [SerializeField] Sprite exitSprite;

    [SerializeField] int spriteIndex;

    private void Start()
    {
        basicSprite = spriteRenderer.sprite;
    }

    protected override void ClickMethod()
    {
        Vector3 targetPosition = new Vector3(transform.position.x, transform.position.y, -1);
        float targetSize = 2f;

        CameraController.Instance.ZoomCamera(targetPosition, targetSize, spriteIndex);
    }

    protected override void EnterMethod()
    {
        spriteRenderer.sprite = lineSprite;
    }

    protected override void ExitMethod()
    {
        spriteRenderer.sprite = basicSprite;
    }
}

만약 Sprite 요소에 다른 클릭 이벤트를 실행하는 스크립트를 구현할 것이라면 위와 같이 SpriteInteraction 클래스를 상속받아 사용하면 된다.

2. 스프라이트 클릭 시 카메라 확대 효과 추가

BetterThanBefore

기존에는 요소 클릭 시 카메라 이동 없이 즉시 실행

BTB_Refactor

리마스터링에선 Virtual Camera 추가하여 카메라 확대 및 이동 효과 추가

CameraController.cs

public class CameraController : Singleton<CameraController>
{
    [SerializeField] CinemachineVirtualCamera zoomCamera;

    [SerializeField] float zoomSpeed;
    private Vector3 originalPosition;
    private Vector3 targetPosition;
    private float originalSize;
    private float targetSize;

    private Coroutine zoomCoroutine;

    private Vector2 minBounds;
    private Vector2 maxBounds;

    private bool isZoomed = false;
    public bool IsZoomed { get { return isZoomed; } }

    private int itemIndex = -1;

    void Start()
    {
        if (zoomCamera == null)
        {
            Debug.LogError("Virtual Camera is not assigned");
        }

        //SET original camera transform
        originalPosition = transform.position;
        originalSize = zoomCamera.m_Lens.OrthographicSize;
    }

    public void ZoomCamera(Vector3 _targetPosition, float _targetSize, int _index)
    {
        isZoomed = true;

        if (_index == itemIndex)
        {
            ResetZoom();
            return;
        }

        targetPosition = ClampPosition(_targetPosition);
        targetSize = _targetSize;
        itemIndex = _index;

        zoomCoroutine = StartCoroutine(Zoom());
    }

    public void ResetZoom()
    {
        isZoomed = false;

        targetPosition = originalPosition;
        targetSize = originalSize;
        itemIndex = -1;

        if (zoomCoroutine != null)
        {
            StopCoroutine(zoomCoroutine);
        }

        zoomCoroutine = StartCoroutine(Zoom());
    }

    private IEnumerator Zoom()
    {
        Transform cameraTransform = zoomCamera.transform;

        //position move until target
        while (Vector3.Distance(cameraTransform.position, targetPosition) > 0.1f || Mathf.Abs(zoomCamera.m_Lens.OrthographicSize - targetSize) > 0.1f)
        {
            cameraTransform.position = Vector3.Lerp(cameraTransform.position, targetPosition, zoomSpeed * Time.deltaTime);
            zoomCamera.m_Lens.OrthographicSize = Mathf.Lerp(zoomCamera.m_Lens.OrthographicSize, targetSize, zoomSpeed * Time.deltaTime);

            yield return null;
        }

        cameraTransform.position = targetPosition;
        zoomCamera.m_Lens.OrthographicSize = targetSize;
    }

    private Vector3 ClampPosition(Vector3 position) //Limit the Position
    {
        SetClampBounds();

        float clampedX = Mathf.Clamp(position.x, minBounds.x, maxBounds.x);
        float clampedY = Mathf.Clamp(position.y, minBounds.y, maxBounds.y);

        return new Vector3(clampedX, clampedY, position.z);
    }

    private void SetClampBounds() // SET by SceneIndex
    {
        Scene currentScene = SceneManager.GetActiveScene();

        switch (currentScene.buildIndex)
        {
            case 0: //MainScene
                minBounds = new Vector2(-5.4f, -3f);
                maxBounds = new Vector2(5.4f, 3f);
                break;
        }
    }

}

카메라 컨트롤러 스크립트를 추가하여 카메라 확대 및 초기화, 이동 최대&최소 범위 제한 등의 기능을 구현하였습니다.

추가할 요소 - 카메라 확대 시 입장하기 버튼 활성화하여 각 인재 방 방문 기능 필요

profile
개발 공부 블로그

0개의 댓글

관련 채용 정보