Skip to content

develop SkillFiringSystem

Seong Hyeok OH edited this page Jan 15, 2023 · 28 revisions

준비

  • 발사 시스템을 이용하기 위해 무기를 프리팹 후 무기에 "Weapon"과 캐릭터 추가 스탯, 캐릭터 패시브, 캐릭터 고유 무기 등이 포함된 코드, 총 2개가 필요하다.

알아야하는 부분

  • 이론: 무기에 관한 세세한 내용을 구현 후 "Weapon"에 넣고, 캐릭터에 세세한 내용을 구현 후 "Character"에 구현 후 (여러 무기 캐릭터의 스크립트를 적용을 가져오기 위해 상위 스크립트로 묶기) -> "Weapon"과 "Character"에서 각각의 스탯을 가져와 "SkillFiringSystem"에 적용

스크립

SkillFiringSystem


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


    //ToDo: attackRange을 적용하기
    private void FireWeapon()
    {
        float timer = 0;    //시간
        float timediff = cooldown;  //쿨타임
        GameObject monster = GameObject.Find("Monster");

        timer += Time.deltaTime;    //시간 갱신

        if (timer > timediff)   //쿨타임 넘을 시
        {
            GameObject newobs = Instantiate(weapon);  //무기 로드
            newobs.transform.position = new Vector2(character.GetComponent().Movement.x, character.GetComponent().Movement.y);  //캐릭터 위치에 생성
            transform.position = Vector2.right * projectileSpeed * Time.deltaTime;  //오른쪽 벡터로 날아감
            timer = 0;  //시간 초기화
            Destroy(newobs, duration);  //지속 시간 지나면 삭제
        }

        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);    //임펙트 등장 시간
            }
        }
    }


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


    //아래 계산을 한번에 하기
    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;     //투사체 수

    //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; }
    }

추후 필요한 부분

참고 자료

Clone this wiki locally