Esempio n. 1
0
    void Update()
    {
        if (character == null)
        {
            return;
        }

        //随机播放声音
        if (Time.time > soundTime + soundTimeDuration)
        {
            character.PlayIdleSound();
            soundTimeDuration = Random.Range(0, IdleSoundDelay);
            soundTime         = Time.time;
        }

        if (!isServer || !character.IsAlive)
        {
            return;
        }

        float fps   = (1 / Time.deltaTime);
        float delay = (fps / AIUpdateRate) * Time.deltaTime;

        currentDistanceWeapon = character.PrimaryWeaponDistance;
        if (currentDistanceWeapon > DistanceAttack)
        {
            currentDistanceWeapon = DistanceAttack;
        }

        if (Time.time > timeTmp + delay)
        {
            //随时间而更新
            timeTmp = Time.time;
            character.isSeeAround = UnitZ.aiManager.IsPlayerAround(this.transform.position, SyncDistance);

            float distance = Vector3.Distance(PositionTarget, this.gameObject.transform.position);

            //如果目标存在
            if (ObjectTarget != null)
            {
                DamageManager targetdamagemanager = ObjectTarget.GetComponent <DamageManager>();
                PositionTarget = ObjectTarget.transform.position;
                Debug.DrawLine(this.transform.position, PositionTarget, Color.blue);

                Vector3 noise = new Vector3(Random.Range(-100, 100) / 100.0f, Random.Range(-100, 100) / 100.0f, Random.Range(-100, 100) / 100.0f) * (Accuracy - 1);
                if (Pointer != null)
                {
                    Pointer.forward = ((PositionTarget + noise + (Vector3.up * Random.Range(0, 100) / 100.0f)) - Pointer.position).normalized;
                }

                if (aiTime <= 0)
                {
                    aiState = Random.Range(0, 4);
                    aiTime  = Random.Range(1, CombatTime);

                    if (distance < DistanceKill)
                    {
                        //如果目标距离很近,AI只能站立或者射击。
                        aiState = Random.Range(0, 2);
                    }

                    if (aiState == 0)
                    {
                        //站立
                        PositionMove = this.transform.position;
                    }

                    if (aiState == 1 || aiState == 2)
                    {
                        //移动到安全区
                        PositionMove = getRandomGo();
                    }
                }
                else
                {
                    aiTime -= (1 / AIUpdateRate);
                }

                //远距离攻击
                if (distance <= currentDistanceWeapon)
                {
                    //如果AI看到一个可射击的目标
                    if (canSeeTarget(Pointer.transform.position, ObjectTarget))
                    {
                        if (aiState == 0)
                        {
                            //站立射击
                            Attack();
                            PositionMove    = this.transform.position;
                            targetDirection = (PositionTarget - this.transform.position);
                        }
                        if (aiState == 1)
                        {
                            //移动射击
                            Attack();
                            PositionMove    = positionMoveTmp;
                            targetDirection = (PositionTarget - this.transform.position);
                        }

                        if (aiState == 2)
                        {
                            isShooting = false;
                            //跑到安全区袭击后来者
                            PositionMove    = positionMoveTmp;
                            targetDirection = navAgent.desiredVelocity.normalized;
                        }
                        timeTmpLoseTarget = Time.time;
                    }
                    else
                    {
                        if (aiState != 2)
                        {
                            //如果看不到目标,就去寻找目标
                            PositionMove = PositionTarget;
                        }

                        targetDirection = navAgent.desiredVelocity.normalized;
                        isShooting      = false;

                        //如果一段时间看不到目标,AI就失去目标
                        if (Time.time >= timeTmpLoseTarget + TimeLoseTarget)
                        {
                            ObjectTarget = null;
                            return;
                        }
                    }
                }
                else
                {
                    //如果目标距离比移动距离更近,AI可以移动到目标
                    if (distance <= DistanceMoveTo)
                    {
                        if (aiState == 0)
                        {
                            //战力等待
                            Attack();
                            PositionMove    = this.transform.position;
                            targetDirection = (PositionTarget - this.transform.position);
                        }
                        if (aiState == 1)
                        {
                            //移动到目标
                            PositionMove    = PositionTarget;
                            targetDirection = (PositionTarget - this.transform.position);
                        }

                        if (aiState == 2)
                        {
                            //跑到安全区
                            PositionMove    = positionMoveTmp;
                            targetDirection = navAgent.desiredVelocity.normalized;
                        }
                    }
                    else
                    {
                        //如果目标距离过远,就失去目标
                        ObjectTarget = null;
                        aiState      = 0;
                    }
                }
                if (targetdamagemanager && !targetdamagemanager.IsAlive)
                {
                    ObjectTarget = null;
                    aiState      = 0;
                }

                SetDestination(PositionMove);
            }
            else
            {
                isShooting = false;
                //当战斗启用时,AI可以搜寻并攻击目标
                if (Fighting)
                {
                    ObjectTarget = findTarget();
                }

                if (ObjectTarget != null)
                {
                    aiState = 0;
                    return;
                }

                if (aiState == 0)
                {
                    //aistate=0 意味着AI是自由的,可以移动到任何地方
                    aiState        = 1;
                    aiTime         = Random.Range(1, IdleTime);
                    PositionTarget = getRandomGo();
                    PositionMove   = PositionTarget;
                    SetDestination(PositionMove);
                }
                if (aiTime <= 0)
                {
                    //随机AI状态
                    aiState = 0;
                }
                else
                {
                    aiTime -= (1 / AIUpdateRate);
                }
                //面对其他方向
                targetDirection = navAgent.desiredVelocity.normalized;
            }
            if (!LockTarget)
            {
                findTarget();
            }
        }

        attacking();

        Quaternion targetRotation = this.transform.rotation;

        //旋转视角看目标
        if (targetDirection != Vector3.zero)
        {
            targetRotation     = Quaternion.LookRotation(targetDirection);
            targetRotation.x   = 0;
            targetRotation.z   = 0;
            transform.rotation = Quaternion.Lerp(transform.rotation, targetRotation, TurnSpeed * Time.deltaTime);
        }

        if (navAgent)
        {
            Debug.DrawLine(this.transform.position, PositionMove, Color.green);
            navAgent.speed = character.GetCurrentMoveSpeed();
        }
    }
