コード例 #1
0
    private RFRD TrackUpdate(float accel, float steer, WheelDataExt[] WD, GameObject track, int RotateDir, ref Vector2 trackTextureOffset, WheelData[] upperWheels, ref float middleRPM)
    {
        RFRD  rfrd  = new RFRD();
        float delta = Time.fixedDeltaTime;

        float trackRpm = 0.0f;

        trackRpm  = CalculateSmoothRpm(WD);
        trackRpm += (AngularVelocity * RotateDir * 0.25f) / Time.deltaTime;
        middleRPM = trackRpm;

        float RPMtoDeg = delta * trackRpm * 360.0f / 60.0f;

        if (wheelsAndBonesAxisSettings.inverseWheelsRotation)
        {
            RPMtoDeg *= -1.0f;
        }

        if (isUsingWheelSkidmarks)
        {
            if (RotateDir > 0)
            {
                leftWheelSkidmarks.gameObject.SetActive(WD[0].col.isGrounded);
                if (!WD[0].col.isGrounded)
                {
                    leftWheelSkidmarks.lastSkidmark = -1;
                }
            }
            else
            {
                rightWheelSkidmarks.gameObject.SetActive(WD[0].col.isGrounded);
                if (!WD[0].col.isGrounded)
                {
                    rightWheelSkidmarks.lastSkidmark = -1;
                }
            }
        }

        for (int i = 0; i < WD.Length; i++)
        {
            WD[i].wheelRotationAngles[wheelsAndBonesAxisSettings.WRAxisPointer] = Mathf.Repeat(WD[i].wheelRotationAngles[wheelsAndBonesAxisSettings.WRAxisPointer] + RPMtoDeg, 360.0f);
            WD[i].wheelTransform.localEulerAngles = WD[i].wheelRotationAngles;
            rfrd += CalculateMotorForce(WD[i].col, accel, steer);
        }
        for (int i = 0; i < upperWheels.Length; i++)
        {
            upperWheels[i].wheelRotationAngles[wheelsAndBonesAxisSettings.WRAxisPointer] = Mathf.Repeat(upperWheels[i].wheelRotationAngles[wheelsAndBonesAxisSettings.WRAxisPointer] + RPMtoDeg, 360.0f);
            upperWheels[i].wheelTransform.localEulerAngles = upperWheels[i].wheelRotationAngles;
        }

        if (track != null)
        {
            trackTextureOffset += new Vector2(0, RPMtoDeg * delta);
            track.GetComponent <MeshRenderer>().material.mainTextureOffset = trackTextureOffset;
        }
        return(rfrd);
    }
コード例 #2
0
    public void UpdateWheels(float accel, float steer)
    {
        if (leftTrackWheelData == null && rightTrackWheelData == null)
        {
            return;
        }

        if (steer != 0 && !isBrakeingAble)
        {
            if ((accel != 1 || accel != -1) && (rigidBody.velocity.magnitude * 3.6f < 5))
            {
                if (rigidBody.angularVelocity.magnitude / Mathf.Deg2Rad < 10)
                {
                    if (accel >= 0)
                    {
                        accel = PushSpeed;
                    }
                    else
                    {
                        accel = -PushSpeed;
                    }
                    steer = 0;
                }
                else if (rigidBody.angularVelocity.magnitude / Mathf.Deg2Rad < maxAngularVelocity - 10)
                {
                    if (accel >= 0)
                    {
                        accel = PushSpeed;
                    }
                    else
                    {
                        accel = -PushSpeed;
                    }
                }
            }
        }

        leftTrackSpeed  = RPMtoKMPH(leftTrackWheelData[0].col.radius, leftTrackMiddleRPM) + steerGByAngularVelocity * 10;
        rightTrackSpeed = RPMtoKMPH(rightTrackWheelData[0].col.radius, rightTrackMiddleRPM) - steerGByAngularVelocity * 10;

        RFRD rfrd = new RFRD();

        LeftTrackRPM  = TrackRPM(leftTrackWheelData);
        RightTrackRPM = TrackRPM(leftTrackWheelData);

        t += Time.fixedDeltaTime;

        rfrd  = TrackUpdate(accel, steer, leftTrackWheelData, leftTrack, 1, ref leftTrackTextureOffset, leftTrackUpperWD, ref leftTrackMiddleRPM);
        rfrd += TrackUpdate(accel, -steer, rightTrackWheelData, rightTrack, -1, ref rightTrackTextureOffset, rightTrackUpperWD, ref rightTrackMiddleRPM);

        rotationVector.y = steer * rfrd.rotationForce;
        rotationVector.z = -steer * rfrd.rotationDamper;

        //
        //Debug.Log(rigidbody.angularVelocity);
    }
