Skip to content

develop SkillFiringSystem

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

준비

  • 무기를 프리팹 후 무기에 "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; }
    }

추후 필요한 부분

  • 무기 콜라이더가 캐릭터와 부딪히지 않게 하기
  • 몬스터와 무기 딜 계산
  • 무기마다 벡터와 스탯 조정
  • 캐릭터마다 스탯 조정
  • 무기를 얻을 때마다 "SkillFiringSystem"(스크립트가 적용된 빈 오브젝트)가 등장
  • 캐릭터 선택 후 기본 무기와 캐릭터 자동으로 이 스크립트 public변수에 대입
  • 스킬을 얻을 때마다 해당 스킬을 대입한“SkillFiringSystem”(빈 오브젝트)이 새로 등장
  • 장신구 관련 식 조정
  • 투사체 수가 복수일 때 투사체 간의 발사 간격 혹은 차별점

참고 자료

Clone this wiki locally