Beispiel #1
0
    private void SpawnPentagonMoveUpAndDown_Type_A(Transform spawnTr, Transform targetTr)
    {
        EnemyCore enemyCore = m_EnemyManager.SpawnEnemy(EnemyType.Pentagon, spawnTr.position, Quaternion.identity);

        Transform[] enemyFireTransforms = enemyCore.GetEnemyFireTransforms();


        int              bulletDamage     = 10;
        float            bulletSpeed      = 60.0f;
        EntityBulletType EntityBulletType = EntityBulletType.SmallVulcan;

        enemyCore
        .SetInvincible(false)
        .SetPenetrable(false)
        .EventCore()
        .Sequence()
        .AppendActionMoveTo(targetTr.position, 20.0f)
        .Run();

        enemyCore
        .EventCore()
        .Sequence()
        .Wait(1.0f)
        .AppendAttackCornShot(enemyFireTransforms[0], bulletDamage, bulletSpeed, EntityBulletType, 60.0f, 5)
        .Wait(1.0f)
        .AppendAttackCornShot(enemyFireTransforms[0], bulletDamage, bulletSpeed, EntityBulletType, 60.0f, 5)
        .Wait(1.0f)
        .AppendAttackTornadoShot(enemyFireTransforms[0], bulletDamage, 50.0f, EntityBulletType, 25, 0.1f, true, AllyFlag.Enemy, Vector3.down, EventAttack.TornadoShot.Direction.ClockWise)
        .AppendAttackTornadoShot(enemyFireTransforms[0], bulletDamage, 50.0f, EntityBulletType, 25, 0.1f, true, AllyFlag.Enemy, Vector3.down, EventAttack.TornadoShot.Direction.CounterClockWise)
        .Loop(true)
        .Run();
    }
Beispiel #2
0
    private void SpawnPentagonMoveUpAndDown_Type_B(Transform spawnTr, Transform targetTr)
    {
        EnemyCore enemyCore = m_EnemyManager.SpawnEnemy(EnemyType.Pentagon, spawnTr.position, Quaternion.identity);

        Transform[] enemyFireTransforms = enemyCore.GetEnemyFireTransforms();


        int              bulletDamage     = 10;
        float            bulletSpeed      = 50.0f;
        EntityBulletType EntityBulletType = EntityBulletType.SmallVulcan;

        enemyCore
        .SetInvincible(false)
        .SetPenetrable(false)
        .EventCore()
        .Sequence()
        .AppendActionMoveTo(targetTr.position, 20.0f)
        .Run();

        enemyCore
        .EventCore()
        .Sequence()
        .Wait(0.5f)
        .AppendAttackCornShot(enemyFireTransforms[0], bulletDamage, bulletSpeed, EntityBulletType, 0, 1)
        .Wait(0.5f)
        .AppendAttackCornShot(enemyFireTransforms[0], bulletDamage, bulletSpeed, EntityBulletType, 0, 1)
        .Wait(0.5f)
        .AppendAttackCornShot(enemyFireTransforms[0], bulletDamage, bulletSpeed, EntityBulletType, 0, 1)
        .Wait(1.0f)
        .Loop(true)
        .Run();
    }
Beispiel #3
0
    private void SpawnCircleStaying_Type_A(Transform spawnTr)
    {
        EnemyCore enemyCore = m_EnemyManager.SpawnEnemy(EnemyType.Circle, spawnTr.position, Quaternion.identity);

        Transform[] enemyFireTransforms = enemyCore.GetEnemyFireTransforms();

        int              bulletDamage     = 10;
        float            bulletSpeed      = 30.0f;
        EntityBulletType EntityBulletType = EntityBulletType.MediumBean;

        enemyCore
        .EventCore()
        .Sequence()
        .AppendActionMoveBy(new Vector3(0, -20), 5.0f)
        .Wait(12.0f)
        .AppendActionMoveBy(new Vector3(0, 50), 12.5f)
        .Run();

        enemyCore
        .EventCore()
        .Sequence()
        .AppendAttackTornadoShot(enemyFireTransforms[0], bulletDamage, bulletSpeed, EntityBulletType, 30, 0.1f, true, AllyFlag.Enemy, Vector3.down, EventAttack.TornadoShot.Direction.ClockWise)
        .Loop(true)
        .Run();
    }