コード例 #3
0
    private RFRD CalculateMotorForce(WheelCollider col, float accel, float steer)
    {
        WheelFrictionCurve fc = colliderFromPrefab.sidewaysFriction;

        RFRD rfrd = new RFRD();

        float wheelSpeed = Mathf.Abs(RPMtoKMPH(col.radius, col.rpm));

        float motorTorque = 0.0f;
        float brakeTorque = 0.0f;

        if (accel == 0 && steer == 0)
        {
            brakeTorque = accelerationConfiguration.brake.Evaluate(wheelSpeed);
            motorTorque = 0.0f;

            rfrd.rotationForce  = 0.0f;
            rfrd.rotationDamper = 0.0f;
        }
        else if (accel == 0.0f)
        {
            if (!col.isGrounded)
            {
                motorTorque = steer * accelerationConfiguration.acceleration.Evaluate(wheelSpeed);

                rfrd.rotationForce  = 0.0f;
                rfrd.rotationDamper = 0.0f;
            }
            else
            {
                rfrd.rotationForce  = rotationOnStayConfiguration.rotateSpeed.Evaluate(wheelSpeed) / wheelsCount;
                rfrd.rotationDamper = rotationDamper.Evaluate(wheelSpeed) / wheelsCount;

                motorTorque = 0.0f;

                fc.asymptoteValue *= sidewaysFrictionAsymptoteFactor;
                fc.extremumValue  *= sidewaysFrictionExtremumFactor;
            }
            //brakeTorque = accelerationConfiguration.brake.Evaluate (wheelSpeed);

            brakeTorque = rotationOnStayConfiguration.brake.Evaluate(wheelSpeed);
        }
        else
        {
            if (steer != 0.0f)
            {
                if (!col.isGrounded)
                {
                    rfrd.rotationForce  = 0.0f;
                    rfrd.rotationDamper = 0.0f;
                }
                else
                {
                    rfrd.rotationForce  = rotationOnAccelerationConfiguration.rotateSpeed.Evaluate(wheelSpeed) / wheelsCount;
                    rfrd.rotationDamper = rotationDamper.Evaluate(wheelSpeed) / wheelsCount;

                    fc.asymptoteValue *= sidewaysFrictionAsymptoteFactor;
                    fc.extremumValue  *= sidewaysFrictionExtremumFactor;
                }
            }

            motorTorque = accel * accelerationConfiguration.acceleration.Evaluate(wheelSpeed);

            if (col.rpm > 0 && accel < 0)
            {
                brakeTorque = accelerationConfiguration.brake.Evaluate(wheelSpeed);
            }
            else if (col.rpm < 0 && accel > 0)
            {
                brakeTorque = accelerationConfiguration.brake.Evaluate(wheelSpeed);
            }
            else
            {
                if (steer != 0.0f)
                {
                    brakeTorque = rotationOnAccelerationConfiguration.brake.Evaluate(wheelSpeed);
                }
                else
                {
                    brakeTorque = 0.0f;
                }
            }
        }

        //col.suspensionSpring = js;

        col.motorTorque = motorTorque;
        col.brakeTorque = brakeTorque;


        col.sidewaysFriction = fc;

        return(rfrd);
    }
コード例 #4
0
    private RFRD TrackUpdate(float accel,float steer,WheelDataExt[] WD, GameObject track, ref Vector2 trackTextureOffset, WheelData[] upperWheels, ref float middleRPM)
    {
        float delta = Time.fixedDeltaTime;

        RFRD rfrd = new RFRD();

        float trackRpm = 0.0f;

        trackRpm = CalculateSmoothRpm(WD);
        middleRPM = trackRpm;

        float RPMtoDeg = delta * trackRpm * 360.0f / 60.0f;

        if(wheelsAndBonesAxisSettings.inverseWheelsRotation)
            RPMtoDeg *=-1.0f;

        foreach (WheelDataExt w in WD){
            w.wheelTransform.localPosition = CalculateWheelOrBonePosition(w.wheelTransform,w.col,w.wheelStartPos,true);
            w.boneTransform.localPosition = CalculateWheelOrBonePosition(w.boneTransform,w.col,w.boneStartPos,false);

            w.wheelRotationAngles[wheelsAndBonesAxisSettings.WRAxisPointer] =
                            Mathf.Repeat(w.wheelRotationAngles[wheelsAndBonesAxisSettings.WRAxisPointer] + RPMtoDeg,360.0f);

            w.wheelTransform.localEulerAngles = w.wheelRotationAngles;

            rfrd += CalculateMotorForce(w.col,accel,steer);

            //Debug.Log(rfrd.rotationDamper);

        }

        if(trackTextireAnimationSettings.inverseTextureDirection)
            trackRpm *=-1.0f;

        trackTextureOffset[trackTextireAnimationSettings.TTAxisPointer] = Mathf.Repeat(trackTextureOffset[trackTextireAnimationSettings.TTAxisPointer] + delta*trackRpm*trackTextureSpeed/60.0f,1.0f);

        if(track.renderer.material.GetTexture("_MainTex")){
            track.renderer.material.SetTextureOffset("_MainTex",trackTextureOffset);
        }

        if(track.renderer.material.GetTexture("_BumpMap")){
            track.renderer.material.SetTextureOffset("_BumpMap",trackTextureOffset);
        }

        foreach (WheelData w in upperWheels){

            w.wheelRotationAngles[wheelsAndBonesAxisSettings.WRAxisPointer] =
                            Mathf.Repeat(w.wheelRotationAngles[wheelsAndBonesAxisSettings.WRAxisPointer] + RPMtoDeg,360.0f);

            w.wheelTransform.localEulerAngles = w.wheelRotationAngles;

        }

        return rfrd;
    }
