Jump to content
Unity Insider Forum

Simple Car Controller mit Save/Load und Tuning Funktion


Kuxii

Recommended Posts

So habe heute mal etwas gebastelt,

Nun Lege ich mal einen meiner Meinung nach Guten "Simplen" Car Controller vor,

Er hat eine Speichern/Lade Funtion mit an Bord. Tuning Optionen sind auch enthalten die sich im Code Beliebig anpassen lassen, JEDOCH muss ich dazu sagen das ich die Rückwerts fahr Funktion um die Uhrzeit mehr hinbekommen habe (Durch gemachte Nacht xD)

 

Der Car Controller:

/*
 _  __          _ _  _____        __ _   
| |/ /         (_|_)/ ____|      / _| |  
| ' /_   ___  ___ _| (___   ___ | |_| |_ 
|  <| | | \ \/ / | |\___ \ / _ \|  _| __|
| . \ |_| |>  <| | |____) | (_) | | | |_ 
|_|\_\__,_/_/\_\_|_|_____/ \___/|_|  \__|
		  ©2017 by Kuxii
*/
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using System.IO;
using System;

public class CarController : MonoBehaviour {
    [Header("                        --- Kuxii's Car Controller ---")]
    [Tooltip("Aktuelle Script Version")]
    public string version = "3.0.1";
    [Tooltip("AutoName")]
    public string VehicleName = "";
    [Tooltip("Max Motordrehzahl U/min")]
    public float maxDrehmoment;
    [Tooltip("Max Kmh")]
    public float MaxKmh = 145;
    [Tooltip("Max Hand Brems Kraft")]
    public float HandbremsKraft;
    [Tooltip("Max  Brems Kraft")]
    public float bremsKraft;
    [Tooltip("Max Lenkeinschlag")]
    public float MaxLenkeinschlag = 45;
    [Tooltip("Max TankInhalt in L")]
    public float maxTankInhalt;
    [Tooltip("Taste zum Motor Starten")]
    public KeyCode startengine = KeyCode.E;
    [Header("                        --- Aktuelle Auto Daten ---")]
    [Tooltip("Zurück gelegte strecke in Km")]
    public float Km;
    [Tooltip("Aktuelle Geschwindigkeit")]
    public float kmh;
    [Tooltip("Aktueller Gang")]
    public int gear = 0;
    [Tooltip("Aktuelle Motordrehzahl")]
    public float Rpm = 0;
    [Tooltip("Turbo Ladedruck")]
    public float LadeDruck;
    [Tooltip("Benzin Verbrauch")]
    public float Verbrauch;
    [Tooltip("Aktueller Tankinhalt")]
    public float TankInhalt;
    [Tooltip("Motor An/Aus")]
    public bool isEngineAn;
    [Header("                        --- Car Tuning ---")]
    [Tooltip("Turbo Ja/Nein")]
    public bool Mod0;
    [Tooltip("Chip Tuning")]
    public bool Mod1;
    [Tooltip("Scharfe Nockenwelle")]
    public bool Mod2;
    [Tooltip("Weber Vergaser")]
    public bool Mod3;
    [Tooltip("Bremsen Upgrade")]
    public bool Mod4;
    [Tooltip("Geschmiedete Kolben")]
    public bool Mod5;
    [Tooltip("Größerer Tank")]
    public bool Mod6;
    [Header("                        --- Benötigte Teile ---")]
    [Tooltip("Auto Basis")]
    public Transform vehicle;
    [Tooltip("Anzahl der Achsen")]
    public List<NewCar> Car_Achsen;
    private float speedLimit;
    private Vector3 lastPosition;
    private CarData SaveCarData;

    void Start () {
        SaveCarData = new CarData();
        CheckCar();
        LastOrt();
        lastPosition = transform.position;
    }


