protected override void Awake() { base.Awake(); m_harvesterState = eHarvesterState.NotHarvesting; Harvester harvesterComponent = GetComponent <Harvester>(); Assert.IsNotNull(harvesterComponent); m_harvester = harvesterComponent; }
public void switchToState(eHarvesterState newState, BoidSpawner boidSpawner = null) { m_harvesterState = newState; m_currentState = eUnitState.InUseBySecondaryState; m_targetID = Utilities.INVALID_ID; switch (newState) { case eHarvesterState.SetBoidSpawner: { Assert.IsNotNull(boidSpawner); m_harvester.m_boidSpawner = boidSpawner; } break; case eHarvesterState.TargetAvailableBoid: { Assert.IsNotNull(m_harvester.m_boidSpawner); m_harvester.m_targetBoid = m_harvester.m_boidSpawner.getAvailableBoid(m_unit.getID()); if (m_harvester.m_targetBoid) { m_tankMovement.moveTo(m_harvester.m_targetBoid.transform.position); m_harvesterState = eHarvesterState.MovingToTargetedBoid; m_findAvailableBoid = false; } else { m_findAvailableBoid = true; } } break; case eHarvesterState.SetDestinationResourceBuilding: { Assert.IsNotNull(m_harvester.m_buildingToReturnResource); fRectangle AABB = m_harvester.m_buildingToReturnResource.GetComponent <Selection>().getAABB(); m_tankMovement.moveTo( Utilities.getClosestPositionOutsideAABB(AABB, transform.position, m_harvester.m_buildingToReturnResource.transform.position, m_harvester.m_destinationOffSetHQ)); m_harvesterState = eHarvesterState.MovingToResourceBuilding; } break; } }
protected override void Update() { base.Update(); if (m_currentState != eUnitState.InUseBySecondaryState) { m_harvesterState = eHarvesterState.NotHarvesting; m_harvester.releaseTargetBoid(); } if (m_findAvailableBoid) { switchToState(eHarvesterState.TargetAvailableBoid); } switch (m_harvesterState) { case eHarvesterState.MovingToTargetedBoid: { Assert.IsNotNull(m_harvester.m_targetBoid); if ((m_harvester.m_targetBoid.transform.position - transform.position).sqrMagnitude <= m_harvester.m_distanceToHarvest * m_harvester.m_distanceToHarvest) { switchToState(eHarvesterState.HarvestTargetedBoid); } } break; case eHarvesterState.HarvestTargetedBoid: { Assert.IsNotNull(m_harvester.m_targetBoid); if ((m_harvester.m_targetBoid.transform.position - transform.position).sqrMagnitude <= m_harvester.m_distanceToHarvest * m_harvester.m_distanceToHarvest / 2) { Assert.IsNotNull(m_harvester.m_boidSpawner); m_harvester.m_boidSpawner.destroyBoid(m_harvester.m_targetBoid); bool harvesterResourceCapacityReached = false; m_harvester.incrementResource(out harvesterResourceCapacityReached); if (harvesterResourceCapacityReached) { switchToState(eHarvesterState.SetDestinationResourceBuilding); } else { switchToState(eHarvesterState.TargetAvailableBoid); } } } break; case eHarvesterState.MovingToResourceBuilding: { if (m_tankMovement.reachedDestination()) { GameManager.Instance.addResourcesToFaction(m_harvester); switchToState(eHarvesterState.TargetAvailableBoid); } } break; } }