Turn Based RPG Game Wiki - UAVisonline/Portfolio GitHub Wiki

ν„΄μ œ 기반 μœ‘μ„± RPG κ²Œμž„ μ œμž‘ ν”„λ‘œμ νŠΈ

ν•΄λ‹Ή κ²Œμž„μ€ ꡐ양 κ³Όλͺ© : λͺ¨λ°”μΌκ²Œμž„ν”„λ‘œκ·Έλž˜λ°μ— λŒ€ν•œ ν•™κΈ° 과제둜 μ œμž‘ν•œ ν”„λ‘œμ νŠΈμ΄λ‹€. κ²Œμž„μ€ λ‹€μ–‘ν•œ νŠΉμ„±μ„ μ–»κ³  이λ₯Ό κ·ΉλŒ€ν™”ν•˜λŠ” λ°©ν–₯으둜 캐릭터λ₯Ό μœ‘μ„±ν•˜λŠ” λ°©μ‹μœΌλ‘œ μ§„ν–‰λ˜λ©°, ν„΄μ œ μ „νˆ¬λ₯Ό μ§„ν–‰ν•˜λŠ” κ²ƒμœΌλ‘œ μ‚¬μš©μžλŠ” μžμ‹ μ˜ 캐릭터가 효과적으둜 μœ‘μ„±ν–ˆλŠ”μ§€ 확인할 수 있으며 μ΄λŸ¬ν•œ κ³Όμ • μ†μ—μ„œ 재미λ₯Ό μ–»λŠ” 것을 λͺ©ν‘œλ‘œ ν•˜κ³  μžˆλ‹€.

ν•΄λ‹Ή ν”„λ‘œμ νŠΈλŠ” 2022λ…„ 10μ›”λΆ€ν„° 기획 및 μ œμž‘μ„ μ§„ν–‰ν•˜μ˜€μœΌλ©° 2022λ…„ 12μ›” 개발 μ™„λ£Œ, 이λ₯Ό λ°œν‘œν•˜λŠ”κ²ƒμœΌλ‘œ μ™„λ£Œλœ ν”„λ‘œμ νŠΈμ΄λ‹€.

κ²Œμž„ λ‚΄ κ·Έλž˜ν”½ 및 μŒμ•…νŒŒμΌμ€ 이전에 κ΅¬λ§€ν–ˆλ˜ Asset을 ν™œμš©ν•˜λŠ” λ°©μ‹μœΌλ‘œ ν•΄κ²°ν•˜μ˜€μœΌλ©°, κ·Έ μ™Έ 뢀뢄은 직접 μ œμž‘ν•˜λŠ” λ°©μ‹μœΌλ‘œ ν”„λ‘œμ νŠΈ κ°œλ°œμ„ μ§„ν–‰ν•˜μ˜€λ‹€.

ν•΄λ‹Ή μœ„ν‚€μ—μ„œλŠ” ν”„λ‘œμ νŠΈμ— λŒ€ν•΄ μ•„λž˜μ™€ 같은 ν•­λͺ©λ“€μ„ ν†΅ν•΄μ„œ μ„€λͺ…ν•˜κ³ μž ν•œλ‹€.

  • Observer νŒ¨ν„΄μ„ ν†΅ν•œ νŠΉμ„± κ΅¬ν˜„ 및 λ°œλ™

  • κ²Œμž„ λ‚΄ μ•„μ΄ν…œ 및 인벀토리 μ‹œμŠ€ν…œ μ œμž‘

  • ν„΄μ œμ „νˆ¬ 및 적에 λŒ€ν•œ κ΅¬ν˜„

1. Observer νŒ¨ν„΄μ„ ν†΅ν•œ νŠΉμ„± κ΅¬ν˜„ 및 λ°œλ™

ν•΄λ‹Ή μœ„ν‚€μ—μ„œ μ„œμˆ ν•˜λŠ” κ²Œμž„ ν”„λ‘œμ νŠΈλŠ” ν”Œλ ˆμ΄μ–΄μ˜ λŠ₯λ ₯치λ₯Ό Amulet이라 μΉ­ν•˜λŠ” νŠΉμ„±μ„ 톡해 λ³€ν™”μ‹œν‚¬ 수 μžˆλ‹€.

