Skip to content

develop SkillFiringSystem

Seong Hyeok OH edited this page Mar 11, 2023 · 28 revisions

목차

Before

준비

  • 무기를 프리팹 후 무기에 "Weapon"을 적용
  • 캐릭터에게 "Character"을 적용
  • "SkillFiringSystem"(스크립트가 적용된 빈 오브젝트)에 "Weapon"와 "Character"을 적용
  • 몬스터에게 "Monster"을 적
  • 무기와 몬스터에게 collider2D 적용

알아야하는 부분

  • 이론 1-1. 무기에 관한 세세한 내용을 구현한 스크립트와 모든 무기 공통적인 부분을 "Weapon"에 넣고 이 둘을 무기에 적용 1-2. 캐릭터에 세세한 내용을 구현한 스크립트와 "Character"에 넣고 이 둘을 캐릭터에 적용
  1. "Weapon"과 "Character"에서 각각의 스탯을 가져와 "SkillFiringSystem"에 적용
  2. 무기를 발사할 때마다 "SkillFiringSystem"(스크립트가 적용된 빈 오브젝트)가 등장하도록 (미구현)

스크립

SkillFiringSystem


private void Attack() 
    {
        AttackCalculation();    //공격 관련 계산
        for (int i = 0; i <= numberOfProjectiles; i++)  //투사체 수만큼 발사하기
        {
            FireWeapon();
        }
    }


    //무기 발사
    //ToDo: attackRange을 적용하기
    private void FireWeapon()
    {
        float timediff = cooldown;  //쿨타임
        timer += Time.deltaTime;    //시간 갱신

        GameObject monster = GameObject.FindWithTag("Monster");

        if (timer > timediff)   //쿨타임 넘을 시
        {
            GameObject newobs = Instantiate(weapon);  //무기 로드
            newobs.transform.position = character.transform.position;  //캐릭터 위치에 생성
            newobs.GetComponent().Shoot(projectileSpeed);  //"Weapon"스크립트에서 무기 벡터대로 날아감
            if (OnTriggerEnter2D(weapon.GetComponent()))    //무기가 몬스터와 부딪힘 감지
            {
                monster.GetComponent().Health -= damage;   //딜 계산
                Destroy(monster, 0);    //몬스터 삭제
                if (monster.GetComponent().Health <= 0)    //몬스터가 죽는다면
                {
                    GameObject obj = Resources.Load("Object/Capsule");  //임펙트 등장
                    Destroy(obj, 1);    //임펙트 등장 시간
                }
            }
            timer = 0;  //시간 초기화
            Destroy(newobs, duration);  //지속 시간 지나면 삭제
        }
    }


    bool OnTriggerEnter2D(Collider2D weapon)
    //rigidBody가 무언가와 충돌할때 호출되는 함수로 Collider2D other로 부딪힌 객체를 받아옵니다.
    {
        if (weapon.gameObject.tag.Equals("Monster")) //부딪힌 객체의 태그를 비교해서 적인지 판단합니다.
        { return true; }
        else { return false; }
    }


    //아래 계산을 한번에 하기
    private void AttackCalculation()
    {
        DamageCalculation();
        ProjectileSpeedCalculation();
        DurationCalculation();
        AttackRangeCalculation();
        CooldownCalculation();
        CalculateNumberOfProjectiles();
    }
    //데미지 계산
    private void DamageCalculation()
    {
        damage = weapon.GetComponent().Damage * (1 + character.GetComponent().Damage / 100);
    }
...
    //투사체 수 계산
    private void CalculateNumberOfProjectiles()
    {
        numberOfProjectiles = weapon.GetComponent().NumberOfProjectiles + character.GetComponent().NumberOfProjectiles;
    }

Character


    //캐릭터의 스탯지정
    //예시를 위해 값은 무작위로 넣음
    private int damage = 10;              //피해량
    private int projectileSpeed = 1;     //투사체 속도
    private int duration = 3;            //지속 시간
    private int attackRange = 1;         //공격범위
    private int cooldown = 5;            //쿨타임
    private int numberOfProjectiles = 1;     //투사체 수

    //Get,Set함수 자동 구현
    public int Damage
    {
        get { return damage; }
        set { damage = value; }
    }

Weapon


    //무기의 스탯 지정
    //예시를 위해 값은 무작위로 넣음
    private int damage = 10;              //피해량
    private int projectileSpeed = 1;     //투사체 속도
    private int duration = 3;            //지속 시간
    private int attackRange = 1;         //공격범위
    private int cooldown = 5;            //쿨타임
    private int numberOfProjectiles = 1;     //투사체 수

    private void Update()
    {
        transform.position = transform.position + Vector3.right * totalspeed * Time.deltaTime;   //투사체 위치 갱신
    }
    public void Shoot(int speed)   //계산된 속도 가져오기
    {
        totalspeed = speed;
    }
    //Get,Set함수 자동 구현
    public int Damage
    {
        get { return damage; }
        set { damage = value; }
    }

Monster


    public int health = 100; //몬스터 체력
    public int Health
    {
        get { return health; }
        set { health = value; }
    }

참고 자료

After

준비

  • SkillFiringSystem에 사용할 무기를 순서대로 대입

변화된 점

  • 이론
    1. "Weapon"과 "Character"에서 각각의 스탯 등은 Gamanager를 통해 접근
    2. 무기를 발사할 때마다 "SkillFiringSystem"(스크립트가 적용된 빈 오브젝트)에 피리팹이 등장하도록 무기 개별 스크립트에서 해결 Knife 예시
    3. SkiilFiringSystem은 poolmanager와 마찬가지로 무기 관련 프리팹을 관리하는 cs

스크립

SkillFiringSystem


public class SkillFiringSystem : MonoBehaviour
{
    public GameObject[] weaponPrefabs; //무기 프리팹
    public GameObject[] evolutionWeaponPrefabs; //진화 무기 프리팹
    void Update()
    {
        foreach (var weapon in GameManager.instance.player.GetComponent().Weapons)   //현재 소유중인 무기 가져오기
        {
            Attack(weapon);
        }
    }
    private void Attack(Weapon weapon)  //무기 별로 발사
    {
        switch (weapon.WeaponIndex)
        {
            case 0:     // Whip
                break;
            case 1:     // MagicWand
                break;
            case 2:     // Knife
                if (!weapon.IsMaster()) {
                    GameManager.instance.player.GetComponent().Weapons[GameManager.instance.player.GetComponent().TransWeaponIndex[2]].GetComponent().FireKnife(weaponPrefabs[2]);
                }
                else {
                    GameManager.instance.player.GetComponent().Weapons[GameManager.instance.player.GetComponent().TransWeaponIndex[2]].GetComponent().FireKnife(evolutionWeaponPrefabs[2]);
                }
                break;
            case 3:     // Axe
                break;
            case 4:     // Cross
                break;
            case 5:     //KingBible
                break;
            case 6:     // FireWand
                break;
            case 7:     // Garlic
                GameManager.instance.player.GetComponent().Weapons[GameManager.instance.player.GetComponent().TransWeaponIndex[7]].GetComponent().SpawnGralic(weaponPrefabs[7]);
                break;
            case 8:     // SantaWater
                break;
            case 9:     // Peachone
                break;
            case 10:    // EbonyWings
                break;
            case 11:    // Runetracer
                break;
            case 12:   // LightningRing
                break;
        }
    }
    
}

Weapon

  • 무기 스탯을 리스트화

    private float[] WeaponStats;
    public float[] weaponTotalStats;//Might,Cooldown,ProjectileSpeed, Duration, Amount,AmountLimit,Piercing,Area,MaxLevel
Clone this wiki locally