Esempio n. 1
0
        // Keep searching until an object is seen or heard (if senseAudio is enabled)
        public override TaskStatus OnUpdate()
        {
            if (HasArrived())
            {
                SetDestination(Target());
            }
            // Detect if any objects are within sight
            if (overlap2DColliders == null)
            {
                overlap2DColliders = new Collider2D[maxCollisionCount];
            }
            returnedObject.Value = MovementUtility.WithinSight2D(transform, offset.Value, fieldOfViewAngle.Value, viewDistance.Value, overlap2DColliders, objectLayerMask, targetOffset.Value, angleOffset2D.Value, ignoreLayerMask, drawDebugRay.Value);
            // If an object was seen then return success
            if (returnedObject.Value != null)
            {
                return(TaskStatus.Success);
            }
            // Detect if any object are within audio range (if enabled)
            if (senseAudio.Value)
            {
                returnedObject.Value = MovementUtility.WithinHearingRange2D(transform, offset.Value, audibilityThreshold.Value, hearingRadius.Value, overlap2DColliders, objectLayerMask);
                // If an object was heard then return success
                if (returnedObject.Value != null)
                {
                    return(TaskStatus.Success);
                }
            }

            // No object has been seen or heard so keep searching
            return(TaskStatus.Running);
        }
Esempio n. 2
0
        // Returns success if an object was found otherwise failure
        public override TaskStatus OnUpdate()
        {
            //寄主势力
            Individual.Power masterPower = gameObject.GetComponent <Individual>().power;
            //计算出对应的敌对势力
            Individual.Power enemyPower = Individual.Power.Neutral;
            switch (masterPower)
            {
            case Individual.Power.Monster: enemyPower = Individual.Power.Human; break;

            case Individual.Power.Human: enemyPower = Individual.Power.Monster; break;
            }

            if (usePhysics2D)
            {
                //单个目标对象来筛选敌对目标
                if (targetObject.IsShared)
                {
                    if (targetObject.Value)
                    {
                        objectInSight.Value = MovementUtility.WithinSight2D(transform, offset.Value, fieldOfViewAngle.Value, viewDistance.Value, targetObject.Value);
                    }
                }
                //个体层+敌对势力来筛选敌对目标
                else
                {
                    objectInSight.Value = ExtendedMovementUtility.WithinSight2D(transform, offset.Value, fieldOfViewAngle.Value, viewDistance.Value, objectLayerMask, enemyPower);
                }
            }
            else
            {
                //单个目标对象来筛选敌对目标
                if (targetObject.IsShared)
                {
                    if (targetObject.Value)
                    {
                        objectInSight.Value = MovementUtility.WithinSight(transform, offset.Value, fieldOfViewAngle.Value, viewDistance.Value, targetObject.Value);
                    }
                }
                //个体层+敌对势力来筛选敌对目标
                else
                {
                    objectInSight.Value = ExtendedMovementUtility.WithinSight(transform, offset.Value, fieldOfViewAngle.Value, viewDistance.Value, objectLayerMask, enemyPower);
                }
            }

            if (objectInSight.Value != null)
            {
                // Return success if an object was found
                return(TaskStatus.Success);
            }
            // An object is not within sight so return failure
            return(TaskStatus.Failure);
        }