private SequenceBehaviour createActionSequence() { SequenceBehaviour actionSequence = new SequenceBehaviour(Agent); Rigidbody rigidbody = gameObject.GetComponent(typeof(Rigidbody)) as Rigidbody; WoodComponent nearestWoodComponent = getNearestWoodComponent(rigidbody.transform.position); if (nearestWoodComponent == null) { Stop(); notifyFinished(); return(null); } StorageComponent storageComponent = getNearestStorageComponent(nearestWoodComponent.transform.position); if (storageComponent == null) { Stop(); notifyFinished(); return(null); } BackpackComponent backpackComponent = gameObject.GetComponent(typeof(BackpackComponent)) as BackpackComponent; if (backpackComponent == null) { Stop(); notifyFinished(); return(null); } MoveTowardsBehaviour moveTowardsStorageBehaviour = new MoveTowardsBehaviour(Agent, rigidbody, speed, storageComponent.transform.position); PutMaterialsIntoStorageBehaviour putMaterialsIntoStorageBehaviour = new PutMaterialsIntoStorageBehaviour(Agent, storageComponent, backpackComponent); if (!backpackComponent.hasWood) { MoveTowardsBehaviour moveTowardsWoodBehaviour = new MoveTowardsBehaviour(Agent, rigidbody, speed, nearestWoodComponent.transform.position); GatherWoodBehaviour gatherWoodBehaviour = new GatherWoodBehaviour(Agent, backpackComponent, nearestWoodComponent); actionSequence.AddSequentialBehaviour(moveTowardsWoodBehaviour); actionSequence.AddSequentialBehaviour(gatherWoodBehaviour); } actionSequence.AddSequentialBehaviour(moveTowardsStorageBehaviour); actionSequence.AddSequentialBehaviour(putMaterialsIntoStorageBehaviour); return(actionSequence); }
private WoodComponent getNearestWoodComponent(Vector3 currentPosition) { WoodComponent[] woodComponents = (WoodComponent[])UnityEngine.GameObject.FindObjectsOfType(typeof(WoodComponent)); WoodComponent closest = null; float closestDist = 0; foreach (WoodComponent woodComponent in woodComponents) { if (woodComponent.PiecesAvailable == 0) { continue; } if (closest == null) { closest = woodComponent; closestDist = (woodComponent.gameObject.transform.position - currentPosition).magnitude; } else { float dist = (woodComponent.gameObject.transform.position - currentPosition).magnitude; if (dist < closestDist) { closest = woodComponent; closestDist = dist; } } } if (closest == null) { Stop(); return(null); } return(closest); }
public float workDuration = 2; // seconds public GatherWoodBehaviour(Agent agent, BackpackComponent backpackComponent, WoodComponent woodComponent) : base(agent) { this.woodComponent = woodComponent; this.backpackComponent = backpackComponent; }