Пример #1
0
    // Runs every fixed interval of time
    void FixedUpdate()
    {
        /*-------------------------------------------------------------------------------------------------------
         * --------------------------------------Player Controller Script-------------------------------------------
         * --------------------------------------------------------------------------------------------------------*/
        if (player_controller)
        {
            instantePower = Input.GetAxis("Vertical") * motorPower * Time.deltaTime;
            wheelTurn     = Input.GetAxis("Horizontal") * maxTurn;
            brake         = Input.GetKey("space");


            if (!(Input.GetAxis("Vertical") == 0) || !(Input.GetAxis("Horizontal") == 0))
            {
                time = 0;
            }


            //Turn Collider
            getCollider(0).steerAngle = wheelTurn;
            getCollider(1).steerAngle = wheelTurn;

            //Turn Wheels
            wheels[0].localEulerAngles = new Vector3(wheels[0].localEulerAngles.x, getCollider(0).steerAngle - wheels[0].localEulerAngles.z + 90, wheels[0].localEulerAngles.z);
            wheels[1].localEulerAngles = new Vector3(wheels[1].localEulerAngles.x, getCollider(1).steerAngle - wheels[0].localEulerAngles.z + 90, wheels[1].localEulerAngles.z);

            //Spin Wheels
            wheels[0].Rotate(0, -getCollider(0).rpm / 60 * 360 * Time.deltaTime, 0);
            wheels[1].Rotate(0, -getCollider(1).rpm / 60 * 360 * Time.deltaTime, 0);
            wheels[2].Rotate(0, -getCollider(2).rpm / 60 * 360 * Time.deltaTime, 0);
            wheels[3].Rotate(0, -getCollider(3).rpm / 60 * 360 * Time.deltaTime, 0);

            //brakes
            if (brake)
            {
                time += Time.deltaTime;
                if (time > 3f)
                {
                    stopBot();
                }
                else
                {
                    Vector3 prev = myRigidbody.velocity;
                    prev.z = prev.z / 2;
                    prev.x = prev.x / 2;
                    myRigidbody.velocity = prev;
                }
            }
            else
            {
                getCollider(0).brakeTorque = 0.0f;
                getCollider(1).brakeTorque = 0.0f;
                getCollider(2).brakeTorque = 0.0f;
                getCollider(3).brakeTorque = 0.0f;

                getCollider(2).motorTorque = instantePower;
                getCollider(3).motorTorque = instantePower;
            }
        }
        else
        {
            /*-------------------------------------------------------------------------------------------------------
             * ---------------------------------------TCP Controller Script---------------------------------------------
             * --------------------------------------------------------------------------------------------------------*/

            string command = myTCP.getTransform();      //Retrieves TCP data
            myTCP.resetTransform();                     //Resets TCP data so that it doesn't retrieve the same data twice
            if (command != "")
            {
                if (command.IndexOf("WHEELS") > 0)      //Checks for WHEEL values
                {
                    print("Command is " + command);

                    //Parses WHEEL command and stores it in wheel_force
                    command = command.Substring(command.IndexOf(",") + 1, command.IndexOf(">") - command.IndexOf(",") - 1);
                    String[] wheel_commands = command.Split(',');
                    wheel_force = Array.ConvertAll <String, float>(wheel_commands, float.Parse);
                    time        = 0;
                }
            }

            //Minimodbot should be able to go forward backward OR turn left right
            //If wheel front wheel force are both > 0 ----> forward
            //If Wheel front wheel force are both < - ----> backward
            //if Wheel front wheel has one thats < 0 and the other > 0 ----> you are turnt
            //Probably repetition in the code, reminder to clean it in the future
            if (wheel_force[0] > 0 && wheel_force[1] > 0)       //forward backward
            {
                if (instantePower < 0)
                {
                    stopBot();
                }
                instantePower = Math.Abs(wheel_force[0] / 100) * motorPower * Time.deltaTime;
                wheelTurn     = 0;
            }
            else if (wheel_force[0] < 0 && wheel_force[1] < 0)
            {
                if (instantePower > 0)
                {
                    stopBot();
                }
                instantePower = -Math.Abs(wheel_force[0] / 100) * motorPower * Time.deltaTime;
                wheelTurn     = 0;
            }

            if (wheel_force[0] > 0 && wheel_force[1] < 0)       //turning left right
            {
                if (wheelTurn == 0)
                {
                    stopBot();
                }
                wheelTurn     = Mathf.Min(1, wheel_force[0] / 50) * maxTurn;
                instantePower = 0;
            }
            else if (wheel_force[0] < 0 && wheel_force[1] > 0)
            {
                if (wheelTurn == 0)
                {
                    stopBot();
                }
                wheelTurn     = -Mathf.Min(1, wheel_force[1] / 50) * maxTurn;
                instantePower = 0;
            }

            //Turn Collider
            getCollider(0).steerAngle = wheelTurn;
            getCollider(1).steerAngle = wheelTurn;

            //Turn Wheels
            //Not Needed, its just an animation for wheel turning
            //wheels[0].localEulerAngles = new Vector3(wheels[0].localEulerAngles.x, getCollider(0).steerAngle - wheels[0].localEulerAngles.z + 90, wheels[0].localEulerAngles.z);
            //wheels[1].localEulerAngles = new Vector3(wheels[1].localEulerAngles.x, getCollider(1).steerAngle - wheels[0].localEulerAngles.z + 90, wheels[1].localEulerAngles.z);

            //Spin Wheels
            wheels[0].Rotate(0, -getCollider(0).rpm / 60 * 360 * Time.deltaTime, 0);
            wheels[1].Rotate(0, -getCollider(1).rpm / 60 * 360 * Time.deltaTime, 0);
            wheels[2].Rotate(0, -getCollider(2).rpm / 60 * 360 * Time.deltaTime, 0);
            wheels[3].Rotate(0, -getCollider(3).rpm / 60 * 360 * Time.deltaTime, 0);

            //brakes
            if (wheel_force[0] == 0 && wheel_force[1] == 0)
            {
                time += Time.deltaTime;
                if (time > 3f)
                {
                    stopBot();      //hard stop
                }
                else
                {
                    //Slows down velocity by half each time, for more "natural" stop
                    Vector3 prev = myRigidbody.velocity;
                    prev.z = prev.z / 2;
                    prev.x = prev.x / 2;
                    myRigidbody.velocity = prev;
                }
            }
            else
            {
                getCollider(0).brakeTorque = 0.0f;
                getCollider(1).brakeTorque = 0.0f;
                getCollider(2).brakeTorque = 0.0f;
                getCollider(3).brakeTorque = 0.0f;

                //physics for actual forward and backward movement
                getCollider(2).motorTorque = instantePower;
                getCollider(3).motorTorque = instantePower;

                if (wheelTurn != 0)
                {
                    //Rotates rigidbody (minimodbot) in place
                    Transform pivot = myRigidbody.transform.Find("PivotPoint");
                    if (wheelTurn > 0)
                    {
                        myRigidbody.transform.RotateAround(pivot.position, Vector3.up, 1);
                    }
                    else
                    {
                        myRigidbody.transform.RotateAround(pivot.position, Vector3.up, -1);
                    }
                }
            }
        }
    }