コード例 #5
0
    private RFRD CalculateMotorForce(WheelCollider col, float accel, float steer)
    {
        WheelFrictionCurve fc = colliderFromPrefab.sidewaysFriction;

        RFRD rfrd = new RFRD();

        float wheelSpeed = Mathf.Abs(RPMtoKMPH(col.radius,col.rpm));

        float motorTorque = 0.0f;
        float brakeTorque = 0.0f;

        if(accel == 0 && steer == 0){
            brakeTorque = accelerationConfiguration.brake.Evaluate(wheelSpeed);
            motorTorque =0.0f;

            rfrd.rotationForce = 0.0f;
            rfrd.rotationDamper = 0.0f;
        }else if( accel == 0.0f){

            if(!col.isGrounded){
                motorTorque = steer*accelerationConfiguration.acceleration.Evaluate(wheelSpeed);

                rfrd.rotationForce = 0.0f;
                rfrd.rotationDamper = 0.0f;
            }else{

                rfrd.rotationForce = rotationOnStayConfiguration.rotateSpeed.Evaluate(wheelSpeed) / wheelsCount;
                rfrd.rotationDamper = rotationDamper.Evaluate(wheelSpeed) / wheelsCount;

                motorTorque = 0.0f;

                fc.asymptoteValue *= sidewaysFrictionAsymptoteFactor;
                fc.extremumValue *= sidewaysFrictionExtremumFactor;
            }

            brakeTorque = rotationOnStayConfiguration.brake.Evaluate(wheelSpeed);

        }else{

            if(steer!=0.0f)
                if(!col.isGrounded){

                    rfrd.rotationForce = 0.0f;
                    rfrd.rotationDamper = 0.0f;
                }else{

                    rfrd.rotationForce = rotationOnAccelerationConfiguration.rotateSpeed.Evaluate(wheelSpeed) / wheelsCount;
                    rfrd.rotationDamper = rotationDamper.Evaluate(wheelSpeed) / wheelsCount;

                    fc.asymptoteValue *= sidewaysFrictionAsymptoteFactor;
                    fc.extremumValue *= sidewaysFrictionExtremumFactor;
                }

            motorTorque = accel*accelerationConfiguration.acceleration.Evaluate(wheelSpeed);

            if(col.rpm > 0 && accel < 0){
                brakeTorque = accelerationConfiguration.brake.Evaluate(wheelSpeed);
            }else if(col.rpm < 0 && accel > 0){
                brakeTorque = accelerationConfiguration.brake.Evaluate(wheelSpeed);
            }else{
                if(steer!=0.0f)
                    brakeTorque = rotationOnAccelerationConfiguration.brake.Evaluate(wheelSpeed);
                else
                    brakeTorque = 0.0f;
            }

        }

        //col.suspensionSpring = js;

        col.motorTorque = motorTorque;
        col.brakeTorque = brakeTorque;

        col.sidewaysFriction = fc;

        return rfrd;
    }
コード例 #6
0
    public void UpdateWheels(float accel,float steer)
    {
        RFRD rfrd = new RFRD();

        rfrd =TrackUpdate(accel,steer,leftTrackWheelData,leftTrack,ref leftTrackTextureOffset,leftTrackUpperWD,ref leftTrackMiddleRPM);
        rfrd +=TrackUpdate(accel,-steer,rightTrackWheelData,rightTrack,ref rightTrackTextureOffset,rightTrackUpperWD,ref rightTrackMiddleRPM);

        rotationVector.y = steer*rfrd.rotationForce;
        rotationVector.z = -steer*rfrd.rotationDamper;

        if(steer!=0.0f){

            rigidbody.AddRelativeTorque(rotationVector,ForceMode.Acceleration);			//-steer*rfrd.rotationDamper
        }

        //Debug.DrawRay(transform.position,rigidbody.angularVelocity,Color.red);
        //Debug.Log(rigidbody.angularVelocity);
    }