コード例 #1
0
    void Update()
    {
        base.Update();

        if (HP.isDead)
        {
            Destroy(this);
        }
        //print("tgt " + target);
        CurrTarget = CalculateTarget();

        if (CurrTarget != null && TgtScript == null)
        {
            TgtScript = CurrTarget.GetComponent <Movement>();
        }

        //PERSEGUINDO/ATACANDO
        if (CurrTarget != null && TgtScript != null)
        {
            if (TgtScript.isDead)
            {
                CurrTarget = null;
                TgtScript  = null;
            }
            else
            {
                LookAtTarget();

                if (!isAttacking)
                {
                    //Raio de ataque
                    if ((CurrTarget.transform.position - transform.position).magnitude <= navAgent.stoppingDistance)
                    {
                        Stop();
                        claws.Attack();
                    }
                    else
                    {
                        Chase();
                    }
                }
            }
        }
        //PATRULHANDO/PARADO
        else
        {
            Stop();
        }
    }
コード例 #2
0
ファイル: Agent.cs プロジェクト: TheHoester/CodeSamples
        /// <summary>
        /// Logic for when the AI is in the AttackTarget state. Will make sure target is still a valid one at try to deal damage.
        /// If the target is no longer valid it will try to reaquire it or find a new target.
        /// </summary>
        private void StateCheckAttackTarget()
        {
            if (!IsTargetAlive())
            {
                SetToIdle();
                return;
            }

            if (!CheckLineOfSight())
            {
                if (!IsInCover)
                {
                    SetToMoving();
                }
                else
                {
                    SetToIdle();
                }
                return;
            }

            if (CheckInRange(CurrTarget.Trans.position, CurrWeapon.Range))
            {
                if (CurrCoverType == CoverType.No || CurrCoverType == CoverType.Up)
                {
                    trans.LookAt(CurrTarget.Trans);
                }

                if (fireTimer >= CurrWeapon.FireRate && (CurrWeapon.Type != WeaponType.rifle || CurrWeapon.CanFireBurst()))
                {
                    bool isTargetInCover = CurrTarget.IsInCover;

                    // Check if they are flanking
                    if (isTargetInCover)
                    {
                        Vector3 startPos  = trans.position + (Vector3.up * GUNSHOTDIST);
                        Vector3 direction = CurrTarget.Trans.position + (Vector3.up * INCOVERDIST) - startPos;
                        direction.Normalize();

                        Ray        ray = new Ray(startPos, direction);
                        RaycastHit hit;
                        if (Physics.Raycast(ray, out hit, 1000))
                        {
                            if (hit.collider.gameObject.GetInstanceID() == CurrTarget.gameObject.GetInstanceID())
                            {
                                isTargetInCover = false;
                            }
                        }
                    }

                    if (CurrWeapon.GetRandomAccuracy(isTargetInCover, Vector3.Distance(CurrTarget.Trans.position, trans.position)))
                    {
                        float damage = CurrWeapon.GetDamage(critChanceModifier);
                        CurrTarget.TakeDamage(damage, this);
                        PopupTextManager.Instance.NewPopupText(damage.ToString("F2"), CurrTarget.Trans.position, Color.red);
                    }
                    else
                    {
                        PopupTextManager.Instance.NewPopupText("Missed", CurrTarget.Trans.position, Color.red);
                    }

                    CurrWeapon.PlayGunshot();
                    BulletHandler.Instance.CreateBullet(currWeapon.transform.position, GetSightCheckPosition(CurrTarget.transform, CurrTarget.CoverNormal, CoverType.No));

                    if (CurrWeapon.Type != WeaponType.rifle || CurrWeapon.FinishedBurst())
                    {
                        fireTimer = 0.0f;
                    }
                }
            }
            else
            {
                if (!IsInCover)
                {
                    SetToMoving();
                }
                else
                {
                    SetToIdle();
                }
            }
        }