Esempio n. 1
0
        // Keep searching until an object is seen or heard (if senseAudio is enabled)
        public override TaskStatus OnUpdate()
        {
            SetDestination(Target());
            // Detect if any objects are within sight
            if (overlapColliders == null)
            {
                overlapColliders = new Collider[maxCollisionCount];
            }
            // Detect if any objects are within sight
            returnedObject.Value = MovementUtility.WithinSight(transform, offset.Value, fieldOfViewAngle.Value, viewDistance.Value, overlapColliders, objectLayerMask, targetOffset.Value, ignoreLayerMask, useTargetBone.Value, targetBone);
            // 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.WithinHearingRange(transform, offset.Value, audibilityThreshold.Value, hearingRadius.Value, overlapColliders, 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
    public GameObject goSearch()
    {
        if (HasArrived())
        {
            SetDestination(Target());
        }
        // Detect if any objects are within sight
        returnedObject = MovementUtility.WithinSight(transform, offset, fieldOfViewAngle, viewDistance, objectLayerMask, targetOffset, -1);

        if (returnedObject != null)
        {
            return(returnedObject);
        }
        // Detect if any object are within audio range (if enabled)
        if (senseAudio)
        {
            returnedObject = MovementUtility.WithinHearingRange(transform, offset, audibilityThreshold, hearingRadius, objectLayerMask);

            if (returnedObject != null)
            {
                return(returnedObject);
            }
        }
        return(returnedObject);
    }
Esempio n. 3
0
        public bool Movement()
        {
            if (robotToy.IsToyPlaced())
            {
                int xDirection = MovementUtility.GetXMovement(robotToy.GetFacing());
                if (xDirection != 0)
                {
                    var xPosition = robotToy.GetStep() * xDirection;
                    if (tabletop.IsValidPosition(robotToy.GetXPosition() + xPosition, robotToy.GetYPosition()))
                    {
                        robotToy.XMovement(xDirection);
                        return(true);
                    }
                }
                else
                {
                    int yDirection = MovementUtility.GetYMovement(robotToy.GetFacing());
                    if (yDirection != 0)
                    {
                        var yPosition = robotToy.GetStep() * yDirection;
                        if (tabletop.IsValidPosition(robotToy.GetXPosition(), robotToy.GetYPosition() + yPosition))
                        {
                            robotToy.YMovement(yDirection);
                            return(true);
                        }
                    }
                }
            }

            return(false);
        }
Esempio n. 4
0
        public override TaskStatus OnUpdate()
        {
            SqrCurrentDistance.Value = (transform.position - Target.transform.position).sqrMagnitude;

            if (NPCManager.Instance.npcData.HP <= 0)
            {
                Dead.Value = true;
            }

            if (Target == null)
            {
                return(TaskStatus.Failure);
            }
            else
            {
                FoundEnemy.Value = Target;
                Enemy            = MovementUtility.WithinSight(transform, offset.Value, fieldOfViewAngle, viewDistance, Target, targetOffset.Value, ignoreLayerMask, useTargetBone.Value, targetBone);
                IsCanSee.Value   = true;
            }

            if (Enemy != null)
            {
                return(TaskStatus.Success);
            }
            else
            {
                IsCanSee.Value = false;
            }

            return(TaskStatus.Failure);
        }
Esempio n. 5
0
        protected void GetTiles()
        {
            var scaledMovementValue = Invoker.AvailableMovement / GameSettings.TILE_SIZE;

            MoveableTiles = MovementUtility.GetMoveableTiles(Invoker.Position, scaledMovementValue);

            MovementState = MovementState.DrawTiles;
        }
Esempio n. 6
0
        private void DrawTiles()
        {
            foreach (Vector2Int pos in MoveableTiles.Keys)
            {
                MovementUtility.DrawMovementTile(pos);
            }

            MovementState = MovementState.AwaitingInput;
        }
Esempio n. 7
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);
        }
