내일배움캠프 Unity 74일차 TIL - 팀 9와 4분의 3 - 개발일지

Wooooo·2024년 2월 8일
0

내일배움캠프Unity

목록 보기
76/94

[오늘의 키워드]

다른 팀과 서로 테스트를 해주기로 했다.
테스트 파일을 뽑기 전에 미뤄뒀던 버그 수정들을 조금 했다.


[버그 수정]

검 1타 안맞는 버그 수정

검은 3연타까지 있는데, 1타는 나가지만 몬스터가 맞질 않았다.

평소엔 데미지를 주는 콜라이더가 꺼져있다가 ComboAttackState에서 일정 시간 이후 켜지는 구조인데,
너무 늦게 켜져서 덩치가 작은 몬스터는 안맞는 현상이었다.

콜라이더를 켜고 끄는 타이밍과 순서를 조금 바꿔서 해결하였다.

플레이어 Step Offset 조절

강을 건너기 위한 다리가 약간 아치형 모양인데, 이 모양에 콜라이더를 적용하기 위해서 여러개의 박스 콜라이더를 이어붙였다.

조악하게 이어붙였다보니까 Step Offset이 낮으면 캐릭터가 자꾸 걸렸다. 그래서 Step Offset을 0.2정도로 올렸다.

몬스터 공격 시 몬스터 머리 위로 올라가지는 현상

플레이어가 몬스터를 공격 시, 몬스터의 머리 위로 올라가지는 현상이 있었다.

여러 몬스터를 소환해서 때려봤는데, 공격을 맞으면 넉백되도록 해주는 컴포넌트인 넉백시스템을 가지고 있는 몬스터들에게서 발생하고 있었다.

현재 넉백시스템은 몬스터의 OnHit 이벤트가 호출되면 잠시 rigidbody의 isKinematic을 껐다가 addforce를 적용하고, 다시 isKinematic을 키는 구조로 작성돼있었는데, isKinematic이 꺼지는 순간 플레이어와 몬스터의 충돌 처리가 이상해져서 발생하는 문제였다. 따라서 rigidbody를 사용하지 않고 넉백을 구현하는 방법으로 해결했다.

    public void Knockback(Vector3 force)
    {
        if (_coroutine != null)
            StopCoroutine(_coroutine);
        _coroutine = StartCoroutine(CoKnockback(force));
    }

    private IEnumerator CoKnockback(Vector3 force)
    {
        for (float t = 0; t < 0.5f; t += Time.fixedDeltaTime)
        {
            Vector3 velocity = Vector3.Lerp(force, Vector3.zero, t / 0.5f);
            transform.position += _knockbackRatio * Time.fixedDeltaTime * velocity;
            yield return _wait;
        }
    }

코루틴을 이용해서 넉백을 구현했다.

부산물 오브젝트가 이상하게 생성되는 문제

부산물을 생성할 때, 생성할 좌표가 유효한 위치인지를 판단하지 않았다.

따라서, 공중에 생성되거나, 나무 속에 생성돼서 안보이거나, 벽 속에 생성되는 등등 문제가 있었다.
생성 시, 유효한 위치인지 판단하도록 했다.

    public void TryCreate()
    {
        if (_distribution <= Random.value || _currentCreateCount >= _maxCreateCount)
            return;

        Vector3 spawnPosition = Random.onUnitSphere;
        spawnPosition.Set(spawnPosition.x, 0, spawnPosition.z);
        spawnPosition.Normalize();
        spawnPosition *= Random.Range(_minRange, _maxRange);
        spawnPosition += transform.position;

        Create(spawnPosition);
    }

    public void Create(Vector3 spawnPosition)
    {
        if (IsValidPosition(ref spawnPosition))
        {
            Managers.Game.ResourceObjectSpawner.SpawnObject(_prefab, spawnPosition);
            _currentCreateCount++;
        }
    }

    public bool IsValidPosition(ref Vector3 pos)
    {
        pos += Vector3.up * 50f;
        if (Physics.Raycast(pos, Vector3.down, out var hit, 100f, int.MaxValue, QueryTriggerInteraction.Collide))
        {
            pos = hit.point;
            return hit.collider.gameObject.layer == 12;
        }
        else
            return false;
    }

물이 안보이는 현상

에디터의 플랫폼이 PC일때는 물이 제대로 보였지만, 안드로이드로 스위칭 플랫폼을 하고 나니까 셰이더 설정이 모바일 버전으로 바뀌어서 그런지 물이 거의 안보이는 정도로 그려지고 있었다.

조금 잘 보일 수 있도록, 물과 동일한 크기의 plane을 겹쳐서 약간 물 색깔이 나는 머티리얼을 입혀줬다.

profile
game developer

0개의 댓글