TIL 25.03.11 - 개인 과제 4일차

강진규·2025년 3월 11일

Today I Learned

목록 보기
28/34
post-thumbnail

오늘은 4시까지 기간이 있어서 많이는 하지 못했다.
먼저 오류를 수정하였고 어제 하려고 정했던 것들을 하기로 했다.


[ 포션이 한번에 사용되는 오류 ]

포션을 2개 이상 가지고 있을때 사용하면 2개가 한번에 사용되었다.
효과는 한번만 적용되는 것 같은데 스택만 2개가 사용되었다.

public void UseHealingPotion()
{
    isUsePotion = true;

    if (healingPotion != null && healingPotion.Available.Length > 0)
    {
        heal = healingPotion.Available[0].value;
    }

    // 체력 포션 사용 플레이어의 체력을 회복 시켜줌
    slots[0].UsePotion(healingPotion);
    CharacterManager.Instance.Player.uiItem.UseItem(healingPotion);
    CharacterManager.Instance.Player.condition.Heal(heal);

    isUsePotion = false;
}

포션을 사용하는 메서드이다.
여기서 slots의 UsePotion과 uiItem의 UseItem을 사용하였는데
두 개의 메서드에서 각각 stack을 -하고 있었다.
그래서 한번에 2개씩 사용이 된것이었다.

해당 부분을 수정해주니 다시 잘 작동하게 되었다.


[ 속도 증가 아이템 쿨타임 적용 오류 ]

회복 포션을 사용하여도 속도 증가 포션도 같이 사용이 되야되는데
회복 포션을 사용했을때 쿨타임이 같이 돌아 속도 증가 포션이 사용이 되지 않았다.

public void OnUseItem(InputAction.CallbackContext context)
{
    // 해당 키가 입력되고 조건문을 통과하면 포션 사용
    if (context.performed)
    {
        if (Keyboard.current.eKey.isPressed && !isUsePotion)
        {
            if (slots[0].stackCount > 0 && !slots[0].isCooldownActive)
            {
                UseHealingPotion();
            }
        }
        else if (Keyboard.current.rKey.isPressed && !isUsePotion)
        {
            if (slots[1].stackCount > 0 && !slots[0].isCooldownActive)
            {
                UseSpeedPotion();
            }
        }
    }
}

slots[0].isCooldownActive을 통해 쿨타임 중 사용이 안되게 조건문을 사용하였는데
속도 포션 사용 부분의 조건문을 잘못 작성하였던 것이었다.
!slots[0].isCooldownActive > !slots[1].isCooldownActive
로 수정하였고 잘 작동하게 되었다.


[ 결과창 추가 ]

클리어 존에 들어가거나 체력이 다 되어서 죽었을때 결과창을 추가했다.
플레이어의 체력에 따라 결과창의 텍스트를 바꾸어주었다.

public void ShowResult()
{
    // 결과창 텍스트 플레이어 현재체력에 따라 변경
    float playerCurHealth = condition.curHealth();

    if (playerCurHealth <= 0f)
    {
        ResultText.text = "Die";
    }
    else
    {
        ResultText.text = "Clear";
    }

    Time.timeScale = 0;
    uiResult.SetActive(true);

    float resultTime = CheckTime();
    int minutes = Mathf.FloorToInt(resultTime / 60);
    int seconds = Mathf.FloorToInt(resultTime % 60);
    timeText.text = $"{minutes:00} : {seconds:00}";
}

발생한 문제
결과창 UI도 잘나오고 버튼의 작동도 잘되는것 같은데
마우스가 안보이고 타임스케일을 0으로 했는데도 플레이어의 회전을 가능했다.

해결

public void ShowResult()
{
    // 결과창 텍스트 플레이어 현재체력에 따라 변경
    float playerCurHealth = condition.curHealth();

    if (playerCurHealth <= 0f)
    {
        ResultText.text = "Die";
    }
    else
    {
        ResultText.text = "Clear";
    }

    // 타임스케일 0 해주고 마우스 보이게함 결과창ui 띄어줌
    Time.timeScale = 0;
    Cursor.visible = true;			<< 이 부분 추가됨
    Cursor.lockState = CursorLockMode.None;
    uiResult.SetActive(true);

    float resultTime = CheckTime();
    int minutes = Mathf.FloorToInt(resultTime / 60);
    int seconds = Mathf.FloorToInt(resultTime % 60);
    timeText.text = $"{minutes:00} : {seconds:00}";
}

---------------------------------------------------------------------

private void LateUpdate()
{
    // 타임스케일 0일때는 카메라 회전 x
    if (Time.timeScale == 0) return;

    CameraRotate();
}

해당 메서드에 마우스 커서가 보이게 해주는 코드를 추가해주었다.
카메라의 회전을 타임스케일이 0일때는 하지 않도록 조건문을 추가해줘서
해당 문제를 해결했다.


[ UI 수정 ]

UI도 조금 수정을 해주었다. 인게임 화면에 타이머를 추가했고
키 입력에 대한 부분도 추가했다.


[ 줌인 줌아웃 ]

어제 작성했던 3인칭 부분에서 offset을 이용하여 줌인 줌아웃을 구현했다.
InputSystem으로 휠을 받아와서 해당 기능을 가능하게 만들었다.

public void OnZoom(InputAction.CallbackContext context)
{
    // 마우스 휠 값 받아옴 (위아래 스크롤 사용을 위해 y 값 받아옴)
    float scrollInput = context.ReadValue<Vector2>().y;
    cameraDistance -= scrollInput * zoomSpeed;

    // 줌 거리 제한
    cameraDistance = Mathf.Clamp(cameraDistance, minZoom, maxZoom);
}

마우스의 휠 스크롤은 위,아래로 되기 때문에 y 값을 받아와서 사용해주었다.
카메라의 줌 거리 제한도 추가해서 너무 작아지거나 커지지 않게 했다.


이번에도 필수 기능을 다 하고 나서 추가 기능을 조금 해보았는데
3인칭 카메라 시점은 처음부터 하는 쪽이 좀 더 편했을것같다.
생각보다 그 부분에서 시간을 많이 썼다.

추가로 진짜 오류 없이 잘 된다고 생각했는데 다음날 해보면 오류가 또 있었다.
좀 더 꼼꼼히 체크하고 구현할때도 신경 써야겠다.

3d가 2d보다 뭔가 좀 어려운 느낌이 들었지만, 처음이라서 그런거라 생각해서
앞으로 더 열심히 공부해야겠다.

0개의 댓글