Beispiel #4
0
 public void Init(GameEntity entity_sender, float speed, EntityBulletType bullet_type)
 {
     sender         = entity_sender;
     movement_speed = speed;
     direction_norm = entity_sender.gameObject.transform.up.normalized;
     rotation_angle = entity_sender.gameObject.transform.eulerAngles.z;
     type           = bullet_type;
 }
    public GameObject SpawnBullet(EntityBulletType type, Vector3 position, Quaternion rotation, EntityCore core, float speed, int damage, Vector3 defaultDirection, AllyFlag allyFlag, bool selfControlled = false, Vector3 noramalizedDirection = default)
    {
        Rect bottomRectangle = new Rect(new Vector2(-15.0f, -15.0f), new Vector2(90.0f, 13.0f));
        Rect topRectangle    = new Rect(new Vector2(-15.0f, 102.0f), new Vector2(90.0f, 13.0f));
        Rect leftRectangle   = new Rect(new Vector2(-15.0f, -15.0f), new Vector2(13.0f, 130.0f));
        Rect rightRectangle  = new Rect(new Vector2(62.0f, -15.0f), new Vector2(13.0f, 130.0f));

        if (bottomRectangle.Contains(position))
        {
            return(null);
        }

        if (topRectangle.Contains(position))
        {
            return(null);
        }

        if (leftRectangle.Contains(position))
        {
            return(null);
        }

        if (rightRectangle.Contains(position))
        {
            return(null);
        }

        GameObject bulletPrefab = GetEnemyBulletPrefabObject(type);

        if (bulletPrefab == null)
        {
            throw new Exception(type.ToString() + "의 불렛프리팹을 가져오는데 실패했습니다");
        }

        GameObject gameObject = Instantiate(bulletPrefab, position, rotation);

        switch (allyFlag)
        {
        case AllyFlag.Player:
            gameObject.SetTagIncludeAllChildren("PlayerBullet");
            break;

        case AllyFlag.Enemy:
            gameObject.SetTagIncludeAllChildren("EnemyBullet");
            break;
        }

        EntityBulletInfo comp = gameObject.AddComponent <EntityBulletInfo>();

        comp.SetSpeed(speed);
        comp.SetSelfControlled(selfControlled);
        comp.SetDamage(damage);
        comp.SetEntityCore(core);
        comp.SetDirection(noramalizedDirection);
        comp.SetDefaultDirection(defaultDirection);
        gameObject.GetComponent <EntityBulletMovementController>().SetEntityBulletInfo(comp);
        return(gameObject);
    }
Beispiel #6
0
    /// <summary>
    /// 子弹是否是循环效果
    /// </summary>
    /// <param name="t"></param>
    /// <returns></returns>
    public static bool IsLoopEffect(EntityBulletType t)
    {
        switch (t)
        {
        case EntityBulletType.LoopEffectLock:
        case EntityBulletType.LoopEffectLink:
            return(true);

        default:
            return(false);
        }
    }
Beispiel #7
0
    /// <summary>
    /// 是否需要发射子弹
    /// </summary>
    /// <param name="t"></param>
    /// <returns></returns>
    public static bool IsFireBullet(EntityBulletType t)
    {
        switch (t)
        {
        case EntityBulletType.Point:
        case EntityBulletType.Target:
            return(true);

        default:
            return(false);
        }
    }
 public AttackAction(MonoBehaviour monoBehaviour, Transform fireTransform, Vector3 defaultDirection, int bulletDamage, float bulletSpeed, EntityBulletType EntityBulletType, AllyFlag allyFlag)
 {
     this.m_MonoBehaviour    = monoBehaviour;
     this.m_Waitor           = new EventWaitor(monoBehaviour);
     this.m_FireTransform    = fireTransform;
     this.m_BulletManager    = ManagerPool.GetInstance().GetManager <BulletManager>();
     this.m_BulletDamage     = bulletDamage;
     this.m_BulletSpeed      = bulletSpeed;
     this.m_EntityBulletType = EntityBulletType;
     this.m_DefaultDirection = defaultDirection;
     this.m_AllyFlag         = allyFlag;
 }
Beispiel #9
0
    /// <summary>
    /// 是否是直接伤害型子弹
    /// </summary>
    /// <param name="t"></param>
    /// <returns></returns>
    public static bool IsDirectDamage(EntityBulletType t)
    {
        switch (t)
        {
        case EntityBulletType.Direct:
        case EntityBulletType.Line:
        case EntityBulletType.LoopEffectLock:
        case EntityBulletType.UnLoopEffectLink:
        case EntityBulletType.LoopEffectLink:
            return(true);

        default:
            return(false);
        }
    }
