본문 바로가기
Unity

2024/04/19 포켓몬 게임 구현하기 2

by 민정e 2024. 4. 19.

C# 함수

void => 일반적인 함수. 값을 뱉어낼 수는 없다. 

string, int, bool => 각각 string, int, bool 값을 뱉어내는 함수이다.

 

어제 문자로 작성해 주었던 부분을 전부 함수화 시켜 다음과 같이 작성하였다.

using System;
using System.Collections;
using System.Collections.Generic;
using UnityEditor;
using UnityEngine;
using TMPro;
using UnityEngine.UI;
using UnityEditor.UI;
using UnityEngine.UIElements;
using Unity.VisualScripting;

public class Test1 : MonoBehaviour
{
    // UI
    public TextMeshProUGUI dialog; // 메세지가 나올 부분
    public TextMeshProUGUI currentHp; // 포켓몬의 현재 체력
    public TextMeshProUGUI maxHP; // 포켓몬의 최대체력
    public TextMeshProUGUI slash; // 체력사이의 슬래쉬
    public TextMeshProUGUI pokemonName; // 포켓몬의 이름
    public TextMeshProUGUI pokemonLevel; // 포켓몬의 레벨

    // 트레이너 정보
    string trainerName = "안나";

    // 아이템 정보
    List<string> Items = new List<string>();
    List<float> ItemEffect = new List<float>();

    // 내 포켓몬 정보
    string[] myPK = new string[6];
    int[] PKLevel = { 1, 2, 3 };
    bool[] isAlive = { true, true, true };

    float[] curHp = { 30, 40, 50 };
    float[] mHP = { 30, 40, 50 };
    // float[] skillDamage = { 2.5f, 3.0f, 3.5f };
    List<string> Skill = new List<string>();
    List<float> SkillDamage = new List<float>();

    // 메세지 번호
    int messageNumber;

    // 표시될 메세지 리스트
    List<string>dialogList = new List<string>();



    // Start is called before the first frame update
    void Start()
    {
        // 포켓몬의 스킬을 리스트에 추가해준다.
        Skill.Add("전광석화");
        Skill.Add("불꽃세례");
        Skill.Add("바위치기");

        SkillDamage.Add(2.5f);
        SkillDamage.Add(3.0f);
        SkillDamage.Add(3.5f);
		
        // 아이템을 리스트에 추가해준다.
        Items.Add("상처약");
        Items.Add("풀회복약");

        ItemEffect.Add(10f);
        ItemEffect.Add(50f);


		// 포켓몬을 배열에 추가해준다.
        myPK[0] = "피카츄";
        myPK[1] = "파이리";
        myPK[2] = "롱스턴";

        // 표시될 메세지를 리스트에 추가해준다.
        DialogData();

        dialog.text = StartBattle(1); // 시작 메세지

    }


    // Update is called once per frame
    void Update()
    {

    }

    // 메세지를 표시하는 기능
    public void Message()
    {
        dialog.text = dialogList[messageNumber];
        messageNumber++;
    }

    // 메세지 리스트에 메세지들을 저장하는 함수.
    void DialogData()
    {
        dialogList.Add(SelectPK(0));
        dialogList.Add(UseSkill(0));
        dialogList.Add(PKDamaged(1, 0));
        dialogList.Add(LeftHP(1));
        dialogList.Add(UseSkill(1));
        dialogList.Add(PKDamaged(0, 1));
        dialogList.Add(LeftHP(0));
        dialogList.Add(UseItem(0, 0));
        dialogList.Add($"{myPK[0]}의 체력을 10 회복했다!!!");
        dialogList.Add($"{myPK[0]}의 HP : {curHp[0] + 10f}");
    }
    
    string SelectPK(int a)
    {
        return $"가랏, {myPK[a]}!!!";
    }

    string StartBattle(int a)
    {
        return $"{trainerName} 이/가 {myPK[a]} 와/과 배틀을 시작했다!!!";
    }

    string UseSkill(int i)
    {
        return $"{myPK[i]}의 {Skill[i]}!!!";
    }

    string PKDamaged(int i, int j)
    {
        curHp[i] = curHp[i] - SkillDamage[j];
        return $"{myPK[i]}는 {SkillDamage[j]}의 데미지를 입었다!!!";
    }

    string UseItem(int a, int b)
    {
        curHp[a] = curHp[a] + ItemEffect[b];
        
        if (curHp[a] > mHP[a])
        {
            curHp[a] = mHP[a];
        }

        return $"{trainerName}이/가 {myPK[a]}에게 {Items[b]}을/를 사용했다!!!";
    }

    string LeftHP(int i)
    {
        return $"{myPK[i]}의 HP : {curHp[i]}";
    }
}

 

여러번 공격하는 스킬 구현

독침붕의 마구찌르기 같은 경우 몬스터를 여러번 공격하게 된다. 이를 구현하기 위해 다음과같이 코드를 작성하였다.

using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using TMPro;

