public override void Update() { base.Update(); if (refineryHomebase == null) { refineryHomebase = FindOreRefinery(); if (refineryHomebase == null) { return; } } switch (mineState) { case MineState.IDLE: //check if both minerals and a ore factory exists, iff -> SEARCH float shortestDistance = Vector3.Distance(transform.position, resources[0].transform.position); closestResource = resources[0]; for (int i = 1; i < resources.Length; i++) { float distance = Vector3.Distance(transform.position, resources[i].transform.position); if (distance < shortestDistance) { shortestDistance = distance; closestResource = resources[i]; } } ai.destination = closestResource.transform.position; ai.SearchPath(); mineState = MineState.SEARCH; break; case MineState.SEARCH: if ((ai.reachedEndOfPath && !ai.pathPending) || ai.remainingDistance < 6) { mineState = MineState.MINE; mineTime = Time.time; } break; case MineState.MINE: if (mineTime + mineInterval < Time.time) { addOreToInventory(closestResource.getResourceValue()); mineTime = Time.time; } if (inventorySize <= currentInventory) { if (refineryHomebase) { ai.destination = refineryHomebase.GetEntrancePosition(); ai.SearchPath(); mineState = MineState.RETURN; } } break; case MineState.RETURN: if ((ai.reachedEndOfPath && !ai.pathPending) && refineryHomebase) { enterUnloadState(); Vector3 _direction = (refineryHomebase.transform.position - transform.position).normalized; Quaternion _lookRotation = Quaternion.LookRotation(_direction); transform.rotation = Quaternion.Slerp(transform.rotation, _lookRotation, 0.35f); transform.position = Vector3.MoveTowards(transform.position, refineryHomebase.GetUnloadPosition(), 0.2f); if (Vector3.Distance(transform.position, refineryHomebase.GetUnloadPosition()) < 1f) { mineState = MineState.UNLOAD; } } break; case MineState.UNLOAD: refineryHomebase.AddResources(inventoryValue); Reset(); mineState = MineState.EXIT; break; case MineState.EXIT: if (refineryHomebase) { transform.position = Vector3.MoveTowards(transform.position, refineryHomebase.GetEntrancePosition(), 0.3f); if (Vector3.Distance(transform.position, refineryHomebase.GetEntrancePosition()) < 2f) { GetComponent <Collider>().enabled = true; //ai.gravity = savedGravity; ai.enabled = true; mineState = MineState.IDLE; } } break; } }