Beispiel #10
0
    /// <summary>
    /// 设置所有子弹效果的相关属性
    /// </summary>
    /// <param name="t"></param>
    /// <param name="effectPoint">所有效果的发射点(挂载点)</param>
    /// <param name="effectIds">所有效果的ID</param>
    /// <param name="targetPosList">所有目标所在位置</param>
    private void InitBulletEffectAttribute(EntityBulletType t, List <Vector3> effectPoint, List <int> effectIds, List <Vector2> targetPosList)
    {
        switch (Entity.model.bulletType)
        {
        //  对准目标:设置位置、旋转        效果数量:等于挂载点数量
        case EntityBulletType.LoopEffectLock:
        {
            Assert.Should(effectIds.Count == effectPoint.Count);
            //  对准目标则对准所有目标的重心点
            var total_x   = targetPosList.RubyInject(0.0f, (r, p) => p.x + r);
            var total_y   = targetPosList.RubyInject(0.0f, (r, p) => p.y + r);
            var final_pos = new Vector2(total_x / targetPosList.Count, total_y / targetPosList.Count);
            //  所有效果都朝向重心点
            for (int i = 0; i < effectPoint.Count; i++)
            {
                GameEffectManager.Instance.GetEffect(effectIds[i]).SetPositionAndRotation(effectPoint[i], final_pos);
            }
        }
        break;

        //  连接目标:设置位置、旋转、缩放     效果数量:等于挂载点数量 * 目标数量
        case EntityBulletType.LoopEffectLink:
        case EntityBulletType.UnLoopEffectLink:
        {
            Assert.Should(effectIds.Count == effectPoint.Count * targetPosList.Count);
            var basedis = Attacker.model.range;
            Assert.Should(basedis > 0.0f, "invalid range ...");
            //  挂载点和目标点分别连接
            for (int i = 0; i < effectPoint.Count; i++)
            {
                for (int j = 0; j < targetPosList.Count; j++)
                {
                    int effIdx      = i * j;
                    var attackPoint = effectPoint[i];
                    var diff        = Vector2.Distance(new Vector2(attackPoint.x, attackPoint.z), targetPosList[j]);
                    GameEffectManager.Instance.GetEffect(effectIds[effIdx]).SetPositionAndRotationAndScale(effectPoint[i], targetPosList[j], diff / basedis);
                }
            }
        }
        break;

        default:
            break;
        }
    }
    public GameObject GetEnemyBulletPrefabObject(EntityBulletType type)
    {
        switch (type)
        {
        case EntityBulletType.SmallVulcan:
            return(SmallVulcan);

        case EntityBulletType.SmallBean:
            return(SmallBean);

        case EntityBulletType.MediumBean:
            return(MediumBean);

        case EntityBulletType.BigBean:
            return(BigBean);

        case EntityBulletType.MegaBean:
            return(MegaBean);
        }
        return(null);
    }
