TIL(2024,05,29) Unity 숙련과정 점프대, 이동속도 버프 아이템(3DSurvival)

김보근·2024년 5월 29일

Unity

목록 보기
11/113
post-thumbnail

오늘은 점프대와 아이템을 사용하면 그만큼 수치가 올라가는것을 만들어 볼것이다.

  1. 점프대 Rigidbody ForceMode (난이도 : ★★★☆☆)

    • 캐릭터가 밟을 때 위로 높이 튀어 오르는 점프대 구현
    • OnCollisionEnter 트리거를 사용해 캐릭터가 점프대에 닿았을 때 ForceMode.Impulse를 사용해 순간적인 힘을 가함.
    1. 아이템 사용 Coroutine (난이도 : ★★★☆☆)
    • 특정 아이템 사용 후 효과가 일정 시간 동안 지속되는 시스템 구현
    • 예) 아이템 사용 후 일정 시간 동안 스피드 부스트.

점프대

기존 오브젝트와 똑같이 만들어준다.

이렇게 만든후에 JumpObject라는 스크립트를 작성한다

public class JumpObject : MonoBehaviour // JumpObject 클래스는 MonoBehaviour를 상속받아 Unity의 컴포넌트로 동작합니다.
{
    public float JumpForce = 100f; // JumpForce 변수는 점프의 힘을 정의합니다. 기본값은 100f입니다.

    private void OnCollisionEnter(Collision collision) // OnCollisionEnter 메서드는 다른 물체와 충돌할 때 호출됩니다.
    {
        Rigidbody rb = collision.collider.GetComponent<Rigidbody>(); // 충돌한 물체의 Rigidbody 컴포넌트를 가져옵니다.

        if (rb != null) // Rigidbody 컴포넌트가 존재하는지 확인합니다.
        {
            rb.AddForce(Vector3.up * JumpForce, ForceMode.Impulse); // Rigidbody에 위 방향으로 JumpForce만큼의 순간적인 힘을 가합니다.
        }
    }
}

아이템 사용

특정 아이템을 사용하게되면 이동속도가 빨라지는 아이템을 만들어 볼것이다.

ItemData 스크립트

using UnityEngine;

[CreateAssetMenu(fileName = "NewItem", menuName = "Item/ItemData")]
public class ItemData : ScriptableObject
{
    public string itemName;
    public string description;
    public Sprite icon;
    public int value;
    public ItemType itemType;
    public float effectDuration;
    public EffectType effectType;

    public enum ItemType
    {
        Weapon,
        Armor,
        Consumable,
        Misc
    }

    public enum EffectType
    {
        SpeedBoost,
        // 다른 효과 유형 추가 가능
    }
}

여기서 이펙트타입 SpeedBoost를 추가하고 변수 effectDuration를 추가해 지속시간을 입력받는변수를 만든다.

PlayerController 스크립트

 // 아이템 효과 적용 메서드 추가
 public void ApplyEffect(ItemData item)
 {
     if (item.effectType == ItemData.EffectType.SpeedBoost)
     {
         if (activeEffectCoroutine != null)
         {
             StopCoroutine(activeEffectCoroutine);
         }
         activeEffectCoroutine = StartCoroutine(SpeedBoost(item.effectDuration));
     }
 }
 
 private IEnumerator SpeedBoost(float duration)
{
    MoveSpeed = originalMoveSpeed * 2; // 속도를 두 배로 증가
    yield return new WaitForSeconds(duration); // 지속 시간 동안 대기
    MoveSpeed = originalMoveSpeed; // 속도를 원래대로 복원
    activeEffectCoroutine = null;
}

기존 플레이어 컨트롤러에 이 효과를 넣었다.
ItemData의 이펙트 타입이 스피드 부스트라면 이 SpeedBoost코루틴을 돌게된다.

이제 이것들을 각 아이템 데이터에 적용을 하게 되면.

완성화면

profile
게임개발자꿈나무

0개의 댓글