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