Beispiel #12
0
    private void SpawnCircleUpLoopFollowing()
    {
        EnemyCore enemyCore = m_EnemyManager.SpawnEnemy(EnemyType.Circle, m_PathHolderList[0][0].position, Quaternion.identity);

        Transform[] enemyFireTransforms = enemyCore.GetEnemyFireTransforms();

        EntityBulletType EntityBulletType = EntityBulletType.MediumBean;
        int   bulletDamage = 10;
        float bulletSpeed  = 50.0f;

        List <Vector3> vectorList = new List <Vector3>();

        for (int i = 0; i < m_PathHolderList[0].Count; i++)
        {
            vectorList.Add(m_PathHolderList[0][i].position);
        }

        enemyCore
        .EventCore()
        .Sequence()
        .AppendActionMovePaths(vectorList.ToArray(), 15.0f)
        .Run();

        enemyCore
        .EventCore()
        .Sequence()
        .Wait(1.5f)
        .AppendAttackCornShot(enemyFireTransforms[1], bulletDamage, bulletSpeed, EntityBulletType, 0f, 1)
        .AppendAttackCornShot(enemyFireTransforms[2], bulletDamage, bulletSpeed, EntityBulletType, 0f, 1)
        .AppendAttackCornShot(enemyFireTransforms[3], bulletDamage, bulletSpeed, EntityBulletType, 0f, 1)
        .AppendAttackCornShot(enemyFireTransforms[4], bulletDamage, bulletSpeed, EntityBulletType, 0f, 1)
        .Wait(1.0f)
        .AppendAttackTornadoShot(enemyFireTransforms[0], bulletDamage, bulletSpeed, EntityBulletType, 10, 0.1f, true, AllyFlag.Enemy, Vector3.down, EventAttack.TornadoShot.Direction.ClockWise)
        .Loop(true)
        .Run();
    }
 public AttackAction SetGuidedShot(Vector3 defaultDirection, int bulletDamage, float bulletSpeed, EntityBulletType EntityBulletType, AllyFlag allyFlag, float shotInterval, int bulletCount, Func <GameObject> targetGetter)
 {
     m_AttackActionType = AttackActionType.TornadoShot;
     m_AttackAction     = new GuidedShot(m_MonoBehaviour, m_FireTransform, defaultDirection, bulletDamage, bulletSpeed, EntityBulletType, allyFlag, bulletCount, shotInterval, targetGetter);
     return(m_AttackAction as GuidedShot);
 }
 public AttackAction SetCornShot(Vector3 defaultDirection, int bulletDamage, float bulletSpeed, EntityBulletType EntityBulletType, AllyFlag allyFlag, float degree, int bulletCount)
 {
     m_AttackActionType = AttackActionType.TornadoShot;
     m_AttackAction     = new CornShot(m_MonoBehaviour, m_FireTransform, defaultDirection, bulletDamage, bulletSpeed, EntityBulletType, allyFlag, degree, bulletCount);
     return(m_AttackAction as TornadoShot);
 }
 public AttackAction SetTornadoShot(Vector3 defaultDirection, int bulletDamage, float bulletSpeed, EntityBulletType EntityBulletType, AllyFlag allyFlag, int bulletCount, float duration, bool followRatation = true, TornadoShot.Direction direction = TornadoShot.Direction.ClockWise)
 {
     m_AttackActionType = AttackActionType.TornadoShot;
     m_AttackAction     = new TornadoShot(m_MonoBehaviour, m_FireTransform, defaultDirection, bulletDamage, bulletSpeed, allyFlag, EntityBulletType, bulletCount, duration, followRatation, direction);
     return(m_AttackAction as TornadoShot);
 }
 public GuidedShot(MonoBehaviour monoBehaviour, Transform fireTransform, Vector3 defaultDirection, int bulletDamage, float bulletSpeed, EntityBulletType EntityBulletType, AllyFlag allyFlag,
                   int bulletCount, float shotInterval, Func <GameObject> targetGetter)
     : base(monoBehaviour, fireTransform, defaultDirection, bulletDamage, bulletSpeed, EntityBulletType, allyFlag)
 {
     this.m_ShotInterval = shotInterval;
     this.m_BulletCount  = bulletCount;
     this.m_TargetGetter = targetGetter;
 }
 public CornShot(MonoBehaviour monoBehaviour, Transform fireTransform, Vector3 defaultDirection, int bulletDamage, float bulletSpeed, EntityBulletType EntityBulletType, AllyFlag allyFlag,
                 float degree, int bulletCount)
     : base(monoBehaviour, fireTransform, defaultDirection, bulletDamage, bulletSpeed, EntityBulletType, allyFlag)
 {
     this.m_Degree      = degree;
     this.m_BulletCount = bulletCount;
 }