그리고 ν”„λ‘œμ νŠΈ λ‚΄μ—λŠ” 20κ°œμ΄μƒ 고유 νŠΉμ„±λ“€μ΄ μ‘΄μž¬ν•˜λŠ”λ°, 이λ₯Ό μ–΄λ–»κ²Œ κ΅¬ν˜„ν•˜μ˜€λŠ”μ§€ μ•„λž˜ μ†Œν•­λͺ© 2개λ₯Ό 톡해 μ„€λͺ…ν•˜κ³ μž ν•œλ‹€.

1. λ‹€μ–‘ν•œ νŠΉμ„±μ„ μ–΄λ–»κ²Œ μœ μ—°ν•˜κ²Œ κ΅¬ν˜„ν•  것인가? (Inheritance 및 Polymorphism)

ν•΄λ‹Ή κ²Œμž„ λ‚΄ νŠΉμ„±μ€ ν”Œλ ˆμ΄μ–΄μ—κ²Œ νŠΉλ³„ν•œ λŠ₯λ ₯을 λΆ€μ—¬ν•˜κ±°λ‚˜, 곡격λ ₯ 및 λ°©μ–΄λ ₯κ³Ό 같은 νŠΉμ • 수치λ₯Ό μ˜¬λ¦¬λŠ” μ‹μœΌλ‘œ μž‘λ™ν•œλ‹€. λ˜ν•œ μ΄λŸ¬ν•œ νŠΉμ„±λ“€μ€ νšλ“ν•˜λŠ” μ¦‰μ‹œ λ°œλ™λ˜κ±°λ‚˜, νŠΉμ • νƒ€μ΄λ°λ§ˆλ‹€ λ°œλ™μ΄ λ˜λŠ” μ‹μœΌλ‘œ 이루어진닀.

μ΄λŸ¬ν•œ 뢀뢄을 κ³ λ €ν•œ κ²°κ³Ό, λͺ¨λ“  νŠΉμ„±λ“€μ€ μ•„λž˜μ™€ 같은 속성 및 κΈ°λŠ₯을 κ³΅μœ ν•˜κ²Œ 되며 이λ₯Ό μ•„λž˜ BaseAmuletScript둜 μ •μ˜ν•˜μ˜€λ‹€.

BaseAmuletScript

속성
νŠΉμ„±μ— λŒ€ν•œ 정보 : μ½”λ“œ, 이름, μ„€λͺ…λ¬Έ, 이미지, μ†Œμ§€μ œν•œμˆ«μž (Unity ScriptableObject둜 관리)
ν•΄λ‹Ή νŠΉμ„±μ΄ λ°œλ™λ  상황 (enum μ—΄κ±°μ²΄λ‘œ 관리 : 9κ°€μ§€ κ°’μœΌλ‘œ μ •μ˜)

κΈ°λŠ₯ (μ „λΆ€ κ°€μƒν•¨μˆ˜λ‘œ μ„€μ •)
νŠΉμ„±νšλ“ ν•¨μˆ˜ (OnAcquire) : ν”Œλ ˆμ΄μ–΄μ—κ²Œ ν•΄λ‹Ή νŠΉμ„±μ„ μƒˆλ‘œ μ–»μ—ˆμŒμ„ μ•Œλ €μ€Œ
νŠΉμ„±μ†Œλ©Έ ν•¨μˆ˜ (OnDismiss) : ν”Œλ ˆμ΄μ–΄κ°€ ν•΄λ‹Ή νŠΉμ„±μ„ μžƒμ–΄λ²„λ Έλ‹€λŠ” 것을 μ•Œλ €μ€Œ
νŠΉμ„±κΈ°λŠ₯ ν•¨μˆ˜ (OnFunction) : νŠΉμ„± 자체의 κΈ°λŠ₯이 μ„œμˆ λ  ν•¨μˆ˜ (인자둜 enum λ³€μˆ˜λ₯Ό λ°›μŒ)

κ·Έ μ™Έ Unityμ—μ„œ κΈ°λ³Έ μ§€μ›ν•˜λŠ” MonoBehaviour클래슀의 OnEnable(였브젝트 생성 μ‹œ μžλ™ λ°œλ™)ν•¨μˆ˜λ₯Ό μ΄μš©ν•˜μ—¬ μ†Œμ§€ν•œ μ—¬λŸ¬ νŠΉμ„±λ“€μ„ κ΄€λ¦¬ν•˜λŠ” 것이 κ°€λŠ₯ν•˜λ‹€. (μ΄λŠ” μ•„λž˜ 1-2번 ν•­λͺ©μ—μ„œ μžμ„Ένžˆ μ„œμˆ ν•œλ‹€)