Esempio n. 8
0
        // Keep searching until an object is seen or heard (if senseAudio is enabled)
        public override TaskStatus OnUpdate()
        {
            if (HasArrived())
            {
                // The agent should pause at the destination only if the max pause duration is greater than 0
                if (maxPauseDuration.Value > 0)
                {
                    if (destinationReachTime == -1)
                    {
                        destinationReachTime = Time.time;
                        pauseTime            = Random.Range(minPauseDuration.Value, maxPauseDuration.Value);
                    }
                    if (destinationReachTime + pauseTime <= Time.time)
                    {
                        // Only reset the time if a destination has been set.
                        if (TrySetTarget())
                        {
                            destinationReachTime = -1;
                        }
                    }
                }
                else
                {
                    TrySetTarget();
                }
            }

            // Detect if any objects are within sight
            if (overlapColliders == null)
            {
                overlapColliders = new Collider[maxCollisionCount];
            }
            returnedObject.Value = MovementUtility.WithinSight(transform, offset.Value, fieldOfViewAngle.Value, viewDistance.Value, overlapColliders, objectLayerMask, targetOffset.Value, ignoreLayerMask, useTargetBone.Value, targetBone);
            // 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.WithinHearingRange(transform, offset.Value, audibilityThreshold.Value, hearingRadius.Value, overlapColliders, 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. 9
0
        // Draw the line of sight representation within the scene window
        public override void OnDrawGizmos()
        {
            if (fieldOfViewAngle == null || viewDistance == null)
            {
                return;
            }

            bool is2D = false;

            is2D = usePhysics2D;

            MovementUtility.DrawLineOfSight(Owner.transform, offset.Value, fieldOfViewAngle.Value, viewDistance.Value, is2D);
        }
Esempio n. 10
0
    private void InitializeTurns()
    {
        CharacterTurnList.Clear();

        var characters = GameObject.FindObjectsOfType<Character>().ToList();

        Debug.Log($"Found {characters.Count} characters");

        foreach(Character c in characters)
        {
            c.Initiative = Dice.Roll(Constants.DiceSides.Twenty, 1);
            Debug.Log($"{c.CharacterData.Name} rolled a {c.Initiative} initative");
            MovementUtility.OccupyTile(c, c.Position);
        }

        CharacterTurnList = characters.OrderByDescending(c => c.Initiative).ToList();

        TurnState = TurnState.SelectActiveCharacter;
    }
Esempio n. 11
0
        private void CalculateMovementPath()
        {
            if (Input.GetMouseButtonDown(0))
            {
                var MousePos   = Input.mousePosition;
                var viewPos    = GameObject.FindObjectOfType <Camera>().ScreenToWorldPoint(MousePos);
                var endPostion = MovementUtility.GetGridLocation(viewPos);

                if (MoveableTiles.ContainsKey(endPostion) && MovementUtility.CanMoveToTile(endPostion))
                {
                    var pathFinder = new Pathfinder(MoveableTiles.Keys.ToList());
                    Path          = pathFinder.FindPath(Invoker.Position, endPostion);
                    MovementState = MovementState.Moving;
                }
                else
                {
                    Debug.Log($"cant move to {endPostion}");
                }
            }
        }
Esempio n. 12
0
 public override void OnBehaviorComplete()
 {
     MovementUtility.ClearCache();
 }
Esempio n. 13
0
 // Draw the line of sight representation within the scene window
 public override void OnDrawGizmos()
 {
     MovementUtility.DrawLineOfSight(Owner.transform, offset.Value, fieldOfViewAngle, angleOffset2D.Value, viewDistance, usePhysics2D);
 }
Esempio n. 14
0
    // returns success if any object is within distance of the current object. Otherwise it will return failure
    public override TaskStatus OnUpdate()
    {
        if (transform == null || objects == null)
        {
            return(TaskStatus.Failure);
        }

        if (overlapCast)
        {
            objects.Clear();
            if (usePhysics2D)
            {
                var colliders = Physics2D.OverlapCircleAll(transform.position, magnitude.Value, objectLayerMask.value);
                for (int i = 0; i < colliders.Length; ++i)
                {
                    objects.Add(colliders[i].gameObject);
                }
            }
            else
            {
                var colliders = Physics.OverlapSphere(transform.position, magnitude.Value, objectLayerMask.value);
                for (int i = 0; i < colliders.Length; ++i)
                {
                    if (colliders[i].gameObject.CompareTag(targetTag.Value))
                    {
                        objects.Add(colliders[i].gameObject);
                    }
                }
            }
        }

        Vector3 direction;

        // check each object. All it takes is one object to be able to return success
        for (int i = 0; i < objects.Count; ++i)
        {
            if (objects[i] == null)
            {
                continue;
            }
            direction = objects[i].transform.position - (transform.position + offset.Value);
            // check to see if the square magnitude is less than what is specified
            if (Vector3.SqrMagnitude(direction) < sqrMagnitude)
            {
                // the magnitude is less. If lineOfSight is true do one more check
                if (lineOfSight.Value)
                {
                    var hitTransform = MovementUtility.LineOfSight(transform, offset.Value, objects[i], targetOffset.Value, usePhysics2D, ignoreLayerMask.value, drawDebugRay.Value);
                    if (hitTransform != null)
                    {
                        // the object has a magnitude less than the specified magnitude and is within sight. Set the object and return success
                        returnedObject.Value = objects[i];
                        return(TaskStatus.Success);
                    }
                }
                else
                {
                    // the object has a magnitude less than the specified magnitude. Set the object and return success
                    returnedObject.Value = objects[i];
                    return(TaskStatus.Success);
                }
            }
        }
        // no objects are within distance. Return failure
        return(TaskStatus.Failure);
    }
Esempio n. 15
0
 protected virtual void GetTilesInRange(Vector2Int position, int distance)
 {
     TileList = MovementUtility.GetMoveableTiles(position, distance);
 }
Esempio n. 16
0
 public void Start()
 {
     _instance = gameObject.GetComponent <MovementUtility>();
     _instance.MovementLayer.ClearAllTiles();
 }
Esempio n. 17
0
 public void Activate(Character invoker, GameActionData options)
 {
     Invoker = invoker;
     MovementUtility.ClearTiles();
 }
 public virtual void OnBehaviorComplete()
 {
     MovementUtility.ClearCache();
 }
Esempio n. 19
0
 public void Cancel()
 {
     MoveableTiles.Clear();
     MovementUtility.ClearTiles();
 }
Esempio n. 20
0
 // Draw the line of sight representation within the scene window
 public override void OnDrawGizmos()
 {
     MovementUtility.DrawLineOfSight(Owner.transform, offset.Value, fieldOfViewAngle.Value, 0, viewDistance.Value, false);
 }
Esempio n. 21
0
 private void CleanUp()
 {
     MovementUtility.ClearTiles();
     ActionState = ActionState.Completed;
 }