    void Update()
    {

        float steering = MaxLenkeinschlag * Input.GetAxis("Lenkung");
        float HandBrems = Mathf.Abs(Input.GetAxis("Handbremse"));
        float motor = maxDrehmoment * Input.GetAxis("Beschleunigung") + (LadeDruck -0.5f);
        float bremse = Mathf.Abs(Input.GetAxis("Brems"));
        {
            //*     Wenn spritt leer geworden ist       *//
            if (TankInhalt < 0.1f)
            {
                motor = 0;
                isEngineAn = false;
                Rpm = 0;
            }

            foreach (NewCar Car_Info in Car_Achsen)
            {
                //*               Lenk Befehl auf die Achse                      *//
                if (Car_Info.LenkAchse == true)
                {
                    Car_Info.LinkesRad.steerAngle = Car_Info.RechtesRad.steerAngle = ((Car_Info.reverseTurn) ? -1 : 1) * steering;
                }

                //*           Gibt die Motor Kraft auf die Achse                 *//
                if (Car_Info.Antriebsachse == true && isEngineAn == true)
                {
                    bremse = 0;
                    Car_Info.LinkesRad.motorTorque = motor;
                    Car_Info.RechtesRad.motorTorque = motor;
                }
                else
                {
                    Car_Info.LinkesRad.motorTorque = 0;
                    Car_Info.RechtesRad.motorTorque = 0;
                }

                //*               NormalBremse Anwenden                           *//
                if (Car_Info.Bremse == true && bremse > 0.5)
                {
                    motor = 0;
                    Car_Info.LinkesRad.brakeTorque = bremsKraft * Car_Info.BremsWirkung;
                    Car_Info.RechtesRad.brakeTorque = bremsKraft * Car_Info.BremsWirkung;

                }

                //*                  NormalBremse Lösen                           *//
                if (Car_Info.Bremse == true && bremse < 0.5)
                {
                    Car_Info.LinkesRad.brakeTorque = 0;
                    Car_Info.RechtesRad.brakeTorque = 0;
                }

                //*                  HandBremse Anwenden                         *//
                if (Car_Info.HandBremse == true && HandBrems > 0.1)
                {
                    motor = 0;
                    Car_Info.LinkesRad.brakeTorque = HandbremsKraft;
                    Car_Info.RechtesRad.brakeTorque = HandbremsKraft;
                }

                //*                  HandBremse Freigabe                         *//
                if (Car_Info.HandBremse == true && HandBrems < 0.5)
                {
                    Car_Info.LinkesRad.brakeTorque = 0;
                    Car_Info.RechtesRad.brakeTorque = 0;
                }

                //  * Holt die aktuelle Geschwindgkeit und Dated die Meshes ab   *//
                kmh = Mathf.Round(vehicle.GetComponent<Rigidbody>().velocity.magnitude * 3.6f);
                VisualizeWheel(Car_Info);
            }
        }

        //  * Speed Limiter  && CarSaveToFile *//
        vehicle.GetComponent<Rigidbody>().drag = (kmh / (MaxKmh + vehicle.GetComponent<Rigidbody>().mass));
        SaveCarToSaveFile();
        //*     Motor Starten       *//
        if (Input.GetKeyDown(startengine))
        {
            if (TankInhalt >= 1.50F)
            {
                if (isEngineAn == false)
                {
                    isEngineAn = true;
                    TankInhalt -= 0.01f;
                }
                else
                {
                    isEngineAn = false;
                    motor = 0;
                    TankInhalt -= 0f;
                }
            }
            else
            {
                isEngineAn = false;
                TankInhalt -= 0f;
                Debug.Log("Bitte erst einmal Tanken!");
            }
        }

        //*     Benzin Verbrauch       *//
        if (isEngineAn == true)
        {
            TankInhalt -= Verbrauch;
            Verbrauch = (Rpm/ 10000000) / 4;
        }

        if (isEngineAn == false)
        {
            TankInhalt -= Verbrauch;
            Verbrauch = 0;
        }
    }
    