μœ„ λΆ€λͺ¨ 클래슀λ₯Ό μƒμ†ν•˜μ—¬ μžμ‹ 클래슀λ₯Ό λ§Œλ“€κ³ , 속성값을 μƒˆλ‘œ ν• λ‹Ήν•˜λŠ” 것 및 κ°€μƒν•¨μˆ˜λ₯Ό μ˜€λ²„λΌμ΄λ”©ν•˜λŠ” κ²ƒμœΌλ‘œ μ•„λž˜ 2κ°€μ§€ Script와 같이 μ›ν•˜λŠ” νŠΉμ„±μ„ κ΅¬ν˜„ν•  수 μžˆλ‹€.

public class Amulet_002 : BaseAmuletScript (002번 νŠΉμ„± : νšλ“ μ¦‰μ‹œ λ°œλ™λ˜λ©° λ‹€μ‹œ λ°œλ™λ˜μ§€ μ•ŠμŒ)
{
    public override void OnAcquire() [λΆ€λͺ¨ν΄λž˜μŠ€μ— OnAcquire ν•¨μˆ˜λ₯Ό μ˜€λ²„λΌμ΄λ”©ν•¨ -> νšλ“ μ¦‰μ‹œ μ•„λž˜ λ‚΄μš©μ„ μ‹€ν–‰]
    {
        PlayerManager.playerManager.spec.amulet_max_hp += 25; [ν”Œλ ˆμ΄μ–΄μ˜ 체λ ₯ μ΅œλŒ€μΉ˜λ₯Ό 25 μ˜¬λ¦°λ‹€]

        base.OnAcquire(); [λΆ€λͺ¨ν΄λž˜μŠ€ OnAcquire도 λ°œλ™ν•˜μ—¬ ν”Œλ ˆμ΄μ–΄κ°€ ν•΄λ‹Ή νŠΉμ„±μ„ μƒˆλ‘œ μ–»μ—ˆμŒμ„ κ³ μ§€]
    }

    public override void OnDismiss() [λΆ€λͺ¨ν΄λž˜μŠ€μ— OnDismiss ν•¨μˆ˜λ₯Ό μ˜€λ²„λΌμ΄λ”©ν•¨ -> νŠΉμ„±μ„ μžƒμ–΄λ²„λ¦¬λŠ” 경우 μ•„λž˜ λ‚΄μš©μ„ μ‹€ν–‰]
    {
        PlayerManager.playerManager.spec.amulet_max_hp -= 25; [ν”Œλ ˆμ΄μ–΄ 체λ ₯ μ΅œλŒ€μΉ˜λ₯Ό 25 λ‚΄λ¦°λ‹€]

        base.OnDismiss(); [λΆ€λͺ¨ν΄λž˜μŠ€ OnDismiss도 λ°œλ™ν•˜μ—¬ ν•΄λ‹Ή νŠΉμ„±μ„ μžƒμ–΄λ²„λ ΈμŒμ„ κ³ μ§€]
    }
} => ν”Œλ ˆμ΄μ–΄μ˜ 체λ ₯ μ΅œλŒ€μΉ˜λ₯Ό 25만큼 μ¦‰μ‹œ μ˜¬λ¦¬λŠ” νŠΉμ„±
public class Amulet_048 : BaseAmuletScript (048번 νŠΉμ„± : νŠΉμ • 타이밍이 올 λ•Œλ§ˆλ‹€ λ°œλ™λ˜λŠ” 경우)
{
    public override void OnFunction(Amulet_timing timing) [열거체 λ³€μˆ˜μΈ timing을 인자둜 λ°›μ•„μ˜΄]
    {
        if (timing == Amulet_timing.after_attack) [μΈμžκ°€ 곡격후 열거체와 같은 경우]
        {
            if(DungeonManager.dungeonManager.ret_player_attack() == attack_type.physical) [ν”Œλ ˆμ΄μ–΄μ˜ 곡격이 물리곡격인 경우]
            {
                int value = DungeonManager.dungeonManager.ret_current_damage(); [ν˜„μž¬ 데미지 수치λ₯Ό λ°›μ•„μ˜΄]

                value = Mathf.RoundToInt(value * 0.03f); [여기에 λŒ€ν•΄ 0.03을 곱함]

                if(value <= 0) [μœ„ 값이 0μ΄ν•˜μ΄λ©΄]
                {
                    value = Random.Range(0, 2);  [값을 0~2μ—μ„œ 랜덀으둜 맞좀]
                }

                DungeonManager.dungeonManager.heal_player_fixed(value); [valueκ°’ 만큼 체λ ₯을 회볡]
            }
        }
    }
} => (ν”Œλ ˆμ΄μ–΄κ°€ μ μ—κ²Œ 물리곡격을 ν•œ 경우, λ°λ―Έμ§€μˆ˜μΉ˜μ— 3%만큼 체λ ₯을 νšŒλ³΅ν•˜λŠ” λŠ₯λ ₯을 κ°€μ§„ νŠΉμ„±μ„ μ œμž‘)

