void Update() { if (captureTaste != null) { if (count < refreshRate) { GameObject auxGameObject = captureTaste.getActTaste(); if (auxGameObject != null && !auxGameObject.tag.Equals(Constants.TAG_BODYPART)) { gameObjects.Add(auxGameObject); } count++; } else { updatedElementsList = new HashSet <GameObject>(gameObjects); gameObjects = new HashSet <GameObject>(); count = 0; } } }
// Update is called once per frame void Update() { updateSpineRotation(); for (int i = 0; i < agentHands.Length; i++) { if (agentHands[i].getCommand() != null) { switch (agentHands[i].getCommand().getAction()) { case Action.Take: updateFocusPosition(agentHands[i]); switch (agentHands[i].getCommand().getActionStateID()) { case (int)Take.Start: Debug.Log("Command>>> " + this.name + " command " + agentHands[i].getCommand().getId() + " Started!"); agentHands[i].getCommand().next(); break; case (int)Take.Position: velocityFocus = Constants.NATURALSPD * 2; agentHands[i].ik = true; configureCrouchAndSpineInclination(agentHands[i]); //O foco está na posição if (isInPosition(agentHands[i].focus.position, agentHands[i].getCommand().getNearestDesiredPosition(transform.position))) { //A mão está posicionada no foco? O IK já terminou de executar? if (isInPosition(agentHands[i].hand.position, agentHands[i].focus.position) && animator.GetFloat(agentHands[i].getAnimatorParam()) > 0.9) { agentHands[i].getCommand().next(); } else if (!isReachable(agentHands[i])) { Debug.Log("Command>>> " + this.name + " command " + agentHands[i].getCommand().getId() + " Failed! Object not reachable."); agentHands[i].getCommand().fail(); } } break; case (int)Take.Grab: bool success = agentHands[i].hold(agentHands[i].getCommand().getReference()); if (success) { agentHands[i].getCommand().next(); } else { agentHands[i].getCommand().fail(); } Debug.Log("Command>>> " + this.name + " command " + agentHands[i].getCommand().getId() + " Failed! Could not grab the object!"); break; case (int)Take.Approximate: if (agentHands[i].getCommand().isToResetHand()) { resetCrouchValue(); resetSpineRotation(); } velocityFocus = Constants.NATURALSPD; agentHands[i].getCommand().setLocation(agentHands[i].getRestPosition()); //O foco está na posição? if (isInPosition(agentHands[i].focus.position, agentHands[i].getRestPosition().position)) { agentHands[i].getCommand().success(); Debug.Log("Command>>> " + this.name + " command " + agentHands[i].getCommand().getId() + " Success!"); } break; case (int)Take.End: //Continua atualizando o IK //Verifica houve falha if (agentHands[i].isHandFree()) { agentHands[i].ik = false; } break; default: break; } break; case Action.Activate: case Action.Deactivate: velocityFocus = Constants.NATURALSPD * 3; updateFocusPosition(agentHands[i]); switch (agentHands[i].getCommand().getActionStateID()) { case (int)Activate.Start: Debug.Log("Command>>> " + this.name + " command " + agentHands[i].getCommand().getId() + " Started!"); agentHands[i].getCommand().next(); break; case (int)Activate.Position: manageHandPosition(agentHands[i]); break; case (int)Activate.Trigger: bool success = agentHands[i].setActivate(agentHands[i].getCommand().getReference(), agentHands[i].getCommand().getAction() == Action.Activate); if (success) { agentHands[i].getCommand().success(); Debug.Log("Command>>> " + this.name + " command " + agentHands[i].getCommand().getId() + " Success!"); } else { Debug.Log("Command>>> " + this.name + " command " + agentHands[i].getCommand().getId() + " Failed! ERROR!"); agentHands[i].getCommand().fail(); } break; case (int)Activate.End: manageEndOfActivate(agentHands[i]); break; default: Debug.Log("Command>>> " + this.name + " command " + agentHands[i].getCommand().getId() + " Failed! Object not reachable."); agentHands[i].getCommand().fail(); break; } break; case Action.Release: velocityFocus = Constants.NATURALSPD * 3; switch (agentHands[i].getCommand().getActionStateID()) { case (int)Release.Start: Debug.Log("Command>>> " + this.name + " command " + agentHands[i].getCommand().getId() + " Started!"); agentHands[i].getCommand().next(); break; case (int)Release.Position: if (isLocationReachable(agentHands[i])) { updateFocusToOtherPosition(agentHands[i], agentHands[i].getCommand().getNearestDesiredContainer(transform.position)); configureCrouchAndSpineInclination(agentHands[i]); } else { updateFocusToOtherPosition(agentHands[i], agentHands[i].getRestPosition().position); Debug.Log("Command>>> " + this.name + " command " + agentHands[i].getCommand().getId() + " Failed! Location is not reachable."); agentHands[i].getCommand().fail(); } //O Foco está na posição? if (isInPosition(agentHands[i].focus.position, agentHands[i].getCommand().getNearestDesiredContainer(transform.position)) && isInPosition(agentHands[i].focus.position, agentHands[i].hand.position)) { agentHands[i].getCommand().next(); } break; case (int)Release.Leave: velocityFocus = Constants.NATURALSPD; bool success = agentHands[i].drop(agentHands[i].getCommand().getNearestDesiredContainer(transform.position)); if (success) { Debug.Log("Command>>> " + this.name + " command " + agentHands[i].getCommand().getId() + " Success!"); agentHands[i].getCommand().success(); } else { Debug.Log("Command>>> " + this.name + " command " + agentHands[i].getCommand().getId() + " Failed! ERROR!"); agentHands[i].getCommand().fail(); } break; case (int)Release.End: if (agentHands[i].getCommand().isToResetHand()) { resetCrouchValue(); resetSpineRotation(); } if (agentHands[i].getCommand().isFail()) { updateFocusToOtherPosition(agentHands[i], agentHands[i].getRestPosition().position); } else { agentHands[i].ik = false; } if (agentHands[i].isHandFree()) { agentHands[i].ik = false; } break; } break; case Action.Taste: velocityFocus = Constants.NATURALSPD * 3; switch (agentHands[i].getCommand().getActionStateID()) { case (int)Taste.Start: Debug.Log("Command>>> " + this.name + " command " + agentHands[i].getCommand().getId() + " Started!"); auxCommand = GetComponent <AgentHeadMovement>().getCurrentCommand(); GetComponent <AgentHeadMovement>().sendCommand(new Command("", Action.HeadReset)); agentHands[i].getCommand().next(); break; case (int)Taste.Position: if (!agentHands[i].isHandFree()) { updateFocusToOtherPosition(agentHands[i], agentHands[i].getCommand().getNearestDesiredPosition(agentHands[i].hand.position)); int auxFlag = 1; if (agentHands[i].getActHand() == Hands.Right) { auxFlag = -1; } rotateFocus(agentHands[i], (handTasteYAngle * auxFlag)); //O Foco está na posição? CaptureTaste captureTaste = agentTasteSensor.GetComponent <CaptureTaste>(); captureTaste.capture(); if (captureTaste.isObjectInTasteSensor() && captureTaste.getActTaste() == agentHands[i].objInHand.gameObject) { agentHands[i].getCommand().next(); } } else { Debug.Log("Command>>> " + this.name + " command " + agentHands[i].getCommand().getId() + " Failed! Hand is empty. "); agentHands[i].getCommand().fail(); } break; case (int)Taste.Taste: timer += Time.deltaTime; float seconds = timer % 60; velocityFocus = Constants.NATURALSPD; if (seconds > timeToTaste) { CaptureTaste captureTaste = agentTasteSensor.GetComponent <CaptureTaste>(); captureTaste.stopCature(); agentHands[i].getCommand().next(); } break; case (int)Taste.ReturnHeadTask: if (auxCommand != null) { auxCommand.resetState(); GetComponent <AgentHeadMovement>().sendCommand(auxCommand); } Debug.Log("Command>>> " + this.name + " command " + agentHands[i].getCommand().getId() + " Success!"); agentHands[i].getCommand().success(); break; case (int)Taste.End: if (agentHands[i].getCommand().isToResetHand()) { resetCrouchValue(); resetSpineRotation(); } resetRotationFocus(agentHands[i]); timer = 0f; updateFocusToOtherPosition(agentHands[i], agentHands[i].getRestPosition().position); if (agentHands[i].isHandFree()) { agentHands[i].ik = false; } break; } break; case Action.Smell: velocityFocus = Constants.NATURALSPD * 3; switch (agentHands[i].getCommand().getActionStateID()) { case (int)Smell.Start: Debug.Log("Command>>> " + this.name + " command " + agentHands[i].getCommand().getId() + " Started!"); auxCommand = GetComponent <AgentHeadMovement>().getCurrentCommand(); GetComponent <AgentHeadMovement>().sendCommand(new Command("", Action.HeadReset)); agentHands[i].getCommand().next(); break; case (int)Smell.Position: if (!agentHands[i].isHandFree()) { updateFocusToOtherPosition(agentHands[i], agentHands[i].getCommand().getNearestDesiredPosition(agentHands[i].hand.position)); int auxFlag = 1; if (agentHands[i].getActHand() == Hands.Right) { auxFlag = -1; } rotateFocus(agentHands[i], (handTasteYAngle * auxFlag)); //O Foco está na posição? CaptureSmell captureSmell = agentSmellSensor.GetComponent <CaptureSmell>(); if (agentHands[i].objInHand.gameObject.GetComponentInChildren <ParticleSystem>() == null) { captureSmell.putObjInSmell(agentHands[i].objInHand.gameObject); } if (captureSmell.isObjectInSmellInSensor() && captureSmell.getActSmell() == agentHands[i].objInHand.gameObject) { agentHands[i].getCommand().next(); } } else { Debug.Log("Command>>> " + this.name + " command " + agentHands[i].getCommand().getId() + " Failed! Hand is empty. "); agentHands[i].getCommand().fail(); } break; case (int)Smell.Smell: timer += Time.deltaTime; float seconds = timer % 60; velocityFocus = Constants.NATURALSPD; if (seconds > timeToTaste) { agentHands[i].getCommand().next(); } break; case (int)Smell.ReturnHeadTask: if (auxCommand != null) { auxCommand.resetState(); GetComponent <AgentHeadMovement>().sendCommand(auxCommand); } Debug.Log("Command>>> " + this.name + " command " + agentHands[i].getCommand().getId() + " Success!"); agentHands[i].getCommand().success(); break; case (int)Smell.End: if (agentHands[i].getCommand().isToResetHand()) { resetCrouchValue(); resetSpineRotation(); } resetRotationFocus(agentHands[i]); timer = 0f; updateFocusToOtherPosition(agentHands[i], agentHands[i].getRestPosition().position); if (agentHands[i].isHandFree()) { agentHands[i].ik = false; } break; } break; default: break; } } } }