Beispiel #18
0
    private void SpawnBoss()
    {
        EnemyCore enemyCore = m_EnemyManager.SpawnEnemy(EnemyType.BossHexagon, new Vector3(30.0f, 107.5f, -5.0f), Quaternion.identity);

        Transform[] enemyFireTransforms = enemyCore.GetEnemyFireTransforms();

        int              bulletDamage     = 10;
        float            bulletSpeed      = 50.0f;
        EntityBulletType EntityBulletType = EntityBulletType.BigBean;

        enemyCore
        .OnDestroyCallBack(() => RemoveTargetedEntity("BOSS"))
        .EventCore()
        .Spawn()
        .AppendActionMovePaths(new Vector3[]
        {
            new Vector3(30.0f, 80.0f, -5.0f),
            new Vector3(20.0f, 70.0f, -5.0f),
            new Vector3(40.0f, 65.0f, -5.0f),
            new Vector3(30.0f, 80.0f, -5.0f),
        }, 20.0f)
        .AppendCallBack(() =>
        {
            enemyCore.EventCore()
            .Wait(1.0f)
            .AppendAttackCornShot(enemyFireTransforms[0], bulletDamage, bulletSpeed, EntityBulletType, 360.0f, 10)
            .Wait(1.0f)
            .AppendAttackCornShot(enemyFireTransforms[1], bulletDamage, bulletSpeed, EntityBulletType, 360.0f, 10)
            .Wait(1.0f)
            .AppendAttackCornShot(enemyFireTransforms[0], bulletDamage, bulletSpeed, EntityBulletType, 360.0f, 10)
            .Wait(1.0f)
            .AppendAttackCornShot(enemyFireTransforms[1], bulletDamage, bulletSpeed, EntityBulletType, 360.0f, 10)
            .Wait(1.0f)
            .AppendAttackCornShot(enemyFireTransforms[0], bulletDamage, bulletSpeed, EntityBulletType, 360.0f, 10)
            .Wait(1.0f)
            .AppendAttackCornShot(enemyFireTransforms[1], bulletDamage, bulletSpeed, EntityBulletType, 360.0f, 10)
            .Wait(1.0f)
            .AppendAttackCornShot(enemyFireTransforms[0], bulletDamage, bulletSpeed, EntityBulletType, 360.0f, 10)
            .Wait(1.0f)
            .AppendAttackCornShot(enemyFireTransforms[1], bulletDamage, bulletSpeed, EntityBulletType, 360.0f, 10)
            .Wait(1.0f)
            .AppendAttackCornShot(enemyFireTransforms[0], bulletDamage, bulletSpeed, EntityBulletType, 360.0f, 10)
            .Wait(1.0f)
            .AppendAttackCornShot(enemyFireTransforms[1], bulletDamage, bulletSpeed, EntityBulletType, 360.0f, 10)

            //
            .Wait(1.0f)
            .AppendAttackCornShot(enemyFireTransforms[0], bulletDamage, bulletSpeed, EntityBulletType, 360.0f, 10)
            .Wait(1.0f)
            .AppendAttackCornShot(enemyFireTransforms[1], bulletDamage, bulletSpeed, EntityBulletType, 360.0f, 10)
            .Wait(1.0f)
            .AppendAttackCornShot(enemyFireTransforms[0], bulletDamage, bulletSpeed, EntityBulletType, 360.0f, 10)
            .Wait(1.0f)
            .AppendAttackCornShot(enemyFireTransforms[1], bulletDamage, bulletSpeed, EntityBulletType, 360.0f, 10)
            .Wait(1.0f)
            .AppendAttackCornShot(enemyFireTransforms[0], bulletDamage, bulletSpeed, EntityBulletType, 360.0f, 10)
            .Wait(1.0f)
            .AppendAttackCornShot(enemyFireTransforms[1], bulletDamage, bulletSpeed, EntityBulletType, 360.0f, 10)
            .Wait(1.0f)
            .AppendAttackCornShot(enemyFireTransforms[0], bulletDamage, bulletSpeed, EntityBulletType, 360.0f, 10)
            .Wait(1.0f)
            .AppendAttackCornShot(enemyFireTransforms[1], bulletDamage, bulletSpeed, EntityBulletType, 360.0f, 10)
            .Wait(1.0f)
            .AppendAttackCornShot(enemyFireTransforms[0], bulletDamage, bulletSpeed, EntityBulletType, 360.0f, 10)
            .Wait(1.0f)
            .AppendAttackCornShot(enemyFireTransforms[1], bulletDamage, bulletSpeed, EntityBulletType, 360.0f, 10)
            .Run();
        })
        .Sequence()
        .Wait(20.0f)
        .AppendActionRotateBy(new Vector3(0, 0, 180.0f), 1.0f)
        .Spawn()
        .AppendAttackTornadoShot(enemyFireTransforms[0], bulletDamage, bulletSpeed, EntityBulletType, 20, 0.1f, false)
        .Sequence()
        .Wait(1.5f)
        .AppendAttackTornadoShot(enemyFireTransforms[1], bulletDamage, bulletSpeed, EntityBulletType, 20, 0.1f, false)
        .Spawn()
        .AppendAttackGuidedShot(enemyFireTransforms[0], bulletDamage, bulletSpeed, EntityBulletType, 30, 0.3f, () => m_PlayerManager.GetPlayer())
        .AppendAttackGuidedShot(enemyFireTransforms[1], bulletDamage, bulletSpeed, EntityBulletType, 30, 0.3f, () => m_PlayerManager.GetPlayer())
        .Sequence().Wait(9.0f)
        .Loop(true)
        .Run();

        AddTargetedEntity("BOSS", enemyCore);
    }
