👩🏻💻오늘 할 일
점프대아이템 사용대시움직이는 발판
#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("속도 복귀");
}
}
정상적으로 작동하는 것을 확인할 수 있었다!
'과제' 카테고리의 다른 글
[Unity3D,C#] 게임개발 숙련 팀 프로젝트 1일차 (0) | 2025.03.12 |
---|---|
[Unity,C#,3D] 게임 개발 숙련 개인 과제 2일 차 (0) | 2025.03.05 |
[Unity,C#,3D]게임 개발 숙련 개인 과제 1일 차 (0) | 2025.03.04 |
[Unity,C#] 유니티 입문 팀 프로젝트 개발 2일차 (0) | 2025.02.25 |
[Unity,C#] 유니티 입문 팀 프로젝트 개발 1일차 (0) | 2025.02.24 |