Esempio n. 1
0
        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);
        }
Esempio n. 2
0
        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);
        }
Esempio n. 3
0
        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);
        }