과제

[Unity,C#,3D] 게임 개발 숙련 개인 과제 3일 차

leejiyoung0511 2025. 3. 6. 22:13

👩🏻‍💻오늘 할 일

  • 점프대
  • 아이템 사용
  • 대시
  • 움직이는 발판

#1 점프대

점프대를 구현해 봤는데 뭔가 자연스럽지 않았다.

▼구현 코드

    //용수철이 늘어나는 애니메이션
    private IEnumerator ExpandSpring()
    {
        float localScaleY = m_SpringMinScaleY;
        while (Spring.localScale.y < m_SpringMaxScaleY)
        {
            localScaleY += Time.deltaTime * m_ExpandSpeed;
            Spring.localScale = new Vector3(1, localScaleY, 1);
            yield return null;
        }
        StartCoroutine(CompressSpring());
    }

    //용수철이 줄어드는 애니메이션
    private IEnumerator CompressSpring()
    {
        float localScaleY = m_SpringMaxScaleY;
        while (Spring.localScale.y > m_SpringMinScaleY)
        {
            localScaleY -= Time.deltaTime;
            Spring.localScale = new Vector3(1, localScaleY, 1);
            yield return null;
        }
    }

 

게임할 때는 안보이겠지만... 진동효과를 넣고 싶어서 방법을 찾아보다가

Dotween을 쓰면 가능할 것 같았다.

 

아래와 같은 코드를 쓰니 점프대의 움직임이 자연스러워졌다!!

    private void PlaySpringAnimation()
    {
        Spring.DOScaleY(MaxScaleY, ExpandSpeed)
            .SetEase(Ease.OutElastic) // 용수철 반동 효과
            .OnComplete(() =>
            {
                Spring.transform.DOScaleY(MinScaleY, CompressSpeed);
            });
    }

 

▼easeOutElastic의 그래프

▼수정뒤 용수철의 움직임 영상

😵‍💫오늘의 트러블 슈팅

#1 아이템 획득문제

아이템과 플레이어가 충돌하면 아이템을 획득하는 로직을 구현했다.

하지만 PickUpItem이 Missing이 되는 문제를 발견했다.

 

원인을 찾아보니 아이템과 충돌할 때 CousumableItem 스크립트에서 오브젝트를

Destroy 하고 있기 때문에 데이터를 건네주기 전에 파괴가 되어 에러가 나는 것이었다!

 

CousumableItem에서 아이템 사용 로직을 구현해 놨었는데

다 삭제하고 플레이어와 충돌 시 ItemData을 건네주기로 하였다.

 

그리고 아이템 사용 로직을 ScriptableObject를 사용하기로 하였다.

ScriptableObject를 상속받은 아이템 효과 클래스를 준비해서

public abstract class ItemEffect : ScriptableObject
{
    public float Duration; //지속시간
    public Action OnEndEffectEvent = delegate { }; //효과가 끝났을때 호출되는 이벤트

    //효과 적용
    public virtual void ApplyEffect(Player player)
    {
        player.StartCoroutine(IApplyEffect(player));
    }
    //효과 시작
    public abstract void StartEffect(Player player);
    //효과 끝
    public abstract void EndEffect(Player player);

    private IEnumerator IApplyEffect(Player player)
    {
        StartEffect(player);
        yield return new WaitForSeconds(Duration);
        EndEffect(player);
        OnEndEffectEvent();
    }
}

 

각각의 아이템 효과 클래스가 아이템효과 클래스를 상속받게 하였다.

[CreateAssetMenu(fileName = "SpeedBoost", menuName = "Scriptable Object/SpeedBoost", order = int.MaxValue)]
public class SpeedBoost : ItemEffect
{
    public float AddSpeed;

    public override void StartEffect(Player player)
    {
        player.Controller.MoveSpeed += AddSpeed;
        Debug.Log("속도 증가");
    }

    public override void EndEffect(Player player)
    {
        player.Controller.MoveSpeed -= AddSpeed;
        Debug.Log("속도 복귀");
    }
}

 

정상적으로 작동하는 것을 확인할 수 있었다!