
오늘은 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도 조금 수정을 해주었다. 인게임 화면에 타이머를 추가했고
키 입력에 대한 부분도 추가했다.

어제 작성했던 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보다 뭔가 좀 어려운 느낌이 들었지만, 처음이라서 그런거라 생각해서
앞으로 더 열심히 공부해야겠다.