public override Steering GetSteering() { Steering steering = new Steering(); float wanderOrientation = Random.Range(-1.0f, 1.0f) * Rate; float targetOrientation = wanderOrientation + Agent.GetOrientation(); if (Agent is Agent2D) { Vector3 orientationVec = GetOriAsVec2D(Agent.GetOrientation()); Vector3 targetPosition = (Offset * orientationVec) + transform.position; targetPosition = targetPosition + (GetOriAsVec2D(targetOrientation) * Radius); Target.transform.position = targetPosition; } else { Vector3 orientationVec = GetOriAsVec(Agent.GetOrientation()); Vector3 targetPosition = (Offset * orientationVec) + transform.position; targetPosition = targetPosition + (GetOriAsVec(targetOrientation) * Radius); Target.transform.position = targetPosition; } steering = base.GetSteering(); steering.linear = Target.transform.position - transform.position; steering.linear.Normalize(); steering.linear *= Agent.GetMaxAccel(); return(steering); }
public override Steering GetSteering() { Steering steering = new Steering(); float shortestTime = Mathf.Infinity; GameObject firstTarget = null; float firstMinSeparation = 0.0f; float firstDistance = 0.0f; Vector3 firstRelativePos = Vector3.zero; Vector3 firstRelativeVel = Vector3.zero; foreach (GameObject t in targets) { Vector3 relativePos; IAgent targetAgent = t.GetComponent <IAgent>(); relativePos = t.transform.position - transform.position; Vector3 relativeVel = targetAgent.GetVelocity() - Agent.GetVelocity(); float relativeSpeed = relativeVel.magnitude; float timeToCollision = Vector3.Dot(relativePos, relativeVel); timeToCollision /= relativeSpeed * relativeSpeed * -1; float distance = relativePos.magnitude; float minSeparation = distance - relativeSpeed * timeToCollision; if (minSeparation > 2 * CollisionRadius) { continue; } if (timeToCollision > 0.0f && timeToCollision < shortestTime) { shortestTime = timeToCollision; firstTarget = t; firstMinSeparation = minSeparation; firstRelativePos = relativePos; firstRelativeVel = relativeVel; } } if (firstTarget == null) { return(steering); } if (firstMinSeparation <= 0.0f || firstDistance < 2 * CollisionRadius) { firstRelativePos = firstTarget.transform.position; } else { firstRelativePos += firstRelativeVel * shortestTime; } firstRelativePos.Normalize(); steering.linear = -firstRelativePos *Agent.GetMaxAccel(); return(steering); }
public Steering GetSteering(Vector3 targetPosition) { Steering steering = new Steering(); if (Agent is Agent2D) { steering.linear = (Vector2)targetPosition - (Vector2)_transform.position; } else { steering.linear = targetPosition - _transform.position; } steering.linear.Normalize(); steering.linear = steering.linear * Agent.GetMaxAccel(); return(steering); }