2. μˆ˜λ§Žμ€ νŠΉμ„±μ€ μ–΄λ–»κ²Œ κ΄€λ¦¬ν•˜κ³  λ°œλ™μ‹œν‚¬ 것인가? (ObserverνŒ¨ν„΄μ„ ν†΅ν•œ subscribe/publish)

κ²Œμž„ λ‚΄ 얻은 λͺ¨λ“  고유 νŠΉμ„±μ„ ν”Œλ ˆμ΄μ–΄λŠ” νŠΉμ • 상황을 μœ„ν•΄ 관리할 수 μžˆμ–΄μ•Ό ν•˜λ©°, 이λ₯Ό μœ„ν•΄μ„œλŠ” μ•„λž˜ 3κ°€μ§€ κΈ°λŠ₯이 ν”Œλ ˆμ΄μ–΄ λ‚΄ κ΅¬ν˜„λ˜μ–΄μ•Ό ν•œλ‹€.

(1) νŠΉμ„±λ“±λ‘μž‘μ—… : κ²Œμž„ λ‚΄μ—μ„œ μƒˆλ‘œ νšλ“ν•œ νŠΉμ„±μ„ ν”Œλ ˆμ΄μ–΄κ°€ 관리 κ°€λŠ₯ν•œ μƒνƒœλ‘œ λ§Œλ“œλŠ” μž‘μ—…

(2) νŠΉμ„±ν•΄μ œμž‘μ—… : 더 이상 μ‚¬μš©ν•  수 μ—†λŠ” νŠΉμ„±μ— λŒ€ν•΄ 관리 λΆˆκ°€λŠ₯ν•œ μƒνƒœλ‘œ λ§Œλ“œλŠ” μž‘μ—…

(3) νŠΉμ„±λ™μž‘μž‘μ—… : ν”Œλ ˆμ΄μ–΄κ°€ μ†Œμœ ν•œ νŠΉμ„± 쀑 일뢀 νŠΉμ„±λ“€λ§Œ λ™μž‘ν•˜λ„λ‘ ν•˜λŠ” μž‘μ—…

μ΄λŸ¬ν•œ μž‘μ—…μ€ ν”Œλ ˆμ΄μ–΄μ— λŒ€ν•œ 정보λ₯Ό κ΄€λ¦¬ν•˜λŠ” PlayerManager μ½”λ“œ λ‚΄ Observer νŒ¨ν„΄λ‘œ κ΅¬ν˜„λ˜μ—ˆμœΌλ©°, 타 μŠ€ν¬λ¦½νŠΈλŠ” PlayerManager에 μ ‘κ·Όν•΄ νŠΉμ • ν•¨μˆ˜λ₯Ό μ‹€ν–‰ν•˜λŠ” κ²ƒμœΌλ‘œ μœ„ μž‘μ—…μ„ μ‹€ν–‰ν•  수 μžˆλ‹€.

  1. νŠΉμ„± 등둝 [insert_amulet 및 insert_detail_amulet ν•¨μˆ˜]

  2. νŠΉμ„± ν•΄μ œ [dismiss_amulet 및 dismiss_detail_amulet ν•¨μˆ˜]

  3. νŠΉμ„± λ™μž‘ [function_amulet ν•¨μˆ˜]

2. κ²Œμž„ λ‚΄ μ•„μ΄ν…œ 및 인벀토리 μ‹œμŠ€ν…œ μ œμž‘

3. ν„΄μ œμ „νˆ¬ 및 적에 λŒ€ν•œ κ΅¬ν˜„

⚠️ **GitHub.com Fallback** ⚠️