    private void FixedUpdate()
    {
        //* Gang Fix *//
        if (Rpm == -11000)
        {
            ShiftRpm1 = 0;
            ShiftRpm2 = 0;
            ShiftRpm3 = 0;
            ShiftRpm4 = 0;
            ShiftRpm5 = 0;
            ShiftRpm6 = 0;
        }

        if (Rpm <= -1000)
        {
            ShiftRpm1 = 1000;
            ShiftRpm2 = 0;
            ShiftRpm3 = 0;
            ShiftRpm4 = 0;
            ShiftRpm5 = 0;
            ShiftRpm6 = 0;
        }

        //* Gang 1 *//
        if (Rpm >= 0 && Rpm <= 9500)
        {

            gear = 0;
            ShiftRpm1 = 0f;
        }

        //* Gang 2 *//
        if (Rpm >= 10000 && Rpm <= 21000)
        {
            gear = 1;
            ShiftRpm1 = 0f;
        }

        //* Gang 3 *//
        if (Rpm >= 32000 && Rpm <= 38000)
        {
            gear = 2;
            ShiftRpm2 = 10000f;
        }

        //* Gang 4 *//
        if (Rpm >= 48000 && Rpm <= 54000)
        {
            gear = 3;
            ShiftRpm3 = 10000f;
        }

        //* Gang 5 *//
        if (Rpm >= 64000 && Rpm <= 70000)
        {
            gear = 4;
            ShiftRpm4 = 10000f;
        }

        //* Gang 6 *//
        if (Rpm >= 75000 && Rpm <= 80000)
        {
            gear = 5;
            ShiftRpm5 = 500f;
        }

        //* Gang 7 *//
        if (Rpm >= 79000 && Rpm <= 78000)
        {
            gear = 6;
            ShiftRpm6 = 10000f;
        }

        if(isEngineAn == true)

        //*             Aktuelle DrehZahl       *//
        Rpm = Mathf.Abs(kmh / maxDrehmoment * Mathf.Abs(Time.deltaTime * Input.GetAxis("Beschleunigung")) * 100000000) + 9000 - ShiftRpm1 - ShiftRpm2 - ShiftRpm3 - ShiftRpm4 - ShiftRpm5 - ShiftRpm6;

        //*         Turbo Funktion      *//
        if (Mod0 == true)
        {
            //Aufladung
            if (Rpm >= 9100)
            {
                LadeDruck += 0.0056F;
            }

            //Standgas
            if (Rpm == 9000)
            {
                LadeDruck = 0.5f;
            }

            //max LadeDruck
            if (LadeDruck >= 1.8)
            {
                LadeDruck = 1.8f;
            }

            //Spielt den Blow Off Sound
            if (Rpm >= 32000 && gear == 2 || Rpm >= 48000 && gear == 3 || Rpm >= 64000 && gear == 4 || Rpm >= 75000 && gear == 5 || Rpm >= 79000 && gear == 6)
            {
                LadeDruck = -0.5f;
                //Sound muss definiert werden ;)
            }
        }

        //*         ODO Meter           *//
        if (kmh > 10)
        {
            Km += Vector3.Distance(transform.position, lastPosition) / 1000;
            lastPosition = transform.position;
        }
    }

    public void VisualizeWheel(NewCar wheelPair)
    {
        Quaternion rot;
        Vector3 pos;
        wheelPair.LinkesRad.GetWorldPose(out pos, out rot);
        wheelPair.LinkesRadMesh.transform.position = pos;
        wheelPair.LinkesRadMesh.transform.rotation = rot;
        wheelPair.RechtesRad.GetWorldPose(out pos, out rot);
        wheelPair.RechtesRadMesh.transform.position = pos;
        wheelPair.RechtesRadMesh.transform.rotation = rot;
    }

