Jump to content
Unity Insider Forum
  • Announcements

    • Lars

      Allgemeine Forenregeln   03/13/2017

      Forenregeln Nimm dir bitte einen Moment um die nachfolgenden Regeln durchzulesen. Wenn du diese Regeln akzeptierst und die Registration fortsetzen willst, klick einfach auf den "Mit der Registrierung fortfahren"-Button. Um diese Registration abzubrechen, klick bitte einfach auf den "Zurück" Button deines Browsers. Wir garantieren nicht für die Richtigkeit, Vollständigkeit und Brauchbarkeit der Nachrichten und sind auch nicht dafür verantwortlich. Die Beiträge drücken die Meinung des Autors des Beitrags aus, nicht zwangsläufig das, wofür die Forensoftware steht. Jeder Nutzer, der denkt, dass ein veröffentlichter Beitrag unzulässig bzw. störend ist, ist aufgefordert uns unverzüglich per E-Mail zu kontaktieren. Wir haben das Recht störende Beiträge zu löschen und bemühen uns, das in einem realistischem Zeitraum zu erledigen (sofern wir beschlossen haben, dass die Löschung notwendig ist). Du akzeptierst, durchgehend während der Nutzung dieses Services, dass du dieses Forum nicht dazu missbrauchen wirst, Inhalte zu veröffentlichen, welche bewusst falsch und/oder verleumderisch, ungenau, beleidigend, vulgär, hasserfüllt, belästigend, obszön, sexuell belästigend, bedrohlich, die Privatsphäre einer Person verletzend oder in irgend einer Art und Weise das Gesetz verletzen. Des Weiteren akzeptierst du, dass du keine urheberrechtlich geschützte Inhalte ohne Erlaubnis des Besitzers in diesem Forum veröffentlichst. Mit dem Klick auf den "Mit der Registrierung fortfahren"-Button, akzeptierst du zudem unsere Datenschutzerklärung und stimmst der Speicherung deiner IP-Adresse und personenbezogenen Daten zu, die dafür benötigt werden, um dich im Falle einer rechtswidrigen Tat zurückverfolgen zu können bzw. permanent oder temporär aus dem Forum ausschließen zu können. Es besteht keine Pflicht zur Abgabe der Einwilligung, dies erfolgt alles auf freiwilliger Basis.   Zusatzinformationen Der Forenbetreiber hat das Recht, Nutzer ohne Angabe von Gründen permanent aus dem Forum auszuschließen. Des Weiteren hat er das Recht, Beiträge, Dateianhänge, Umfrage, Blogeinträge, Galleriebilder oder Signaturen ohne Angabe von Gründen zu entfernen. Mit der Registrierung verzichtest du auf alle Rechte an den von dir erstellten Inhalten, bzw. treten diese an das Unity-Insider.de und Unity-Community.de ab. Dies bedeutet im Klartext, dass das Unity-Insider.de und Unity-Community.de frei über deine Texte verfügen kann, sofern diese nicht wiederum die Rechte anderer verletzen. Es besteht weiterhin kein Anspruch von registrierten Nutzern bzw. ehemaligen registrierten Nutzern darauf, dass erstellte Inhalte und/oder die Mitgliedschaft (User) wieder gelöscht werden (Erhaltung der Konsistenz dieses Forums).   Einwilligungserklärung Wenn du mit der Speicherung deiner personenbezogenen Daten sowie den vorstehenden Regeln und Bestimmungen einverstanden bist, kannst du mit einem Klick auf den Mit der Registrierung fortfahren-Button unten fortfahren. Ansonsten drücke bitte Zurück. Stand: 07.03.2011
Kuxii

Simple Car Controller mit Save/Load und Tuning Funktion

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

Share this post


Link to post
Share on other sites

Create an account or sign in to comment

You need to be a member in order to leave a comment

Create an account

Sign up for a new account in our community. It's easy!

Register a new account

Sign in

Already have an account? Sign in here.

Sign In Now


×