예제 #1
0
        /// <summary>
        /// 몬스터를 생성한다.
        /// </summary>
        /// <typeparam name="T">생성할 몬스터 타입</typeparam>
        /// <param name="spawnPoint">생서할 위치</param>
        /// <param name="pattern">베지어 곡선에 넣을 패턴</param>
        /// <param name="destination">베지어 곡선에 넣을 도착지점</param>
        /// <returns>생성한 오브젝트</returns>
        public T SpawnEnemy <T>(StartPoint spawnPoint, WayPoints.ShapeTypeTable pattern, Transform destination) where T : GameObject, new()
        {
            T enemy = GameObject.Instantiate <T>();

            BezierCurveMove moveType = enemy.GetComponent <BezierCurveMove>();

            if (moveType != null)
            {
                moveType.WayPoints   = WayPoints.Instance.GetWayPoint(GetLocation(spawnPoint), pattern);
                moveType.Destination = destination;
            }
            return(enemy);
        }
        /// <summary>
        /// 공격을 실행한다.
        /// 공격을 실행할 갯수를 정하고
        /// 공격 형태를 랜덤으로 정하여 이동경로를 정해준다.
        /// </summary>
        public async void Attack()
        {
            int maxAttackUnit = 2;

            if (GameManager.Instance.CurrentStage < random.Next(100))
            {
                maxAttackUnit += random.Next(1, 3);
            }
            if (maxAttackUnit > aliveUnits.Count)
            {
                maxAttackUnit = aliveUnits.Count;
            }

            int addAttackUnitCount = 0;

            for (int i = 0; i < aliveUnits.Count; i++)
            {
                bool alreadyAttacking = false;
                foreach (var item in attackingUnits)
                {
                    if (aliveUnits[i] == item)
                    {
                        alreadyAttacking = true;
                    }
                }
                if (alreadyAttacking == false && addAttackUnitCount < maxAttackUnit)
                {
                    addAttackUnitCount++;
                    attackingUnits.Add(aliveUnits[i]);
                    BezierCurveMove move = aliveUnits[i].GetComponent <BezierCurveMove>();


                    WayPoints.ShapeTypeTable attackType = WayPoints.ShapeTypeTable.kSwingLeftDown;
                    StartPoint reattackPosition         = StartPoint.LeftTop;

                    switch (random.Next(2))
                    {
                    case 0:
                        attackType = WayPoints.ShapeTypeTable.kSwingLeftDown;
                        break;

                    case 1:
                        attackType = WayPoints.ShapeTypeTable.kSwingRightDown;
                        break;
                    }


                    switch (random.Next(2))
                    {
                    case 0:
                        reattackPosition = StartPoint.LeftTop;
                        break;

                    case 1:
                        reattackPosition = StartPoint.RightTop;
                        break;
                    }


                    move.WayPoints       = WayPoints.Instance.GetWayPoint(aliveUnits[i].transform.position, attackType);
                    move.CurrentProgress = 0;
                    move.Destination     = null;

                    Action handler = null;
                    handler = () =>
                    {
                        move.EventMoveDone  -= handler;
                        move.WayPoints       = WayPoints.Instance.GetWayPoint(Spawner.Instance.GetLocation(reattackPosition), attackType);
                        move.CurrentProgress = 0;

                        move.EventMoveDone += () => move.CurrentProgress = 0;
                    };
                    move.EventMoveDone += handler;



                    await Task.Delay(500);
                }
            }
            AttackReady = true;
        }