Prototype

순후추·2023년 10월 19일
0

디자인패턴

목록 보기
1/11
post-thumbnail

Prototype의 정의

###프로토타입 패턴은 객체 생성이 높은 경우, 기존 객체를 복제하여 새로운 객체를 생성하는 디자인 패턴이다

왜 사용하는가?

  1. 상속과 활용
    복제할 객체를 정의하는 인터페이스 또는 추상 클래스입니다.
    이는 복제 메서드를 정의하고, 해당 메서드를 통해 객체를 복제합니다.

  2. 비용이 낮은 객체 생성
    일반적으로 어떤 객체를 생성하는데에는 많은 자원이 소모되지만, 한번 생성 후 이를 복제하여 사용하면 많은 비용이 절약된다.

  3. 상태를 공유할 필요가 적은 경우
    프로토타입 패턴으로 객체가 복제되면 독립적인 상태를 가질 수 있다. 대표적으로 총알이 그러하다

public class Player : MonoBehaviour
{
    [SerializeField]
    private Weapon currentWeapon;

    [SerializeField]
    private Target target;

    private void Update()
    {
        if (Input.GetButtonDown("Fire1"))
        {
            currentWeapon.Attack(target);
        }
    }
}

public class Target : MonoBehaviour
{
    private int currentHp = 100;

    public void TakeDamage(int toDamage)
    {
        currentHp -= toDamage;
        Debug.Log($"Damage Amount : {toDamage}");
    }
}

public abstract class Weapon : MonoBehaviour
{
    public void Attack(Target target)
    {
        DoAttack(target);
        Debug.Log($"You have {DamageMessage()}");
    }

    protected abstract void DoAttack(Target target);
    protected virtual string DamageMessage() { return "Hit"; }

}

public class Swrod : Weapon
{
    protected override void DoAttack(Target target)
    {
        target.TakeDamage(10);
    }

    protected override string DamageMessage()
    {
        return "Basic Sword"; 
    }

}

public class BigSword : Weapon
{
    protected override void DoAttack(Target target)
    {
        target.TakeDamage(20);
    }

    protected override string DamageMessage()
    {
        return "BIG Sword";
    }
}

public class MegaSword : Weapon
{
    protected override void DoAttack(Target target)
    {
        target.TakeDamage(30);
    }

    protected override string DamageMessage()
    {
        return "Mega Sword";
    }
}

나는 1번 상황, 즉 상속을 이용하여 구현 해보았다.

어떤 상황에서 사용할 것 인가?

총알 Prefeb을 Instanctiate() 하는것도 있지만, 나는 앞서 구현 한 방바와 같이 상속을 이용해서 게임 내 다양한 요소들이 유사한 속성을 가지고 있을때, 객체를 복제, 상속하여 재사용함으로써 성능 향상 및 코드 최적화에 도움을 줄 것이다.

profile
게임 개발 블로그

0개의 댓글

관련 채용 정보