[Unity] Project. fall_6

Lingtea_luv·2025년 5월 7일

Project

목록 보기
16/38
post-thumbnail

Project. fall


5/7 작업 내역

  1. 잡기 기능, 기믹 추가
  2. 버그, 이슈 픽스
  3. 빌드 세팅 점검, 빌드 이후 버그 픽스

버그,이슈 내역

  1. 카메라 이동 구현 과정에서 마우스를 위아래로 과도하게 움직일 경우 화면이 반전되는 현상

원인 : 상한, 하한선을 정하지 않고, 마우스의 이동에 비례한 값이 카메라 회전에 적용되어 일정 각도 이상 돌아갈 경우 카메라가 반전되는 것

해결 : Mathf.Clamp로 회전각의 상한, 하한선을 설정하여 해결

  1. 닿았을 때 플레이어의 진행 방향과 정반대로 힘이 가하도록 설정한 Bounce block이 인게임에서 플레이어에게 가하는 힘의 방향이 원하는 방향과 다른 현상

원인 : ContactPoint contact = collision.contacts[0]; 를 가져오는 것까지 좋았으나, contact.normal이 접촉면의 법선 벡터를 가져와 의도한 것과 달리 무조건 수직 방향으로 플레이어를 밀치는 것.

해결 : 법선벡터를 가져오는 것이 아닌 (contact.point - transform.position).normalized를 통해 접촉점과 플레이어의 위치를 활용하여 반대 방향 정규 벡터를 계산함으로써 해결

  1. 포탄으로 활용되는 머핀이 발사 이후 회전없이 그대로 떨어지는 현상

원인 : 의도하고자 한 것은 자연스러운 회전이 있는 머핀을 연출하고자 했지만, 단순히 velocity만 수정하고 torque를 주지 않아 회전없이 날아가는 것

해결 : AddTorque로 transform.right 방향으로 힘을 가해 회전하도록 구현.

  1. 주기적으로 움직이는 주사위 오브젝트 속도를 바꿀 경우 경로에서 벗어나는 현상

원인 : Coroutine으로 구현했으나, 속도에 상관없이 시간을 고정시켜 속도가 빨라질 경우 이동거리가 증가하여 경로를 벗어나는 것

해결 : 시간을 고정시키지 않고, 시간을 속도로 나누어 가변적으로 설정하여 해결.

  1. player가 주위 환경의 물리적 영향을 받지 않고 고정된 속도로 이동

원인 : rigidbody.velocity 로 플레이어의 이동을 제한하여 주위 환경에 의해 영향을 받더라도 다음 프레임에 바로 속도가 덮어씌워져 영향을 받지 않는 것처럼 보이는 것

해결 : rigidbody.AddForce 로 플레이어의 이동을 구현하여 주위 환경에 의해 AddForce로 힘이 덮여씌워지도록 하여 해결

  1. player의 속도가 상한 없이 계속 늘어나고, 움직임이 velocity 방식에 비해 부자연스러운 현상

원인 : rigidbody.AddForce 로 이동을 바꿔 상한 없이 계속해서 힘이 가해져 플레이어의 속도가 계속 빨라지고, 접촉 면적의 마찰 계수에 영향을 크게 받아 기대한대로 움직이도록 구현하는 난이도가 높다.

해결 : player의 속도를 바로 덮어 씌우는 것이 아닌 acceleration, deceleration을 활용한 targetVelocity를 사용하여 해결. 중요 쟁점은 외부로부터 물리적 충격을 받도록 구현하는 것, 움직임이 자연스러울 것 이렇게 2가지이다. 속도를 바로 덮어씌우지 않고 가속, 감속을 통해 서서히 목표 속도로 다다르게 만들어 외부 충격에도 영향을 받는 것처럼 보일 수 있고, velocity를 활용하기에 훨씬 움직임이 자연스러울 수 있었다.

  1. player가 Jump 이후 게임치고 너무 천천히 떨어지는 이슈

원인 : player에 적용되는 중력의 scale이 1로 설정되어 현실적이지만, 게임적 허용으로는 너무 느리게 느껴지는 것

해결 : player의 velocity.y가 음수일 때 중력을 보정하여 더 강하게 적용되도록 하여 해결

if (rb.velocity.y < 0)
{
    rb.velocity += Vector3.up * Physics.gravity.y * (fallMultiplier - 1) * Time.deltaTime;
}
  1. player animator 적용 이후 모션을 전환할 때 다소 지연이 생겨 매끄럽지 않게 전환되는 이슈

