private void FixedUpdate() { if (!isGameMenu && !isLostControl) { if (!isLockRotate) { horizontalInput = Input.GetAxis(AxisOptions.Horizontal.ToString()); if (Input.GetMouseButton(1)) { plane.SetNormalAndPosition(localDown, transform.position); ray = Camera.ScreenPointToRay(Input.mousePosition); if (plane.Raycast(ray, out hitDist)) { v3 = ray.GetPoint(hitDist); } else { v3 = transform.position + transform.TransformPoint(forward); } if (FlightMode.Sword == currentFlightMode) { isMouseOver = true; OnMouseOver?.Invoke(v3); } rotationEngine.RotateToTargetWithPlaneLimiter(v3); } else if (isMouseOver) { OnMouseOverEnd?.Invoke(); isMouseOver = false; } else if (Mathf.Abs(horizontalInput) > 0) { rotationEngine.Rotate(horizontalInput); } else { rotationEngine.SlowDown(); } } if (!isLockMove) { verticalInput = Input.GetAxis(AxisOptions.Vertical.ToString()); if (verticalInput > 0) { engine.Move(verticalInput); } else if (verticalInput < 0) { engine.Move(verticalInput / 2); } else { engine.SlowDown(); } } } }
private IEnumerator Start() { yield return(new WaitForFixedUpdate()); StartCoroutine(IDestroy()); while (upTime > 0) { upTime -= Time.fixedDeltaTime; engine.Move(1); yield return(new WaitForFixedUpdate()); } while (GetAngleToTarget() > angleToTarget) { if (rocketRigidbody.velocity.magnitude > magnitudeToStartFly) { engine.SlowDown(); } rotationEngine.RotateToTarget(target); yield return(new WaitForFixedUpdate()); } while (rocketRigidbody.angularVelocity.magnitude > angularMagnitudeToStartFly) { rotationEngine.SlowDown(); yield return(new WaitForFixedUpdate()); } while (boostTime > 0) { boostTime -= Time.fixedDeltaTime; engine.Move(1); yield return(new WaitForFixedUpdate()); } while (Vector3.Distance(transform.position, target) > distanceToTarget) { yield return(new WaitForFixedUpdate()); } while (Physics.Raycast(transform.position, (target - transform.position).normalized, Vector3.Distance(target, transform.position), obstacleLayer)) { yield return(new WaitForFixedUpdate()); } propExplosion.BlowUp(); }
private void FixedUpdate() { if (!isControlLock && !isLostControl) // Если управление не отключено { CheckNulls(); if (isShowPathTarget) { ShowPath(); } else if (!isFindEnemy || isMaxDistanceFollow && isFollowTarget && Vector3.Distance(FollowTarget.position, transform.position) > followMaxDistance) // Если цель не найдена или мы должны поддерживать дистанцию до преследуемой цели { if (isFollowTarget) { MoveToFollowTarget(); } else { if (isMoveToPoint) // Если можно двигаться к точке { MoveToPoint(); // Двигаемся к точке } else { Engine.SlowDown(); RotationEngine.SlowDown(); } } if (isFollowEnemy && !isTargetMissed) // Если ИИ ищет цель { if (EnemyTarget != null) { EnemyTargetV3 = EnemyTarget.position; isFindEnemy = FindEnemy(); // Проверяем может ли ИИ увидеть противника } else { isTargetMissed = true; } } } else { if (EnemyTarget != null) { EnemyTargetV3 = EnemyTarget.position; distanceToEnemy = Vector3.Distance(transform.position, EnemyTargetV3); // Получаем дистанцию до цели if (!isFear) // Если не испугался { UpdatePath(EnemyTargetV3); if (Physics.SphereCast(transform.position, 1, (EnemyTargetV3 - transform.position).normalized, out enemyRaycastHitInfo) && enemyRaycastHitInfo.transform.parent == EnemyTarget) { LookAt(EnemyPositionToHit()); // Поворачиваем корабль в сторону цели ProgressiveMoveToTarget(); if (isAttack && AngleTo(EnemyPositionToHit()) < shootAngle && Vector3.Distance(transform.position, EnemyTargetV3) < attackDistance) // Если ИИ может атаковать, и угол до цели, учитывая всё, меньше угла прицеливания { Shoot(); // Стреляем } } else { LookAt(MoveTargetV3 - velocityWithCons()); // Поворачиваем корабль в сторону нужного движения ProgressiveMoveToTarget(); } timeToNextFearNow += Time.deltaTime; if (timeToNextFearNow > timeToNextFear && distanceToEnemy < fearDistance) // Если дистанция до цели меньше минимальной дистанции { timeToNextFearNow = 0; FindBetterPoint(); // Находим лучшую точку isFear = true; // Испуг } } else { if (isAttack && AngleTo(EnemyTargetV3) < shootAngle && Vector3.Distance(transform.position, EnemyTargetV3) < attackDistance) // Если ИИ может атаковать, и угол до цели меньше угла прицеливания { Shoot(); // Стреляем } // Отсчёт страха FearTimeNow += Time.fixedDeltaTime; if (FearTimeNow >= FearTime) { isFear = false; FearTimeNow = 0; } if (isMoveToPoint) { MoveToPoint(); // Двигаемся к точке } else { FindClosestPoint(); isMoveToPoint = true; } } isFindEnemy = distanceToEnemy < lostDistance; // Проверяем не потерял ли ИИ противника if (!isFindEnemy) // Если ИИ потерял противника { LostEnemy(); } } else { isTargetMissed = true; isFindEnemy = false; LostEnemy(); } } } }