// 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); }
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); }
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); }
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); }
protected void GetTiles() { var scaledMovementValue = Invoker.AvailableMovement / GameSettings.TILE_SIZE; MoveableTiles = MovementUtility.GetMoveableTiles(Invoker.Position, scaledMovementValue); MovementState = MovementState.DrawTiles; }
private void DrawTiles() { foreach (Vector2Int pos in MoveableTiles.Keys) { MovementUtility.DrawMovementTile(pos); } MovementState = MovementState.AwaitingInput; }
// 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); }
// 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); }
// 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); }
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; }
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}"); } } }
public override void OnBehaviorComplete() { MovementUtility.ClearCache(); }
// 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); }
// 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); }
protected virtual void GetTilesInRange(Vector2Int position, int distance) { TileList = MovementUtility.GetMoveableTiles(position, distance); }
public void Start() { _instance = gameObject.GetComponent <MovementUtility>(); _instance.MovementLayer.ClearAllTiles(); }
public void Activate(Character invoker, GameActionData options) { Invoker = invoker; MovementUtility.ClearTiles(); }
public virtual void OnBehaviorComplete() { MovementUtility.ClearCache(); }
public void Cancel() { MoveableTiles.Clear(); MovementUtility.ClearTiles(); }
// 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); }
private void CleanUp() { MovementUtility.ClearTiles(); ActionState = ActionState.Completed; }