// Update is called once per frame void Update() { if (useKinematic == false) { return; } SteeringOutput steering; if (singleAlternative == null) { steering = behaviour.getSteering(selfKinematic, target, targetKinematic); } else { steering = singleAlternative.getSteering(selfKinematic, target, targetKinematic); } if (target != null) { Debug.DrawRay(parentTransform.position, target.transform.position - parentTransform.position, Color.white); } ProcessSteering(); UpdateSelfKinematic(steering); }
public SteeringOutput getSteering() { Vector3 rayVector = s.getCharacter().velocity; rayVector.Normalize(); rayVector *= lookahead; //Debug.Log(lookahead); // Does the ray intersect any objects excluding the player layer collisionDetector = new RaycastHit(); float angleInc = 10f; //Debug.DrawRay(s.getCharacter().position, s.getCharacter().velocity, Color.green); for (int i = 0; i < 6; i++) { Vector3 rotRayVec; if (i % 2 == 0) { rotRayVec = Quaternion.AngleAxis(angleInc * -(i / 2), Vector3.up) * rayVector; } else { rotRayVec = Quaternion.AngleAxis(angleInc * Mathf.Ceil(i / 2), Vector3.up) * rayVector; } rotRayVec.Scale(new Vector3(1f, 0f, 1f)); Debug.DrawRay(s.getCharacter().position, rotRayVec, Color.cyan); s.getCharacter().owner.GetComponent <NPCController>().DrawLine(s.getCharacter().owner.transform.position, rotRayVec * lookahead); if (Physics.Raycast(s.getCharacter().position, rotRayVec, out collisionDetector, lookahead)) { if (collisionDetector.collider.gameObject.Equals(s.getCharacter().owner)) { continue; } Debug.DrawRay(collisionDetector.point, collisionDetector.normal * avoidDistance, Color.red); s.setTargetPosition(collisionDetector.point + (collisionDetector.normal * avoidDistance)); Kinematic avoid = new Kinematic() { position = collisionDetector.point + (collisionDetector.normal * avoidDistance) }; //targetPos = s.getTarget().position; DynamicSeek seekAvoidPoint = new DynamicSeek(s.getCharacter(), avoid, maxAcceleration); return(seekAvoidPoint.getSteering()); } } try { targetPos = s.getTarget().position; } catch (Exception e) { } return(s.getSteering()); }
private void arbitroEscenaFinal() { if (isAlive()) { if (currentAction != null && currentAction is AccionCompuesta) //siguiente accion de la lista { ((AccionCompuesta)currentAction).actualizeAction(); //aceder a currentaction } if (currentAction != null && currentAction.isDone()) { kinetic.Clear(); currentAction = null; selectedBehaviour = null; steeringActual = new Steering(); } else { //ESTO ESTA MAL DE ALGUNA FORMA //auxiliarmente elegimos el primero de la lista if (kinetic.Count > 0) { kinetic[0].getSteering(this); if ((kinetic[0] as WallAvoidance3WhiswersGridSD).finishedLinear) { if (recalcularAccion) { recalcularAccion = false; if (currentAction != null) { currentAction.doit(); } } selectedBehaviour = kinetic[1]; if (!(currentAction is AccionCompuesta)) { actuadorHumanoNoDriftin(); } } else { recalcularAccion = true; selectedBehaviour = kinetic[0]; } steeringActual = selectedBehaviour.getSteering(this); } } } }
public SteeringOutput getSteering() { Vector3 rayVector = s.getCharacter().velocity; rayVector.Normalize(); rayVector *= lookahead; //Debug.Log(lookahead); // Does the ray intersect any objects excluding the player layer collisionDetector = new RaycastHit(); float angleInc = 10f; //Debug.DrawRay(s.getCharacter().position, s.getCharacter().velocity, Color.green); for (int i = 0; i < 6; i++) { Vector3 rotRayVec; if (i % 2 == 0) { rotRayVec = Quaternion.AngleAxis(angleInc * -(i / 2), Vector3.up) * rayVector; } else { rotRayVec = Quaternion.AngleAxis(angleInc * Mathf.Ceil(i / 2), Vector3.up) * rayVector; } rotRayVec.Scale(new Vector3(1f, 0f, 1f)); //Debug.DrawRay(s.getCharacter().position, rotRayVec, Color.cyan); if (Physics.Raycast(s.getCharacter().position, rotRayVec, out collisionDetector, lookahead)) { //Debug.DrawRay(collisionDetector.point, collisionDetector.normal * avoidDistance, Color.red); s.setTargetPosition(collisionDetector.point + (collisionDetector.normal * avoidDistance)); targetPos = s.getTarget().position; DynamicSeek seekAvoidPoint = new DynamicSeek(s.getCharacter(), s.getTarget(), maxAcceleration); return(seekAvoidPoint.getSteering()); } } targetPos = s.getTarget().position; return(s.getSteering()); }
//Calculamos para cada SteeringBehavior su Steering y lo añadimos a una lista //para despues seleccionar cual se va a aplicar /*void LateUpdate() * { * arbitro(); * }*/ //Seleccionamos que Steering se va a aplicar recorriendo la lista kinetic //actualizando el atributo steeringActual private void arbitro() { //auxiliarmente elegimos el primero de la lista if (kinetic.Count > 0) { //steeringActual = kinetic[0].getSteering(this); //se hace antes para hacer el raycast y no hacerlo dos veces //CHECK IF WALLAVOIDANCE int i = 0; if ((kinetic[0] as WallAvoidance3WhiswersSD) != null) { steeringActual = kinetic[0].getSteering(this); if ((kinetic[0] as WallAvoidance3WhiswersSD).finishedLinear) { i = 1; // lo que no es evadir parede bool allFinished = true; for (i = 1; i < kinetic.Count; i++) { if (!(kinetic[i].finishedLinear && kinetic[i].finishedAngular)) { selectedBehaviour = kinetic[i]; allFinished = false; break; } } if (allFinished) { newTask(defaultSteering); selectedBehaviour = kinetic[1]; } else { selectedBehaviour = kinetic[i]; } if (allFinished) { i--; } selectedBehaviour = kinetic[i]; steeringActual = selectedBehaviour.getSteering(this); } else { selectedBehaviour = kinetic[0]; } } else { bool allFinished = true; for (i = i; i < kinetic.Count; i++) { if (!(kinetic[i].finishedLinear && kinetic[i].finishedAngular)) { selectedBehaviour = kinetic[i]; allFinished = false; break; } } if (allFinished) { newTask(defaultSteering); selectedBehaviour = kinetic[1]; } else { selectedBehaviour = kinetic[i]; } selectedBehaviour = kinetic[i]; steeringActual = selectedBehaviour.getSteering(this); } //CUANDO NO HAY WALL AVOIDANCE //selectedBehaviour = kinetic[0]; //steering finish /*if (steeringActual.angular == 0 && steeringActual.linear == Vector3.zero) * { * kinetic.RemoveAt(0); * steeringActual = null; * }*/ } }