Beispiel #19
0
 /// <summary>
 /// 子弹是否是打直线型
 /// </summary>
 /// <param name="t"></param>
 /// <returns></returns>
 public static bool IsLine(EntityBulletType t)
 {
     return(t == EntityBulletType.Line);
 }
Beispiel #20
0
 /// <summary>
 /// 子弹是否是非循环效果(REMARK:注意 循环效果+非循环效果也不是全部子弹类型、还有发射型等)
 /// </summary>
 /// <param name="t"></param>
 /// <returns></returns>
 public static bool IsUnLoopEffect(EntityBulletType t)
 {
     return(t == EntityBulletType.UnLoopEffectLink);
 }
Beispiel #21
0
    public EntityEventAttackCore AppendAttackTornadoShot(Transform firetransform, int bulletDamage, float bulletSpeed, EntityBulletType type, int bulletCount, float duration, bool followRotation, AllyFlag allyFlag = AllyFlag.Enemy, Vector3?defaultDirection = null, EventAttack.TornadoShot.Direction direction = EventAttack.TornadoShot.Direction.ClockWise)
    {
        if (defaultDirection == null)
        {
            defaultDirection = Vector3.down;
        }

        EventAttack colortoAction = new EventAttack(m_IsSequence, m_MonoBehaviour, firetransform);

        colortoAction.SetTornadoShot(defaultDirection.Value, bulletDamage, bulletSpeed, type, allyFlag, bulletCount, duration, followRotation, direction);
        m_EventList.Enqueue(colortoAction);
        return(this);
    }
Beispiel #22
0
    public EntityEventAttackCore AppendAttackCornShot(Transform firetransform, int bulletDamage, float bulletSpeed, EntityBulletType type, float degree, int bulletCount, AllyFlag allyFlag = AllyFlag.Enemy, Vector3?defaultDirection = null)
    {
        if (defaultDirection == null)
        {
            defaultDirection = Vector3.down;
        }

        EventAttack colortoAction = new EventAttack(m_IsSequence, m_MonoBehaviour, firetransform);

        colortoAction.SetCornShot(defaultDirection.Value, bulletDamage, bulletSpeed, type, allyFlag, degree, bulletCount);
        m_EventList.Enqueue(colortoAction);
        return(this);
    }
Beispiel #23
0
    public EntityEventAttackCore AppendAttackGuidedShot(Transform firetransform, int bulletDamage, float bulletSpeed, EntityBulletType type, int bulletCount, float shotInterval, Func <GameObject> targetGetter, AllyFlag allyFlag = AllyFlag.Enemy, Vector3?defaultDirection = null)
    {
        if (defaultDirection == null)
        {
            defaultDirection = Vector3.down;
        }

        EventAttack colortoAction = new EventAttack(m_IsSequence, m_MonoBehaviour, firetransform);

        colortoAction.SetGuidedShot(defaultDirection.Value, bulletDamage, bulletSpeed, type, allyFlag, shotInterval, bulletCount, targetGetter);
        m_EventList.Enqueue(colortoAction);
        return(this);
    }
