Inheritance: MonoBehaviour
Example #1
0
    // Update is called once per frame
    void Update()
    {
        if (behaviorNum != 0)
        {
            // update my position and rotation
            this.transform.position += linearVelocity * Time.deltaTime;
            Vector3 v = new Vector3(0, angularVelocity, 0);
            this.transform.eulerAngles += v * Time.deltaTime;
        }

        // update linear and angular velocities
        SteeringOutput steering = new SteeringOutput();

        // Seek: target is "alsoMyTargetForPursueTho"
        if (behaviorNum == 1)
        {
            text.text = "Seek";

            Seek mySeek = new Seek();
            mySeek.target    = alsoMyTargetForPursueTho;
            mySeek.character = this;

            steering         = mySeek.getSteering();
            linearVelocity  += steering.linear * Time.deltaTime;
            angularVelocity += steering.angular * Time.deltaTime;
        }
        // Flee
        else if (behaviorNum == 2)
        {
            Flee myFlee = new Flee();
            text.text = "Flee";

            myFlee.character = this;
            myFlee.target    = myTarget;
            steering         = myFlee.getSteering();
            linearVelocity  += steering.linear * Time.deltaTime;
            angularVelocity += steering.angular * Time.deltaTime;
        }
        // Arrive
        else if (behaviorNum == 3)
        {
            Arrive myArrive = new Arrive();
            text.text = "Arrive";

            myArrive.character = this;
            myArrive.target    = myTarget;
            steering           = myArrive.getSteering();
            if (steering != null)
            {
                linearVelocity  += steering.linear * Time.deltaTime;
                angularVelocity += steering.angular * Time.deltaTime;
            }
            else
            {
                linearVelocity = Vector3.zero;
            }
        }
        // Align
        else if (behaviorNum == 4)
        {
            Align myAlign = new Align();
            text.text = "Align";

            myAlign.character = this;
            myAlign.target    = myTarget;
            steering          = myAlign.getSteering();
            if (steering != null)
            {
                linearVelocity  += steering.linear * Time.deltaTime;
                angularVelocity += steering.angular * Time.deltaTime;
            }
        }
        // Face
        else if (behaviorNum == 5)
        {
            Face myFace = new Face();
            text.text = "Face";

            myFace.character = this;
            myFace.target    = myTarget;
            steering         = myFace.getSteering();
            if (steering != null)
            {
                linearVelocity  += steering.linear * Time.deltaTime;
                angularVelocity += steering.angular * Time.deltaTime;
            }
        }
        // Look where you're going
        else if (behaviorNum == 6)
        {
            LWYG myLook = new LWYG();
            text.text = "LWYG";

            myLook.character = this;
            steering         = myLook.getSteering();
            if (steering != null)
            {
                linearVelocity  += steering.linear * Time.deltaTime;
                angularVelocity += steering.angular * Time.deltaTime;
            }
        }
        // Path following
        else if (behaviorNum == 7)
        {
            text.text = "Path Follow";

            myPathFollow.character = this;
            myPathFollow.path      = pathToFollow;
            steering = myPathFollow.getSteering();
            if (steering != null)
            {
                if (linearVelocity.magnitude > 2)
                {
                    linearVelocity = linearVelocity.normalized * 2;
                }

                linearVelocity  += steering.linear * Time.deltaTime;
                angularVelocity += steering.angular * Time.deltaTime;
            }
        }
        // Pursue
        else if (behaviorNum == 8)
        {
            Pursue myPursue = new Pursue();
            text.text = "Pursue";

            myPursue.character = this;
            myPursue.target    = alsoMyTargetForPursueTho;
            steering           = myPursue.getSteering();
            if (steering != null)
            {
                linearVelocity  += steering.linear * Time.deltaTime;
                angularVelocity += steering.angular * Time.deltaTime;
            }
        }
        // Seperate
        else if (behaviorNum == 9)
        {
            text.text = "Seperate";

            mySeperate.character = this;
            mySeperate.targets   = targetsForSeperate;
            steering             = mySeperate.getSteering();
            if (steering != null)
            {
                linearVelocity  += steering.linear * Time.deltaTime;
                angularVelocity += steering.angular * Time.deltaTime;
            }
        }
        // Collision Avoidance
        else if (behaviorNum == 10)
        {
            text.text = "Collision Avoidance";

            CollisionAvoidance myCollision = new CollisionAvoidance();
            myCollision.character = this;
            myCollision.targets   = targetsForSeperate;
            steering = myCollision.getSteering();
            if (steering != null)
            {
                linearVelocity  += steering.linear * Time.deltaTime;
                angularVelocity += steering.angular * Time.deltaTime;
            }
        }
        // Obstacle Avoidance
        else if (behaviorNum == 11)
        {
            text.text = "Obstacle Avoidance";

            ObstacleAvoid myObstacleAvoid = new ObstacleAvoid();
            myObstacleAvoid.character = this;
            myObstacleAvoid.target    = myTarget;
            steering = myObstacleAvoid.getSteering();
            if (steering != null)
            {
                linearVelocity  += steering.linear * Time.deltaTime;
                angularVelocity += steering.angular * Time.deltaTime;
            }
        }
        // Flocking
        else if (behaviorNum == 12)
        {
            text.text = "Flocking";

            if (!setUp)
            {
                // BehaviorAndWeight1 : Seperate
                BehaviorAndWeight behavior1  = new BehaviorAndWeight();
                Seperate          mySeperate = new Seperate();
                mySeperate.character = this;
                GameObject[] birds  = GameObject.FindGameObjectsWithTag("Bird");
                Kinematic[]  kBirds = new Kinematic[birds.Length - 1];

                int j = 0;
                for (int i = 0; i < birds.Length - 1; i++)
                {
                    if (birds[i] == this)
                    {
                        continue;
                    }
                    kBirds[j++] = birds[i].GetComponent <Kinematic>();
                }
                mySeperate.targets = kBirds;

                behavior1.behavior = mySeperate;
                behavior1.weight   = 10f;

                // BehaviorAndWeight2 : Arrive
                BehaviorAndWeight behavior2 = new BehaviorAndWeight();
                Arrive            myArrive  = new Arrive();
                myArrive.character = this;
                myArrive.target    = myTarget;
                behavior2.behavior = myArrive;
                behavior2.weight   = 10f;

                // BehaviorAndWeight3 : Align
                BehaviorAndWeight behavior3 = new BehaviorAndWeight();
                Align             myAlign   = new Align();
                myAlign.character  = this;
                myAlign.target     = myTarget;
                behavior3.behavior = myAlign;
                behavior3.weight   = 3f;

                // BehaviorAndWeight4 : ObstacleAvoidance
                BehaviorAndWeight behavior4  = new BehaviorAndWeight();
                ObstacleAvoid     myObstacle = new ObstacleAvoid();
                myObstacle.character = this;
                myObstacle.target    = myTargetObstacle; // Does this make sense?
                behavior4.behavior   = myObstacle;
                behavior4.weight     = 1f;

                // Lower priority steering behaviors: Arrive, Align, & Seperate
                BlendedSteeringDemo myBlended = new BlendedSteeringDemo();
                myBlended.behaviors    = new BehaviorAndWeight[3];
                myBlended.behaviors[0] = new BehaviorAndWeight();
                myBlended.behaviors[0] = behavior1;
                myBlended.behaviors[1] = new BehaviorAndWeight();
                myBlended.behaviors[1] = behavior2;
                myBlended.behaviors[2] = new BehaviorAndWeight();
                myBlended.behaviors[2] = behavior3;

                // Higher priority steering behavior: Obstacle avoidance
                BlendedSteeringDemo myBlendedAvoid = new BlendedSteeringDemo();
                myBlendedAvoid.behaviors    = new BehaviorAndWeight[1];
                myBlendedAvoid.behaviors[0] = new BehaviorAndWeight();
                myBlendedAvoid.behaviors[0] = behavior4;

                // Initialize myPriority's array of groups with two groups
                myPriority.groups    = new BlendedSteeringDemo[2];
                myPriority.groups[0] = new BlendedSteeringDemo();
                myPriority.groups[0] = myBlendedAvoid;
                myPriority.groups[1] = new BlendedSteeringDemo();
                myPriority.groups[1] = myBlended;

                setUp = true;
            }


            steering = myPriority.getSteering();
            if (steering != null)
            {
                linearVelocity  += steering.linear * Time.deltaTime;
                angularVelocity += steering.angular * Time.deltaTime;
            }
        }
    }
    // Update is called once per frame
    void Update()
    {
        if (behaviorNum != 0)
        {
            // update my position and rotation
            this.transform.position += linearVelocity * Time.deltaTime;
            Vector3 v = new Vector3(0, angularVelocity, 0);
            this.transform.eulerAngles += v * Time.deltaTime;
        }

        // update linear and angular velocities
        SteeringOutput steering = new SteeringOutput();

        // Seek: target is "alsoMyTargetForPursueTho"
        if (behaviorNum == 1)
        {
            Seek mySeek = new Seek();
            text.text = "Seek";

            mySeek.target    = alsoMyTargetForPursueTho;
            mySeek.character = this;

            steering         = mySeek.getSteering();
            linearVelocity  += steering.linear * Time.deltaTime;
            angularVelocity += steering.angular * Time.deltaTime;
        }
        // Flee
        else if (behaviorNum == 2)
        {
            Flee myFlee = new Flee();
            text.text = "Flee";

            myFlee.character = this;
            myFlee.target    = myTarget;
            steering         = myFlee.getSteering();
            linearVelocity  += steering.linear * Time.deltaTime;
            angularVelocity += steering.angular * Time.deltaTime;
        }
        // Arrive
        else if (behaviorNum == 3)
        {
            Arrive myArrive = new Arrive();
            text.text = "Arrive";

            myArrive.character = this;
            myArrive.target    = myTarget;
            steering           = myArrive.getSteering();
            if (steering != null)
            {
                linearVelocity  += steering.linear * Time.deltaTime;
                angularVelocity += steering.angular * Time.deltaTime;
            }
            else
            {
                linearVelocity = Vector3.zero;
            }
        }
        // Align
        else if (behaviorNum == 4)
        {
            Align myAlign = new Align();
            text.text = "Align";

            myAlign.character = this;
            myAlign.target    = myTarget;
            steering          = myAlign.getSteering();
            if (steering != null)
            {
                linearVelocity  += steering.linear * Time.deltaTime;
                angularVelocity += steering.angular * Time.deltaTime;
            }
        }
        // Face
        else if (behaviorNum == 5)
        {
            Face myFace = new Face();
            text.text = "Face";

            myFace.character = this;
            myFace.target    = myTarget;
            steering         = myFace.getSteering();
            if (steering != null)
            {
                linearVelocity  += steering.linear * Time.deltaTime;
                angularVelocity += steering.angular * Time.deltaTime;
            }
        }
        // Look where you're going
        else if (behaviorNum == 6)
        {
            LWYG myLook = new LWYG();
            text.text = "LWYG";

            myLook.character = this;
            steering         = myLook.getSteering();
            if (steering != null)
            {
                linearVelocity  += steering.linear * Time.deltaTime;
                angularVelocity += steering.angular * Time.deltaTime;
            }
        }
        // Path following
        else if (behaviorNum == 7)
        {
            text.text = "Path Follow";

            myPathFollow.character = this;
            myPathFollow.path      = pathToFollow;
            steering = myPathFollow.getSteering();
            if (steering != null)
            {
                linearVelocity  += steering.linear * Time.deltaTime;
                angularVelocity += steering.angular * Time.deltaTime;
            }
        }
        // Pursue
        else if (behaviorNum == 8)
        {
            Pursue myPursue = new Pursue();
            text.text = "Pursue";

            myPursue.character = this;
            myPursue.target    = alsoMyTargetForPursueTho;
            steering           = myPursue.getSteering();
            if (steering != null)
            {
                linearVelocity  += steering.linear * Time.deltaTime;
                angularVelocity += steering.angular * Time.deltaTime;
            }
        }
        // Seperate
        else if (behaviorNum == 9)
        {
            text.text = "Seperate";

            mySeperate.character = this;
            mySeperate.targets   = targetsForSeperate;
            steering             = mySeperate.getSteering();
            if (steering != null)
            {
                linearVelocity  += steering.linear * Time.deltaTime;
                angularVelocity += steering.angular * Time.deltaTime;
            }
        }
        // Collision Avoidance
        else if (behaviorNum == 10)
        {
            text.text = "Collision Avoidance";

            CollisionAvoidance myCollision = new CollisionAvoidance();
            myCollision.character = this;
            myCollision.targets   = targetsForSeperate;
            steering = myCollision.getSteering();
            if (steering != null)
            {
                linearVelocity  += steering.linear * Time.deltaTime;
                angularVelocity += steering.angular * Time.deltaTime;
            }
        }
        // Obstacle Avoidance
        else if (behaviorNum == 11)
        {
            text.text = "Obstacle Avoidance";

            ObstacleAvoid myObstacleAvoid = new ObstacleAvoid();
            myObstacleAvoid.character = this;
            myObstacleAvoid.target    = myTarget;
            steering = myObstacleAvoid.GetSteering();
            if (steering != null)
            {
                linearVelocity  += steering.linear * Time.deltaTime;
                angularVelocity += steering.angular * Time.deltaTime;
            }
        }
    }
    public Tuple <float, float> speedAndTurn(GameObject car)
    {
        PathPlanningKart kart = car.GetComponent <PathPlanningKart>();

        //Set current position and check if car needs to move backwards
        if (kart.iterationOffset == 0)
        {
            kart.currentPosition = car.transform.position;
        }

        if (kart.isStuck && kart.isStuckOffset < 60)
        {
            kart.isStuckOffset += 1;
            return(new Tuple <float, float>(-1.0f, 0));
        }
        else
        {
            kart.isStuck       = false;
            kart.isStuckOffset = 0;
        }

        kart.iterationOffset = (kart.iterationOffset + 1) % 100;

        if (kart.iterationOffset == 99)
        {
            if (Vector3.Distance(kart.currentPosition, car.transform.position) <= 1.5f)
            {
                kart.isStuck = true;
                return(new Tuple <float, float>(-1.0f, 0));
            }
        }

        //Adjust steer accordingly if obstacles are present
        float speed = 0;
        float steer = 0;


        //Obtain current movement direction of the car
        //Determine current angle of car steer
        Vector3 forward  = car.transform.forward;
        float   carAngle = Mathf.Atan(forward.z / forward.x);

        if (kart.dynamicReplan && kart.dynamicWayPoints != null && kart.dynamicWayPoints.Count > 0)
        {
            kart.nextWayPoints = kart.dynamicWayPoints;
            kart.dynamicReplan = false;
            cleanUpPath(kart);
        }

        if (kart.nextWayPoints != null && kart.nextWayPoints.Count == 0)
        {
            kart.nextWayPoints = null;
        }

        if (kart.current_waypoint >= kart.currentWayPoints.Count && kart.nextWayPoints != null)
        {
            cleanUpPath(kart);
        }

        Vector3 currentWayPoint  = kart.currentWayPoints[kart.current_waypoint];
        Vector3 desiredDirection = new Vector3(0, 0, 0);

        desiredDirection.y = currentWayPoint.y;
        desiredDirection.x = currentWayPoint.x - car.transform.position.x;
        desiredDirection.z = currentWayPoint.z - car.transform.position.z;
        float desiredAngle = Mathf.Atan(desiredDirection.z / desiredDirection.x);

        //Conversion from radians to a steer between -1 and 1
        if (carAngle - desiredAngle > Mathf.PI / 2)
        {
            desiredAngle += Mathf.PI;
        }
        if (carAngle - desiredAngle < -Mathf.PI / 2)
        {
            carAngle += Mathf.PI;
        }

        steer = (carAngle - desiredAngle) / (Mathf.PI / 2);
        if (steer > 1)
        {
            steer = Mathf.Min(steer, 1f);
        }
        if (steer < -1)
        {
            steer = Mathf.Max(steer, -1f);
        }

        //If within small distance away to the current waypoint, move onto the next waypoint
        if (desiredDirection.magnitude < 5)
        {
            lock (PathPlanningDataStructures.globalLock) {
                if (kart.usesWaypoints [kart.current_waypoint])
                {
                    PathPlanningDataStructures.nodeToCount[kart.currentWayPoints[kart.current_waypoint]] -= 1;
                    kart.usesWaypoints [kart.current_waypoint] = false;
                }
            }
            kart.current_waypoint = kart.current_waypoint + 1;
            justSwitchedWaypoint  = true;
            if (kart.current_waypoint >= kart.currentWayPoints.Count && kart.nextWayPoints != null)
            {
                cleanUpPath(kart);
            }
        }
        else
        {
            justSwitchedWaypoint = false;
        }
        if (kart.current_waypoint + 1 < kart.currentWayPoints.Count)
        {
            if (Vector3.Distance(kart.transform.position, kart.currentWayPoints [kart.current_waypoint]) > 15)
            {
                kart.dynamicReplan = true;
            }
        }
        else
        {
            if (Vector3.Distance(kart.transform.position, kart.currentWayPoints [kart.current_waypoint - 1]) > 15)
            {
                kart.dynamicReplan = true;
            }
        }

        Vector3 inversePoint = kart.transform.InverseTransformPoint(kart.currentWayPoints[kart.currentWayPoints.Count - 1]);

        if (inversePoint.z < 0)
        {
            Debug.Log("Going Backwards");
            if (inversePoint.x > 0)
            {
                steer = 1;
            }
            else
            {
                steer = -1;
            }
        }

        ObstacleAvoid obstacleAvoid = car.GetComponent <ObstacleAvoid> ();

        if (obstacleAvoid.leftObs && !obstacleAvoid.rightObs)
        {
            steer = Mathf.Min(.5f / obstacleAvoid.LeftDis, 0.5f);
        }
        if (obstacleAvoid.rightObs && !obstacleAvoid.leftObs)
        {
            steer = -1 * Mathf.Min(.5f / obstacleAvoid.RightDis, 0.5f);
        }
        if (obstacleAvoid.centerObs && !obstacleAvoid.rightObs && !obstacleAvoid.leftObs)
        {
            steer = Mathf.Min(.5f / obstacleAvoid.CenterDis, 0.5f);
        }


        speed = Mathf.Sqrt(1.15f - (steer * steer));

        return(new Tuple <float, float> (speed, steer));
    }
    public Tuple <float, float> speedAndTurn(GameObject car)
    {
        ObstacleAvoid obstacleAvoid = car.GetComponent <ObstacleAvoid> ();
        float         speed         = 0;
        float         steer         = 0;

        if (obstacleAvoid.leftObs && !obstacleAvoid.rightObs)
        {
            steer = Mathf.Max(1.2f / obstacleAvoid.LeftDis, 0.35f);
        }
        if (obstacleAvoid.rightObs && !obstacleAvoid.leftObs)
        {
            steer = -1 * Mathf.Max(1.2f / obstacleAvoid.RightDis, 0.35f);
        }
        if (obstacleAvoid.centerObs && !obstacleAvoid.rightObs && !obstacleAvoid.leftObs)
        {
            steer = Mathf.Max(1.2f / obstacleAvoid.CenterDis, 0.35f);
        }
        if (obstacleAvoid.centerObs && (obstacleAvoid.leftObs || obstacleAvoid.rightObs))
        {
            steer = steer * 1.42f;
        }

        Kart    kart            = car.GetComponent <Kart> ();
        Vector3 travelDirection = car.transform.InverseTransformPoint(new Vector3(kart.wayPoints[kart.current_point].x,
                                                                                  car.transform.position.y,
                                                                                  kart.wayPoints[kart.current_point].z));
        // For skipping if the waypoint is behind the car
        Vector3 relPosition = car.transform.InverseTransformPoint(kart.wayPoints [kart.current_point]);

        if (relPosition.z <= 0)
        {
            int see_ahead = kart.current_point + 1;
            if (see_ahead >= kart.wayPoints.Count)
            {
                see_ahead = 0;
            }
            Vector3 seeDirection = car.transform.InverseTransformPoint(new Vector3(kart.wayPoints[see_ahead].x,
                                                                                   car.transform.position.y,
                                                                                   kart.wayPoints[see_ahead].z));
            if (seeDirection.z > 0)
            {
                kart.current_point = see_ahead;
                return(speedAndTurn(car));
            }
        }

        steer = travelDirection.x / travelDirection.magnitude + steer;
        if (steer > 1)
        {
            //input_steer = 1;
            steer = Mathf.Min(steer, 1.25f);
        }
        if (steer < -1)
        {
            //input_steer = -1;
            steer = Mathf.Max(steer, -1.25f);
        }

        if (travelDirection.magnitude < 12)
        {
            kart.current_point = kart.current_point + 1;

            if (kart.current_point >= kart.wayPoints.Count)
            {
                kart.current_point = 0;
            }
        }

        speed = Mathf.Sqrt(1 - (steer * steer));

        return(new Tuple <float, float> (speed, steer));
    }