예제 #1
0
    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();
                }
            }
        }
    }
예제 #2
0
    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();
    }
예제 #3
0
    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();
                }
            }
        }
    }