Esempio n. 2
0
    void Update()
    {
        if (character == null)
        {
            return;
        }

        // random play an idle sound.
        if (Time.time > soundTime + soundTimeDuration)
        {
            character.PlayIdleSound();
            soundTimeDuration = Random.Range(0, IdleSoundDelay);
            soundTime         = Time.time;
        }

        // get attack distance from primary weapon.
        DistanceAttack = character.PrimaryWeaponDistance;

        float      distance        = Vector3.Distance(PositionTarget, this.gameObject.transform.position);
        Vector3    targetDirectiom = (PositionTarget - this.transform.position);
        Quaternion targetRotation  = this.transform.rotation;
        float      str             = TurnSpeed * Time.time;

        // rotation to look at a target
        if (targetDirectiom != Vector3.zero)
        {
            targetRotation     = Quaternion.LookRotation(targetDirectiom);
            targetRotation.x   = 0;
            targetRotation.z   = 0;
            transform.rotation = Quaternion.Lerp(transform.rotation, targetRotation, str);
        }

        // if Target is exist
        if (ObjectTarget != null)
        {
            //	lifeTimeTemp = Time.time;
            PositionTarget = ObjectTarget.transform.position;
            if (aiTime <= 0)
            {
                //aiState = Random.Range (0, 4);
                aiTime = Random.Range(10, 100);
            }
            else
            {
                aiTime--;
            }

            //Debug.Log(distance + "<="+ DistanceAttack);
            // attack only distance.
            if (distance <= DistanceAttack)
            {
//				Debug.Log("Attack : "+targetDirectiom);
                Attack(targetDirectiom);
            }
            else
            {
                if (distance <= DistanceMoveTo)
                {
                    // rotation facing to a target.
                    transform.rotation = Quaternion.Lerp(transform.rotation, targetRotation, str);
                }
                else
                {
                    // if target is out of distance
                    ObjectTarget = null;
                    if (aiState == 0)
                    {
                        aiState        = 1;
                        aiTime         = Random.Range(10, 500);
                        PositionTarget = positionTemp + new Vector3(Random.Range(-PatrolRange, PatrolRange), 0, Random.Range(-PatrolRange, PatrolRange));
                    }
                }
            }
        }
        else
        {
            float length = float.MaxValue;

            for (int t = 0; t < TargetTag.Length; t++)
            {
                // Finding all the targets by Tags.
                GameObject[] targets = (GameObject[])GameObject.FindGameObjectsWithTag(TargetTag [t]);
                if (targets != null && targets.Length > 0)
                {
                    for (int i = 0; i < targets.Length; i++)
                    {
                        float distancetargets = Vector3.Distance(targets [i].gameObject.transform.position, this.gameObject.transform.position);
                        if ((distancetargets <= length && (distancetargets <= DistanceMoveTo || distancetargets <= DistanceAttack)) && ObjectTarget != targets [i].gameObject)
                        {
                            length       = distancetargets;
                            ObjectTarget = targets [i].gameObject;
                        }
                    }
                }
            }
            if (aiState == 0)
            {
                // AI state == 0 mean AI is free, so moving to anywhere
                aiState        = 1;
                aiTime         = Random.Range(10, 200);
                PositionTarget = positionTemp + new Vector3(Random.Range(-PatrolRange, PatrolRange), 0, Random.Range(-PatrolRange, PatrolRange));
            }
            if (aiTime <= 0)
            {
                // random AI state
                aiState = Random.Range(0, 4);
                aiTime  = Random.Range(10, 200);
            }
            else
            {
                aiTime--;
            }
        }
        character.MoveToPosition(PositionTarget);
    }
    void Update()
    {
        if (character == null)
        {
            return;
        }

        // random play an idle sound.
        if (Time.time > soundTime + soundTimeDuration)
        {
            character.PlayIdleSound();
            soundTimeDuration = Random.Range(0, IdleSoundDelay);
            soundTime         = Time.time;
        }
        if (isServer && character.IsAlive)
        {
            float fps   = (1 / Time.deltaTime);
            float delay = (fps / AIUpdateRate) * Time.deltaTime; // calculate delay of sending

            if (Time.time > timeTmp + delay)
            { // sending by time
                timeTmp = Time.time;
                character.isServerControl = true;
                // get attack distance from primary weapon.
                DistanceAttack = character.PrimaryWeaponDistance;

                float distance = Vector3.Distance(PositionTarget, this.gameObject.transform.position);
                targetDirectiom = (PositionTarget - this.transform.position);

                Quaternion targetRotation = this.transform.rotation;
                float      str            = TurnSpeed * Time.time;
                // rotation to look at a target
                if (targetDirectiom != Vector3.zero)
                {
                    targetRotation     = Quaternion.LookRotation(targetDirectiom);
                    targetRotation.x   = 0;
                    targetRotation.z   = 0;
                    transform.rotation = Quaternion.Lerp(transform.rotation, targetRotation, str);
                }

                // if Target is exist
                if (ObjectTarget != null)
                {
                    DamageManager targetdamagemanager = ObjectTarget.GetComponent <DamageManager>();
                    PositionTarget = ObjectTarget.transform.position;
                    if (aiTime <= 0)
                    {
                        aiState = Random.Range(0, 4);
                        aiTime  = Random.Range(10, 100);
                    }
                    else
                    {
                        aiTime--;
                    }

                    // attack in distance.
                    if (distance <= DistanceAttack)
                    {
                        if (aiState == 0 || BrutalMode)
                        {
                            Attack(targetDirectiom);
                        }
                    }
                    else
                    {
                        if (distance <= DistanceMoveTo)
                        {
                            // rotation facing to a target.
                            transform.rotation = Quaternion.Lerp(transform.rotation, targetRotation, str);
                        }
                        else
                        {
                            // if target is out of distance
                            ObjectTarget = null;
                            if (aiState == 0)
                            {
                                aiState        = 1;
                                aiTime         = Random.Range(10, 500);
                                PositionTarget = positionTemp + new Vector3(Random.Range(-PatrolRange, PatrolRange), 0, Random.Range(-PatrolRange, PatrolRange));
                            }
                        }
                    }
                    if (targetdamagemanager && !targetdamagemanager.IsAlive)
                    {
                        ObjectTarget = null;
                    }
                }
                else
                {
                    float length = float.MaxValue;

                    for (int t = 0; t < TargetTag.Length; t++)
                    {
                        // Finding all the targets by Tags.
                        TargetCollector targetget = UnitZ.aiManager.FindTargetTag(TargetTag[t]);
                        if (targetget != null)
                        {
                            GameObject[] targets = targetget.Targets;
                            if (targets != null && targets.Length > 0)
                            {
                                for (int i = 0; i < targets.Length; i++)
                                {
                                    DamageManager targetdamagemanager = targets[i].GetComponent <DamageManager>();
                                    if (targetdamagemanager != null && targetdamagemanager.IsAlive)
                                    {
                                        float distancetargets = Vector3.Distance(targets[i].gameObject.transform.position, this.gameObject.transform.position);
                                        if ((distancetargets <= length && (distancetargets <= DistanceMoveTo || distancetargets <= DistanceAttack || RushMode)) && ObjectTarget != targets[i].gameObject)
                                        {
                                            length       = distancetargets;
                                            ObjectTarget = targets[i].gameObject;
                                        }
                                    }
                                }
                            }
                        }
                    }
                    if (aiState == 0)
                    {
                        // AI state == 0 mean AI is free, so moving to anywhere
                        aiState        = 1;
                        aiTime         = Random.Range(10, 200);
                        PositionTarget = positionTemp + new Vector3(Random.Range(-PatrolRange, PatrolRange), 0, Random.Range(-PatrolRange, PatrolRange));
                    }
                    if (aiTime <= 0)
                    {
                        // random AI state
                        aiState = Random.Range(0, 4);
                        aiTime  = Random.Range(10, 200);
                    }
                    else
                    {
                        aiTime--;
                    }
                }
            }
            if (navAgent)
            {
                navAgent.SetDestination(PositionTarget);
                navAgent.speed = character.GetCurrentMoveSpeed();
            }
        }
    }
    void Update()
    {
        if (character == null)
        {
            return;
        }

        // random play an idle sound.
        if (Time.time > soundTime + soundTimeDuration)
        {
            character.PlayIdleSound();
            soundTimeDuration = Random.Range(0, IdleSoundDelay);
            soundTime         = Time.time;
        }

        if (!isServer || !character.IsAlive)
        {
            return;
        }

        float fps   = (1 / Time.deltaTime);
        float delay = (fps / AIUpdateRate) * Time.deltaTime;

        currentDistanceWeapon = character.PrimaryWeaponDistance;
        if (currentDistanceWeapon > DistanceAttack)
        {
            currentDistanceWeapon = DistanceAttack;
        }

        if (Time.time > timeTmp + delay)
        {
            // update by time
            timeTmp = Time.time;
            float distance = Vector3.Distance(PositionTarget, this.gameObject.transform.position);

            // if Target is exist
            if (ObjectTarget != null)
            {
                DamageManager targetdamagemanager = ObjectTarget.GetComponent <DamageManager>();
                PositionTarget = ObjectTarget.transform.position;
                Debug.DrawLine(this.transform.position, PositionTarget, Color.blue);

                Vector3 noise = new Vector3(Random.Range(-100, 100) / 100.0f, Random.Range(-100, 100) / 100.0f, Random.Range(-100, 100) / 100.0f) * (Accuracy - 1);
                if (Pointer != null)
                {
                    Pointer.forward = ((PositionTarget + noise + (Vector3.up * Random.Range(0, 100) / 100.0f)) - Pointer.position).normalized;
                }

                if (aiTime <= 0)
                {
                    aiState = Random.Range(0, 4);
                    aiTime  = Random.Range(1, CombatTime);

                    if (distance < DistanceKill)
                    {
                        // if target distance is closer than Distanc Kill, AI can only stand attack or move attack
                        aiState = Random.Range(0, 2);
                    }

                    if (aiState == 0)
                    {
                        // stand
                        PositionMove = this.transform.position;
                    }

                    if (aiState == 1 || aiState == 2)
                    {
                        // move to safe zone
                        PositionMove = getRandomGo();
                    }
                }
                else
                {
                    aiTime -= (1 / AIUpdateRate);
                }

                // attack in distance.
                if (distance <= currentDistanceWeapon)
                {
                    // if see a target AI can attack
                    if (canSeeTarget(Pointer.transform.position, ObjectTarget))
                    {
                        if (aiState == 0)
                        {
                            // stand and attack
                            Attack();
                            PositionMove    = this.transform.position;
                            targetDirection = (PositionTarget - this.transform.position);
                        }
                        if (aiState == 1)
                        {
                            // move and attack
                            Attack();
                            PositionMove    = positionMoveTmp;
                            targetDirection = (PositionTarget - this.transform.position);
                        }

                        if (aiState == 2)
                        {
                            isShooting = false;
                            // run to safe zone then attack later
                            PositionMove    = positionMoveTmp;
                            targetDirection = navAgent.desiredVelocity.normalized;
                        }
                        timeTmpLoseTarget = Time.time;
                    }
                    else
                    {
                        if (aiState != 2)
                        {
                            // if cannot see a target, AI will go to finding a target
                            PositionMove = PositionTarget;
                        }

                        targetDirection = navAgent.desiredVelocity.normalized;
                        isShooting      = false;

                        // if cannot see a target for a while, AI lose Target
                        if (Time.time >= timeTmpLoseTarget + TimeLoseTarget)
                        {
                            ObjectTarget = null;
                            return;
                        }
                    }
                }
                else
                {
                    // if target distance is closer than move to distance AI can move to a target
                    if (distance <= DistanceMoveTo)
                    {
                        if (aiState == 0)
                        {
                            // stand and wait
                            //Attack();
                            PositionMove    = this.transform.position;
                            targetDirection = (PositionTarget - this.transform.position);
                        }
                        if (aiState == 1)
                        {
                            // move to target
                            PositionMove    = PositionTarget;
                            targetDirection = (PositionTarget - this.transform.position);
                        }

                        if (aiState == 2)
                        {
                            // run to safe zone
                            PositionMove    = positionMoveTmp;
                            targetDirection = navAgent.desiredVelocity.normalized;
                        }
                    }
                    else
                    {
                        // if target is out of distance, lose target
                        ObjectTarget = null;
                        aiState      = 0;
                    }
                }
                if (targetdamagemanager && !targetdamagemanager.IsAlive)
                {
                    ObjectTarget = null;
                    aiState      = 0;
                }

                SetDestination(PositionMove);
            }
            else
            {
                isShooting = false;
                // AI can seek and attack a target when Fighting is Enabled
                if (Fighting)
                {
                    ObjectTarget = findTarget();
                }

                if (ObjectTarget != null)
                {
                    aiState = 0;
                    return;
                }

                if (aiState == 0)
                {
                    // AI state == 0 mean AI is free, so moving to anywhere
                    aiState        = 1;
                    aiTime         = Random.Range(1, IdleTime);
                    PositionTarget = getRandomGo();
                    PositionMove   = PositionTarget;
                    SetDestination(PositionMove);
                }
                if (aiTime <= 0)
                {
                    // random AI state
                    aiState = 0;
                }
                else
                {
                    aiTime -= (1 / AIUpdateRate);
                }
                // faceing to a desier direction
                targetDirection = navAgent.desiredVelocity.normalized;
            }
            if (!LockTarget)
            {
                findTarget();
            }
        }

        attacking();

        Quaternion targetRotation = this.transform.rotation;

        // rotation to look at a target
        if (targetDirection != Vector3.zero)
        {
            targetRotation     = Quaternion.LookRotation(targetDirection);
            targetRotation.x   = 0;
            targetRotation.z   = 0;
            transform.rotation = Quaternion.Lerp(transform.rotation, targetRotation, TurnSpeed * Time.deltaTime);
        }

        if (navAgent)
        {
            Debug.DrawLine(this.transform.position, PositionMove, Color.green);
            navAgent.speed = character.GetCurrentMoveSpeed();
        }
    }