/// <summary> /// Called every frame from Robot.update() if it's the current state (top of the stack) /// </summary> /// <param name="r">The robot to update</param> public override void update(Robot r) { bool finished = false; //////////////////////////////////////////////////////////////////////////////////////// // Initialize variables if necessary when first enter state //////////////////////////////////////////////////////////////////////////////////////// if (!initialized) { initialized = true; if (r.carriedResource == null) { resume = true; } else { Log.e(LogTag.ROBOT, "Initializing RobotPlaceResource, but robot is already carrying object."); finished = true; } } //////////////////////////////////////////////////////////////////////////////////////// // Reset variables if robot is returning from another state //////////////////////////////////////////////////////////////////////////////////////// if (resume) { resume = false; Vector2 robotPosition = new Vector2(r.body.transform.position.x, r.body.transform.position.z); if (Vector2.Distance(robotPosition, position) > retrievalDistance) { r.pushState(new RobotStateTurn(position)); r.pushState(new RobotStateMove(position, retrievalDistance)); } else { GameObject resource = r.getObjectInFront(); if (resource != null && resource.CompareTag("Resource")) { Log.w(LogTag.ROBOT, "Robot " + r.id + " has picked up " + resource.transform.name); resource.transform.SetParent(r.body.transform); resource.transform.position = new Vector3(r.body.transform.position.x, 1.5f, r.body.transform.position.z); r.carriedResource = resource; finished = true; } else { Log.e(LogTag.ROBOT, "Robot " + r.id + " isn't facing any resources"); r.pushState(new RobotStateSleep(2.0f)); // allow other robots to move out of the way } } } //////////////////////////////////////////////////////////////////////////////////////// // Update: intentionally empty //////////////////////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////////////////////// // Process messages: disabled here //////////////////////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////////////////////// // "Clean up" robot state //////////////////////////////////////////////////////////////////////////////////////// if (finished) { r.popState(); } }