    void SaveCarToSaveFile()
    {
        SaveCarData.MaxTank = maxTankInhalt;
        SaveCarData.CurrTank = TankInhalt;
        SaveCarData.Drehmoment = maxDrehmoment;
        SaveCarData.Mod0 = Mod0;
        SaveCarData.Mod1 = Mod1;
        SaveCarData.Mod2 = Mod2;
        SaveCarData.Mod3 = Mod3;
        SaveCarData.Mod4 = Mod4;
        SaveCarData.Mod5 = Mod5;
        SaveCarData.Mod6 = Mod6;
        SaveCarData.X = vehicle.position.x;
        SaveCarData.Y = vehicle.position.y;
        SaveCarData.Z = vehicle.position.z;
        SaveCarData.KmSave = Km;
        SaveCarData.ID = vehicle.GetInstanceID();
        SaveCarData.CODE = this.GetHashCode();
        string jsonData = JsonUtility.ToJson(SaveCarData, true);
        File.WriteAllText(Application.persistentDataPath + "/" + VehicleName + ".zip", jsonData);
    }

    private float X;
    private float Y;
    private float Z;

    void LastOrt()
    {
        vehicle.transform.position = new Vector3(X, Y, Z);
    }

    void LoadSettings()
    {
        SaveCarData = JsonUtility.FromJson<CarData>(File.ReadAllText(Application.persistentDataPath + "/" + VehicleName + ".zip"));
        maxTankInhalt = SaveCarData.MaxTank;
        TankInhalt = SaveCarData.CurrTank;
        maxDrehmoment = SaveCarData.Drehmoment;
        Mod0 = SaveCarData.Mod0;
        Mod1 = SaveCarData.Mod1;
        Mod2 = SaveCarData.Mod2;
        Mod3 = SaveCarData.Mod3;
        Mod4 = SaveCarData.Mod4;
        Mod5 = SaveCarData.Mod5;
        SaveCarData.Mod6 = Mod6;
        X = SaveCarData.X;
        Y = SaveCarData.Y;
        Z = SaveCarData.Z;
        Km = SaveCarData.KmSave;
    }

    void CheckCar()
    {
        if (File.Exists(Application.persistentDataPath +  "/" + VehicleName + ".zip") == true)
        {
            LoadSettings();
        }
        else
        {
            SaveCarToSaveFile();
        }
    }

    void CreateTuning()
    {
        //* Turbo Upgrade *//
        if (Mod0 == true)
        {

        }

        //* Chip Tuning Upgrade *//
        if (Mod1 == true)
        {
            maxDrehmoment = maxDrehmoment + 150;
            MaxKmh = MaxKmh + 10;
        }

        //* Nockenwelle Upgrade *//
        if (Mod2 == true)
        {
            maxDrehmoment = maxDrehmoment + 250;
        }

        //* Weber Upgrade *//
        if (Mod3 == true)
        {
            maxDrehmoment = maxDrehmoment + 200;
            MaxKmh = MaxKmh + 25;
        }

        //* Bremsen Upgrade *//
        if (Mod4 == true)
        {
            bremsKraft = bremsKraft + 250;
        }

        //* Kolben Upgrade *//
        if (Mod5 == true)
        {
            maxDrehmoment = maxDrehmoment + 20;
        }

        //* Tank Upgrade *//
        if (Mod6 == true)
        {
            maxTankInhalt = maxTankInhalt + 20;
        }
    }

    void OnGUI()
    {
        GUI.TextField(new Rect(10, 0, 600, 20), "Drehmoment " + maxDrehmoment.ToString() + " Aktuell: " + Rpm + " Aktueller Gang: " + gear);
        GUI.TextField(new Rect(10, 20, 600, 20), "Max Bremskraft " + bremsKraft.ToString());
        GUI.TextField(new Rect(10, 40, 600, 20), "Max Km/h " + MaxKmh.ToString() + " Aktuell: " + kmh);
        GUI.TextField(new Rect(10, 60, 600, 20), "Tuning " + " Mod0: " + Mod0 + " Mod1: " + Mod1 + " Mod2: " + Mod2 + " Mod3: " + Mod3 + " Mod4: " + Mod4 + " Mod5: " + Mod5 + " Mod6: " + Mod6);
        GUI.TextField(new Rect(10, 80, 600, 20), "Aktuelle Pos " +" X= "+ vehicle.position.x +" Y= "+ vehicle.position.y +" Z= "+ vehicle.position.z);
        GUI.TextField(new Rect(10, 100, 600, 20), "Tank " + Mathf.Round(TankInhalt) + "/" + maxTankInhalt + "L " +" Aktueller Verbrauch: " + Mathf.RoundToInt(Verbrauch * 10000) + " L");
        GUI.TextField(new Rect(10, 120, 600, 20), "Turbo " + LadeDruck + " bar");
    }