Beispiel #24
0
 public void SetBullet(EntityBulletType type, float speed)
 {
     m_bulletType  = type;
     m_bulletSpeed = speed;
 }
 public void SetEntityBulletType(EntityBulletType EntityBulletType) => m_EntityBulletType = EntityBulletType;
        private bool m_FollowRotation; //공격방향에따라 회전할지

        public TornadoShot(MonoBehaviour monoBehaviour, Transform fireTransform, Vector3 defaultDirection, int bulletDamage, float bulletSpeed, AllyFlag allyFlag, EntityBulletType EntityBulletType,
                           int bulletCount, float duration, bool followRotation, Direction direction = Direction.ClockWise) :
            base(monoBehaviour, fireTransform, defaultDirection, bulletDamage, bulletSpeed, EntityBulletType, allyFlag)
        {
            this.m_BulletCount    = bulletCount;
            this.m_Duration       = duration;
            this.m_Direction      = direction;
            this.m_FollowRotation = followRotation;
        }
    private void FireUltimate()
    {
        GameObject playerObject = m_PlayerManager.GetPlayer();

        switch (m_PlayerGun.GetPlayerUltimateType())
        {
        case PlayerUltimateType.Plane:
        {
            /* 울티메이트 플레인 공격지점 인덱스 위 -> 아래 그리고 왼쪽 -> 오른쪽 순으로 시작됨
             *
             *             '(0)
             *         '(1)    '(2)
             *     '(3)             '(4)
             * '(5)                     '(6)
             *
             */

            GameObject         ultimateObject = Instantiate(m_UltimatePlane, new Vector3(playerObject.transform.position.x, -10.0f, -5.0f), Quaternion.Euler(0.0f, 0.0f, 0.0f));
            PlayerUltimateCore ultimateCore   = ultimateObject.GetComponent <PlayerUltimateCore>().SetHp <PlayerUltimateCore>(1500);
            Transform[]        fireTransforms = ultimateCore.GetUltimateFireTransforms();

            int              bulletDamage     = 10;
            float            bulletSpeed      = 100.0f;
            Vector3          defaultDirection = Vector3.up;
            EntityBulletType bulletType       = EntityBulletType.SmallBean;
            AllyFlag         allyFlag         = AllyFlag.Player;


            DOTween.Sequence()
            .AppendCallback(() =>
                {
                    m_PlayerManager.SetPlayerUltimateCount(m_PlayerManager.GetPlayerUltimateCount() - 1);
                    m_PlayerManager.GetPlayerGun()?.SetUltimateEnabled(false);
                    m_PlayerManager.SetIsInvincible(true);
                    playerObject.transform.position = new Vector3(
                        playerObject.transform.position.x,
                        playerObject.transform.position.y,
                        -6.0f
                        );
                })
            .Append(playerObject.transform.DOScale(new Vector3(2.0f, 2.0f, 1.0f), 1.0f))
            .Insert(0.0f, playerObject.transform.DOBlendableRotateBy(new Vector3(160.0f, 0.0f), 1.0f))
            .Append(playerObject.transform.DOBlendableRotateBy(new Vector3(200.0f, 0.0f), 1.3f))
            .Insert(1.0f, playerObject.transform.DOScale(new Vector3(1.0f, 1.0f, 1.0f), 1.0f))
            .AppendInterval(0.6f)
            .AppendCallback(() =>
                {
                    m_PlayerManager.SetIsInvincible(false);
                    playerObject.transform.position = new Vector3(
                        playerObject.transform.position.x,
                        playerObject.transform.position.y,
                        -5.0f
                        );
                })
            .Play();


            EntityEventAttackCore eventCore = ultimateCore
                                              .OnDestroyCallBack(() => m_PlayerManager.GetPlayerGun()?.SetUltimateEnabled(true))
                                              .EventCore()
                                              .AppendActionMoveTo(playerObject.transform.position, 2.0f)
                                              .Spawn()
                                              .AppendActionMoveBy(new Vector3(0.0f, 200.0f), 40.0f)
                                              .Sequence();

            for (int i = 0; i < 40; i++)
            {
                eventCore
                .AppendAttackCornShot(fireTransforms[0], bulletDamage, bulletSpeed, bulletType, 0.0f, 1, allyFlag, defaultDirection)
                .AppendAttackCornShot(fireTransforms[1], bulletDamage, bulletSpeed, bulletType, 0.0f, 1, allyFlag, defaultDirection)
                .AppendAttackCornShot(fireTransforms[2], bulletDamage, bulletSpeed, bulletType, 0.0f, 1, allyFlag, defaultDirection)
                .AppendAttackCornShot(fireTransforms[3], bulletDamage, bulletSpeed, bulletType, 0.0f, 1, allyFlag, defaultDirection)
                .AppendAttackCornShot(fireTransforms[4], bulletDamage, bulletSpeed, bulletType, 0.0f, 1, allyFlag, defaultDirection)
                .AppendAttackCornShot(fireTransforms[5], bulletDamage, bulletSpeed, bulletType, 0.0f, 1, allyFlag, defaultDirection)
                .AppendAttackCornShot(fireTransforms[6], bulletDamage, bulletSpeed, bulletType, 0.0f, 1, allyFlag, defaultDirection)
                .Wait(0.5f);
            }

            eventCore.Run();
        }
        break;

        default:
            break;
        }
    }