Skip to content

develop KingBible

Yoo Hyeokjin edited this page Jul 6, 2023 · 2 revisions

KingBible

목차

설명

  • 주인공 주위를 공전하는 투사체이다. 자세한 설명은 성서에서 알 수 있다.
  • 성서를 구현할 때는 쿨타임이 지나면 instance를 생성하고 지속시간이 지나면 instance를 삭제하는 식으로 구현할 것이다.
  • 주인공을 공전해야 하기 때문에 transform.RotateAround를 사용하려 했지만 속도를 조절하며 해당 함수를 사용하면 무기의 회전이 이상했다.
    이어서 구상한 방법은 하나의 instance를 생성하여 그 instance를 transfrom.Rotate로 자체를 회전시키며 그 안에 성서들의 배치를 일정하게 해준다고 생각하여 구현했다.

Script

코드 설명

  • 코드를 보면 알겠지만 Weapon들은 Weapon.cs를 상속받아서 만들었고 해당 Weapon의 스텟을 WeaponTotalStats[((int)Enums.EWeaponStat.원하는 Stat)]으로 가져올 수 있다.
using UnityEngine;

public class KingBible : Weapon
{
    private GameObject mNewObj;     // 생성한 instance를 저장할 변수
    private bool mbExist = false;   // 생성되었는지 삭제되었는지 확인할 변수
    private float mDistance = 4f;   // 오브젝트와 타겟 사이의 거리
    private float mSpeed = 120f;    // 공전 속도
    private float mTimer = 0;       // 쿨타임과 지속시간을 체크할 타이머 변수

    private void Update()
    {
        transform.parent.transform.position = GameManager.instance.Player.transform.position; // KingBible을 담을 parent instance가 Player 좌표와 일치해야 한다.
        transform.parent.transform.Translate(Vector3.down); // 예쁜 회전을 위해 instance 위치 조정
        transform.parent.transform.Rotate(Vector3.back * mSpeed * WeaponTotalStats[((int)Enums.EWeaponStat.ProjectileSpeed)] * Time.deltaTime / WeaponTotalStats[((int)Enums.EWeaponStat.Amount)]); 
        // KingBible을 담을 parent instance 자체를 회전(일정 속도 * WeaponStat * 시간 동기화 / 성서 개수)
    }
    public override void Attack()
    {
        GameObject objPre; // SkillFiringSystem에 저장한 Weapon Prefab을 저장할 지역 변수
        if (IsEvoluction())
            objPre = SkillFiringSystem.instance.evolutionWeaponPrefabs[WeaponIndex];  // 진화 Weapon
            mbExist = false; // 진화시 지속시간을 생각하지 않고 개별로 쿨타임만 지나면 instance가 생성되도록 하는 코드
        else
            objPre = SkillFiringSystem.instance.weaponPrefabs[WeaponIndex];           // 일반 Weapon

        if(!mbExist && mTimer > WeaponTotalStats[((int)Enums.EWeaponStat.Cooldown)])
        { // KingBible이 존재하지 않고 쿨타임을 넘겼다면
            
            mNewObj = new GameObject("KingBibles"); // KingBible을 담을 parent instance 생성
            mNewObj.transform.parent = GameObject.Find("SkillFiringSystem").transform; // SkillFiringSystem의 자식으로 해당 instance를 넣는다.

            for (int i = 0; i < WeaponTotalStats[((int)Enums.EWeaponStat.Amount)]; i++) // KingBible 투사체 수를 만큼 parent instance에 추가한다.
            {
                GameObject kingBible = Instantiate(objPre); // 가져온 Prefab의 instance를 생성
                kingBible.transform.parent = GameObject.Find("KingBibles").transform; // KingBibles의 자식으로 해당 instance를 넣는다.

                Vector3 rotVec = Vector3.forward * 360 * i / WeaponTotalStats[((int)Enums.EWeaponStat.Amount)]; // KingBible의 개수만큼 원에서 나눠서 좌표 계산
                kingBible.transform.Rotate(rotVec); // 해당 좌표로 이동
                kingBible.transform.Translate(kingBible.transform.up * mDistance, Space.World); // Player에서 공격 범위만큼 떨어뜨림
            }
            mbExist = true; // KingBible이 존재함을 저장
            mTimer = 0;     // 지속시간 확인을 위한 초기화
        }
        else if (mbExist && mTimer > WeaponTotalStats[((int)Enums.EWeaponStat.Duration)])
        { 
            Destroy(mNewObj); // KingBible instance가 존재한다면 삭제
            mbExist = false;  // KingBible이 존재하지 않음을 저장
            mTimer = 0;       // 쿨타임 확인을 위한 초기화
        }
        mTimer += Time.deltaTime;
        
    }
    public override void EvolutionProcess() // 무기 진화시 한 번 호출됨
    {

    }
}

Prefab

다음의 Component를 추가한다.

  • Animator
  • SpriteRenderer
  • Rigidbody2D
  • BoxCollider2D
  • KingBible.cs

다음과 같이 Prefab을 만들어 준다.

image
image

Clone this wiki locally