    float ShiftRpm1;
    float ShiftRpm2;
    float ShiftRpm3;
    float ShiftRpm4;
    float ShiftRpm5;
    float ShiftRpm6;
}

[System.Serializable]
public class NewCar : System.Object
{
    [Tooltip("Linker WheelColider")]
    public WheelCollider LinkesRad;
    [Tooltip("Linkes WheelMesch")]
    public GameObject LinkesRadMesh;
    [Tooltip("Rechter WheelColider")]
    public WheelCollider RechtesRad;
    [Tooltip("Rechtes WheelMesch")]
    public GameObject RechtesRadMesh;

    [Tooltip("Achse hat Bremse")]
    public bool Bremse;
    [Tooltip("Brems Wirkung der Achse")]
    public float BremsWirkung;
    [Tooltip("Achse hat Handbremse")]
    public bool HandBremse;
    [Tooltip("Antriebs Achse")]
    public bool Antriebsachse;
    [Tooltip("Lenk Achse")]
    public bool LenkAchse;
    [Tooltip("Invantriertes Lenken")]
    public bool reverseTurn;
}

und hier das File zum Speichern der Vehicle daten:

/*
 _  __          _ _  _____        __ _   
| |/ /         (_|_)/ ____|      / _| |  
| ' /_   ___  ___ _| (___   ___ | |_| |_ 
|  <| | | \ \/ / | |\___ \ / _ \|  _| __|
| . \ |_| |>  <| | |____) | (_) | | | |_ 
|_|\_\__,_/_/\_\_|_|_____/ \___/|_|  \__|
		  ©2017 by Kuxii
*/
public class CarData
{

    //Vehicle Settings
    public int Vorbesitzer;
    public float MaxTank;
    public float CurrTank;
    public float Drehmoment;
    public float PS;
    public float Verbrauch;
    public float KmSave;
    public float BenutzeZeit;
    public bool Mod0;
    public bool Mod1;
    public bool Mod2;
    public bool Mod3;
    public bool Mod4;
    public bool Mod5;
    public bool Mod6;
    public float X;
    public float Y;
    public float Z;
    public float AX;
    public float AY;
    public float AZ;
    public float CarWert;
    public int ID;
    public int CODE;
    public string SName;

}

und zu guter Letzt ein Bildchen xD :

Screenshot_2.thumb.png.f4873b8e0b9266437ed5e67e08985cc2.png

Der Code könnte an paar Ecken noch einen Feinschliff gebrauchen aber Funktioniert auch so gut, bis auf dem Rückwertsgang,... Hoffe doch kann damit paar leute Glücklich machen :D

So Gute Nacht erst mal :P

Link zu diesem Kommentar
Auf anderen Seiten teilen

  • 2 weeks later...

Join the conversation

You can post now and register later. If you have an account, sign in now to post with your account.

Gast
Auf dieses Thema antworten...

×   Du hast formatierten Text eingefügt.   Formatierung jetzt entfernen

  Only 75 emoji are allowed.

×   Dein Link wurde automatisch eingebettet.   Einbetten rückgängig machen und als Link darstellen

×   Dein vorheriger Inhalt wurde wiederhergestellt.   Clear editor

×   You cannot paste images directly. Upload or insert images from URL.

Lädt...
×
×
  • Neu erstellen...