public class Test1 : MonoBehaviour
{
    // UI
    public TextMeshProUGUI dialog; // 메세지가 나올 부분
    public TextMeshProUGUI currentHp; // 포켓몬의 현재 체력
    public TextMeshProUGUI maxHP; // 포켓몬의 최대체력
    public TextMeshProUGUI slash; // 체력사이의 슬래쉬
    public TextMeshProUGUI pokemonName; // 포켓몬의 이름
    public TextMeshProUGUI pokemonLevel; // 포켓몬의 레벨

    // 트레이너 정보
    string trainerName = "안나";

    // 아이템 정보
    List<string> Items = new List<string>();
    List<float> ItemEffect = new List<float>();

    // 내 포켓몬 정보
    string[] myPK = new string[6];
    int[] PKLevel = { 1, 2, 3, 4 };
    bool[] isAlive = { true, true, true };

    float[] curHp = { 30, 30, 50, 60 };
    float[] mHP = { 30, 30, 50, 60 };
    // float[] skillDamage = { 2.5f, 3.0f, 3.5f };
    List<string> Skill = new List<string>();
    List<float> SkillDamage = new List<float>();

    // 메세지 번호
    int messageNumber;

    // 메세지간의 시간차이
    float timer = 2f;

    // 표시될 메세지 리스트
    List<string> dialogList = new List<string>();



    // Start is called before the first frame update
    void Start()
    {
        // 포켓몬의 스킬을 리스트에 추가해준다.
        Skill.Add("전광석화");
        Skill.Add("불꽃세례");
        Skill.Add("바위치기");
        Skill.Add("마구찌르기");

        SkillDamage.Add(10f);
        SkillDamage.Add(20f);
        SkillDamage.Add(30f);
        SkillDamage.Add(5f);

        Items.Add("상처약");
        Items.Add("풀회복약");

        ItemEffect.Add(10f);
        ItemEffect.Add(50f);



        myPK[0] = "피카츄";
        myPK[1] = "파이리";
        myPK[2] = "롱스턴";
        myPK[3] = "독침붕";
        myPK[4] = "이상해씨";

        // 표시될 메세지를 리스트에 추가해준다.
        DialogData();

        dialog.text = StartBattle(1); // 시작 메세지

    }


    // Update is called once per frame
    void Update()
    {

    }


    // 메세지를 표시하는 기능
    public void Message()
    {
        dialog.text = dialogList[messageNumber];
        messageNumber++;
    }

    // 메세지 리스트에 메세지들을 저장하는 함수.
    void DialogData()
    {
        dialogList.Add(UseSkill(3, 2));
        dialogList.Add(SelectPK(0));
        dialogList.Add(UseSkill(0, 1));
        dialogList.Add(UseSkill(1, 0));
        dialogList.Add(UseItem(0, 0));
        dialogList.Add(UseSkill(0, 1));
        dialogList.Add($"{myPK[1]}는 혼란스럽다!!!");
        dialogList.Add(UseSkill(0, 1));
        dialogList.Add($"{myPK[1]}는 쓰러졌다!!!");


    }

    string SelectPK(int a)
    {
        return $"가랏, {myPK[a]}!!!";
    }

    string StartBattle(int a)
    {
        return $"{trainerName} 이/가 {myPK[a]} 와/과 배틀을 시작했다!!!";
    }


    void Repeat()
    {
        for (int a = 0; a < 10; a++)
        {
            Debug.Log(a);
        }
    }
    // 공격과 데미지, 현재 HP를 보여주는 함수를 한개로 합쳤다.
    string UseSkill(int a, int b)
    {
        if (a == 3) // 포켓몬이 독침붕이고, 스킬이 마구찌르기일 경우
        {
            int r = Random.Range(1, 6); // 1부터 5까지 랜덤
            for (int count = 1; count<=r; count++) // r회까지 스킬 사용 메세지 표시하기
            {
                dialogList.Add($"{myPK[a]}의 {Skill[a]} X {count} !!!" );
            }
            curHp[b] = curHp[b] - SkillDamage[a] * r;
            dialogList.Add($"{myPK[b]}은/는 {SkillDamage[a] * r}의 데미지를 입었다!!!");
        }
        else // 다른포켓몬들의 경우
        {
            dialogList.Add($"{myPK[a]}의 {Skill[a]}!!!!");
            curHp[b] = curHp[b] - SkillDamage[a];
            dialogList.Add($"{myPK[b]}은/는 {SkillDamage[a]}의 데미지를 입었다!!!");
        }
        return $"{myPK[b]}의 HP : {curHp[b]}";
    }

	// 아이템 사용, 회복, 현재 HP표시를 하나로 묶어주었다.
    string UseItem(int a, int b)
    {

        if (curHp[a] + ItemEffect[b] > mHP[a])
        {
            curHp[a] = mHP[a];
        }
        else
        {
            curHp[a] = curHp[a] + ItemEffect[b];
        }
        dialogList.Add($"{trainerName}이/가 {myPK[a]}에게 {Items[b]}을/를 사용했다!!!");
        dialogList.Add($"{myPK[a]}의 체력을 10 회복했다!!!");
        return $"{myPK[a]}의 HP : {curHp[a]}";
    }

}

 

테스트를 해보면 다음과 같이 잘 작동하는 것을 볼 수 있다.