개인과제 하는 중...
오늘은 하루종일 개인과제를 진행했다. 그런김에 오늘 있던 트러블 슈팅 몇 개를 적어볼까한다
배경
점프 시 지면 충돌을 physics.CheckSphere로 감지하도록 구현했다.
발단
제대로 연결했으나 점프키를 눌렀다는 로그가 찍히지 않았다.
전개
디버깅을 해보니 isGrounded()가 항상 false를 반환했다. Raycast가 땅에 닿지 않은 것이다.
위기
플레이어를 다시보니 피봇이 플레이어 모델 중앙에 있어 땅에서 일정거리 이상 위에 있는것으로 간주된 것이었다.
절정
피봇을 플레이어의 콜라이더 하단으로 내리자 isGrounded()가 true를 올바르게 반환했다.
결말
피봇을 바닥에 가깝게 조정함으로서 지면 감지 로직이 정상 동작하고, 따라서 점프도 정상적으로 동작하게 되었다. 예전에 정말 유니티 초보일때 했던 실수인데 또 반복하는 것을 보니 난 아직도 초보 개발자라는 생각이 들었다.
상호작용 가능한 아이템을 보면 프롬프트가 뜨고, 안보면 없어지는 기능을 구현중이었다. 강의랑 똑같이 따라했는데 안돼서 지교수님의 도움을 받아 해결했다.
배경
카메라 중앙에 레이를 쏴서 interactable레이어를 가진 아이템을 바라봤을 대만 프롬프트를 띄우도록 구현했다.
발단
오브젝트를 바라보면 promptText.SetActive(true)와 false가 계속 교차되며 깜박거리는 문제가 발생했다.
전개
Update()에서 레이에 맞지 않을때를 검사하는 로직이 빠져있었고 if문 구조가 잘못되어 매 프레임마다 활성화/비활성화가 반복되었다.
아래는 수정 전 코드
if (hit.collider.gameObject != interactPrefab)
{
interactPrefab = hit.collider.gameObject;
interactable = hit.collider.GetComponent<IInteractable>();
SetPromptText();
}
else
{
interactable = null;
interactPrefab = null;
promptText.gameObject.SetActive(false);
}
절정
다음과 같이 수정 했다.
Ray ray = camera.ScreenPointToRay(new Vector3(Screen.width / 2, Screen.height / 2));
RaycastHit hit;//부딪힌 거 정보
if (Physics.Raycast(ray, out hit, maxCheckDistance, interactLayerMask))
{
var interactable = hit.collider.GetComponent<IInteractable>();
if(interactable != null )
{
if(interactable != current )
{
current = interactable;
SetPromptText();
}
return;
}
}
ClearPrompt();
결말
이제 플레이어가 오브젝트를 바라볼 때만 프롬프트가 활성화되고, 시야를 돌리면 곧바로 사라지게끔 구현이 되었다.
배경
대시 키를 누르는 동안 현재 속도를 dashSpeed로 높이고 스태미나가 계속 소모되도록 구현했다.
발단
스태미나가 0이하가 되어도 계속 대시 키를 누르는 도중이었으면 현재 속도가 여전히 대시 속도로 유지되어 무한 대시가 가능한 문제가 발생했다.
전개
스태미나 조건을 고려한 체크 부분이 부족하다고 판단해 로직을 추가하게 되었다.
절정
다음과 같이 수정하였다.
//PlayerStat.cs
private void Update()
{
//isDash가 false면 회복 / true면 소모
float delta = Time.deltaTime * (isDash ? -drainPerSecond : regenPerSecond);
curStamina = Mathf.Clamp(curStamina + delta, 0f, maxStamina);
if(isDash && curStamina <= 0f)
{
isDash = false;
}
OnStaminaChanged?.Invoke(curStamina, maxStamina);
}
public void SetDash(bool dash)
{
if(dash)
{
if(curStamina > 0f)
{
isDash = true;
}
}
else
{
isDash = false;
}
}
//PlayerController.cs
private void FixedUpdate()
{
curSpeed = stat.isDash ? dashSpeed : walkSpeed;
Move();
}
.......
public void OnDash(InputAction.CallbackContext context)
{
if (context.phase == InputActionPhase.Performed)
{
stat.SetDash(true);
}
else if (context.phase == InputActionPhase.Canceled)
{
stat.SetDash(false);
}
}
결말
스태미나가 0이하가 되면 자동으로 대시가 해제되고, 현재 속도가 걷는 속도로 돌아가 다시 대시 키를 눌러야 대시가 활성화되는 정상 동작이 구현되었다.
오늘의 목표는 필수기능 모두 구현이었는데 아이템 사용 부분에서 막혀 오늘안에 끝내지 못했다. 내일 오후에 제출이라 시간이 아직 좀 있지만... 아슬아슬하다. 오늘 자기전까지 최대한 해보고 안되면 내일 열심히 해볼까한다.
개인과제 리드미 예쁘게 작성해서 제출하고, 7시에 특강듣고, 팀원들과 수다떨며 쉬기 히히