원인 : animator의 HasExitTime을 체크하여 생긴 현상. 해당 옵션을 체크할 경우 기존 모션을 모두 끝낸 이후 다음 모션으로 전환되기 때문에 다소 부자연스러운 연출이 생기는 것

해결 : 모션 전환 과정의 HasExitTime을 모두 체크 해제하여 해결

  1. player 전방 1m 앞에 grabPos를 하위 오브젝트로 갖도록 하이어라키를 구성하고 플레이어가 잡은 공을 해당 위치로 가져오도록하기 위해 grabPos.position을 활용했지만 공이 grabPos의 위치가 아닌 grabPos의 localPosition value를 world 기준 좌표로 읽어 상이한 곳에 소환되는 현상

원인 : 원인 불명. 해당 버그가 나오게 된 과정은 다음과 같다. grabPos의 프리팹 구현 → grabPos 씬으로 드래그하여 배치 → 해당 위치 그대로 유지하며 하이어라키 상에서 player 오브젝트의 하위로 이동 → 스크립트에서 [SerializeField] private Transform grabPos 에 grabPos 드래그하여 등록 → 잡은 오브젝트의 소환 위치로 grabPos.position 작성 → 위와 같은 현상 발생

해결 : grabPos.positionplayer.position + grabPos.localPosition 으로 수정하여 해결. 기본적으로 Transform.position은 해당 오브젝트의 월드 좌표를 읽어오도록 되어있는데, 대체 왜 안되는지 모르겠다.

  1. GameOver이 될 경우 게임 화면이 Fade-Out 되고 글자가 출력되는 과정에서, 자연스러운 연출을 위해 Coroutine으로 구현하고 난 후 화면이 아예 암전되는 이슈

원인 : 의도하고자 한 것은 인게임화면이 흐릿하게 보인 상태로 GameOver panel이 나오는 연출이었기에, 알파값을 인게임 화면을 가리는 이미지는 0.95로, 나머지 글자는 1로 맞춰 출력할 필요가 있었다.

해결 : Math.clamp01을 이미지와 글자 별로 각각 적용하여 해결

private IEnumerator FadeIn()
{
    Color fadeColor = fadeOutPanel.color;
    fadeColor.a = 0;
    fadeOutPanel.color = fadeColor;

    Color textColor = gameOverText.color;
    textColor.a = 0;
    gameOverText.color = textColor;

    Color btnColor = restartBtnText.color;
    btnColor.a = 0;
    restartBtnText.color = btnColor;

    float timer = 0f;
    while (timer < fadeDuration * 0.95f)
    {
        timer += Time.deltaTime;
        fadeColor.a = Mathf.Clamp01(timer / fadeDuration);
        fadeOutPanel.color = fadeColor;
        textColor.a = Mathf.Clamp01(timer * 0.95f / fadeDuration);
        gameOverText.color = textColor;
        btnColor.a = Mathf.Clamp01(timer * 0.95f / fadeDuration);
        restartBtnText.color = btnColor;
        exitBtnText.color = btnColor;
        yield return null;
    }
}
  1. GameManager가 호출된 씬이 아닌 다른 씬의 오브젝트를 SerializeField에 할당할 수 없는 이슈

원인 : Unity에서 SerializeField로 드래그 하기 위해서는 반드시 해당 씬에 존재하는 오브젝트여야한다. 따라서 GameManager를 StartScene에서 호출할 경우 DontDestroyOnLoad로 다음 IngameScene에 존재하더라도 IngameScene의 오브젝트를 직접적으로 드래그하는 것이 불가능하다.

해결 : GameManager에 메서드를 추가하여 field에 스크립트로 할당하여 해결

public void TakeGameOverUI(GameObject obj)
{
	GameOverUI = obj;
}

위와 같은 메서드를 GameManager에 추가하고, 할당하고자 하는 UI에 스크립트 컴포넌트를 더한다.

private void start()
{
	GameManager.Instance.TakeGameOverUI(gameObject);
}
  1. build 이후 해상도에 따른 옵션 창 슬라이더 상호작용 불가능 현상

원인 : 해상도가 달라짐에 따라 슬라이더 이미지와 상호작용 영역의 차이

해결 : 확인 결과 슬라이어 이미지는 해상도에 따라 변화하지만, 상호작용 영역이 해상도에 따라 상이하게 변화하여 이를 이미지와 동일하도록 수정

profile
뚠뚠뚠뚠

1개의 댓글

comment-user-thumbnail
2025년 5월 8일

_<

답글 달기