public override MovementOutput GetMovement()
        {
            output.Clear();
            characterPosition = Character.Position;
            foreach (DynamicCharacter dynamicCharacter in flock)
            {
                boid      = dynamicCharacter.KinematicData;
                direction = characterPosition - boid.Position;
                distance  = direction.sqrMagnitude;
                if (distance < Radius * Radius)
                {
                    separationStrength = Mathf.Min(SeparationFactor / (distance), MaxAcceleration);
                    direction.Normalize();
                    output.linear += direction * separationStrength;
                }
            }

            if (output.linear.sqrMagnitude > MaxAcceleration * MaxAcceleration)
            {
                output.linear.Normalize();
                output.linear *= MaxAcceleration;
            }

            return(output);
        }
        public override MovementOutput GetMovement()
        {
            Vector3        deltaPos      = this.Target.Position - this.Character.Position;
            Vector3        deltaVel      = this.Target.velocity - this.Character.velocity;
            float          deltaSqrSpeed = deltaVel.sqrMagnitude;
            MovementOutput output        = new MovementOutput();

            output.Clear();

            if (deltaSqrSpeed == 0)
            {
                return(output);
            }

            float timeToClosest = Mathf.Abs(-Vector3.Dot(deltaPos, deltaVel) / deltaSqrSpeed);

            if (timeToClosest > this.MaxTimeLookAhead)
            {
                return(output);
            }

            Vector3 futureDeltaPos = deltaPos + deltaVel * timeToClosest;
            float   futureDistance = futureDeltaPos.magnitude;

            if (futureDistance > 2 * AvoidMargin)
            {
                return(output);
            }

            if (futureDistance <= 0 || deltaPos.magnitude < 2 * AvoidMargin)
            {
                output.linear = Character.Position - Target.Position;
            }
            else
            {
                output.linear = -futureDeltaPos;
            }

            output.linear = output.linear.normalized * this.MaxAcceleration;
            return(output);
        }
示例#3
0
        public override MovementOutput GetMovement()
        {
            output.Clear();
            deltaPos   = Target.Position - Character.Position;
            deltaVel   = Target.velocity - Character.velocity;
            deltaSpeed = deltaVel.sqrMagnitude;

            if (deltaSpeed == 0)
            {
                return(output);
            }

            timeToClosest = (-Vector3.Dot(deltaPos, deltaVel)) / (deltaSpeed);

            if (timeToClosest > maxTimeLookAhead)
            {
                return(output);
            }

            futureDeltaPos = deltaPos + deltaVel * timeToClosest;
            futureDistance = futureDeltaPos.sqrMagnitude;

            if (futureDistance > twiceCollisionRadius * twiceCollisionRadius)
            {
                return(output);
            }

            if (futureDistance <= 0 || deltaPos.sqrMagnitude < twiceCollisionRadius * twiceCollisionRadius)
            {
                output.linear = Character.Position - Target.Position;
            }
            else
            {
                output.linear = futureDeltaPos * -1;
            }

            output.linear = output.linear.normalized * maxAcceleration;

            return(output);
        }
        public override MovementOutput GetMovement()
        {
            Vector3 rayVector = Character.velocity.normalized;

            if (rayVector.magnitude == 0)
            {
                rayVector = Util.MathHelper.ConvertOrientationToVector(Character.rotation);
            }

            Debug.DrawRay(this.Character.Position, Util.MathHelper.Rotate2D(rayVector, -WhiskerAngle) * WhiskerLength, Color.black);
            Debug.DrawRay(this.Character.Position, Util.MathHelper.Rotate2D(rayVector, WhiskerAngle) * WhiskerLength, Color.black);
            Debug.DrawRay(this.Character.Position, rayVector * MaxLookAhead, Color.black);

            RaycastHit collision;

            if (CollisionDetector.Raycast(new Ray(this.Character.Position, Util.MathHelper.Rotate2D(rayVector, -WhiskerAngle)), out collision, WhiskerLength))
            {
                base.Target.Position = this.Character.Position + Util.MathHelper.Rotate2D(rayVector, WhiskerAngle) * AvoidMargin;
                return(base.GetMovement());
            }
            if (CollisionDetector.Raycast(new Ray(this.Character.Position, Util.MathHelper.Rotate2D(rayVector, WhiskerAngle)), out collision, WhiskerLength))
            {
                base.Target.Position = this.Character.Position + Util.MathHelper.Rotate2D(rayVector, -WhiskerAngle) * AvoidMargin;
                return(base.GetMovement());
            }
            if (CollisionDetector.Raycast(new Ray(this.Character.Position, rayVector), out collision, MaxLookAhead))
            {
                base.Target.Position = collision.point + collision.normal * AvoidMargin;
                return(base.GetMovement());
            }

            MovementOutput output = new MovementOutput();

            output.Clear();
            return(output);
        }