Jump to content
Unity Insider Forum

Visual Studio C# 7 ändern


Jomnitech

Recommended Posts

Hi

Habe eine Frage bei der ich auch nach längerem googeln auf keine Lösung gekommen bin. Und zwar geht es darum das ich gerade ein Tutorial anschaue und beim Scripten bei mir die Fehlermeldung kommt das der Befehl in C#4 nicht ausgeführt werden kann und das ich C# 7 oder höher benötige. Nun komme ich einfach nicht drauf wie ich Visual Studio auf C#7 ändere. Benutze derzeit Unity 5.6 und Visual Studio 2017 4.6 .

Bin derzeit etwas ratlos und bin um jede Hilfe froh.

 

fehlerVoidOnTriggerEnter.png

Link zu diesem Kommentar
Auf anderen Seiten teilen

Es scheint, als hättest du OnTriggerEnter innerhalb einer anderen Methode deklariert. Das geht halt erst ab C# 7, ist aber überhaupt nicht wichtig, um für Unity zu programmieren. Packe die Funktion einfach direkt in eine Klasse.

Also statt

class Foo : MonoBehaviour
{
  void Bar()
  {
    void OnTriggerEnter()
    {
      
    }
  }
}

einfach

class Foo : MonoBehaviour
{
  void OnTriggerEnter()
  {
    
  }
}

 

Link zu diesem Kommentar
Auf anderen Seiten teilen

Danke für deine Antwort. Aber was meinst du mit "das geht halt erst ab C#7" ? . Was hindert mich daran C#7 zu verwenden (Abgesehen davon das ich nicht weiss wie ich es installiert bekomme)?

Ich habe dein Code mal angewendet und der erste Fehler ist zwar weg, aber ich erhalte weitere Fehler.

fehler2.png.a58d35b2ef7409236766590c0b22ab72.png

Link zu diesem Kommentar
Auf anderen Seiten teilen

grounded habe ich doch weiter oben definiert.

sieht momentan so aus:

using System.Collections;
using System.Collections.Generic;
using UnityEngine;

public class PlayerController : MonoBehaviour {

    public float speed = 7;
    public float jump = 20;
    bool grounded = true;


	// Use this for initialization
	void Start () {
		
	}
	
	// Update is called once per frame
	void Update () {

      

        //===========================
        // Jump Start
        //===========================
        if (Input.GetButtonDown("Jump"))

        {
            if (grounded)
            {
                GetComponent<Rigidbody>().velocity = new Vector3(GetComponent<Rigidbody>().velocity.x, jump, (GetComponent<Rigidbody>().velocity.z));
            }
        }
        //===========================
        // Jump End
        //===========================

        //===========================
        //  Move Start
        //===========================
        GetComponent<Rigidbody>().velocity = new Vector3(Input.GetAxis("Horizontal")*speed, GetComponent<Rigidbody>().velocity.y,(Input.GetAxis("Vertical")*speed));
        //===========================
        //  Move End
        //===========================

        //===========================
        //  Check for Grounded Start
        //===========================
        class Foo : MonoBehaviour
    {
       
        void OnTriggerEnter()
        {
            bool grounded = true;
        }

         void OnTriggerExit()
        {
            bool grounded = false;
        }
    }

    




}
}

 

Link zu diesem Kommentar
Auf anderen Seiten teilen

Mit "bool grounded" definierst du eine Variable. Du willst ja aber die benutzen, die du schon hast. Ich würde ehrlich gesagt ein Paar Grundlagentutorials empfehlen, weil in Sachen Sprache noch einiges fehlt.

vor 34 Minuten schrieb Jomnitech:

Was hindert mich daran C#7 zu verwenden?

Unity unterstützt es nicht. Aber mal ganz davon abgesehen, weißt du nicht einmal, was du da geschrieben hast. Die Tatsache, dass C# 7 das unterstützt, was du da schreibst, heißt nicht, dass es das ist, was du schreiben solltest.

Link zu diesem Kommentar
Auf anderen Seiten teilen

Danke für deine ehrliche Antwort.

Natürlich weiss ich nicht genau was ich da schreibe, bin ja auch ein totaler Anfänger. Es ist mir nur nicht klar warum ich die Fehlermeldung habe das ich C#7 benötige, wenn es doch im Tutorial keine Probleme gibt(ich habe auch bei den entsprechendem Video angefragt, aber erhalte keine Antwort).

Ich kann verstehen das es einem als Coder durch Mark und Bein geht aber für mich lerne ich so am besten was ich haben möchte. Ich schreibe mir eine Vorlage ab und fange an zu verstehen was ich ändern muss das es so funktionert wie ich möchte, auch wenn ich den ganze Code nicht verstehe.

Trotzdem wenn du schreibst das es Unity nicht unterstützt und es im Tut so angewand wird und bei mir die Fehlermeldung kommt, bin ich doch etwas verwirrt.

Link zu diesem Kommentar
Auf anderen Seiten teilen

Wo bekommst du denn die Meldung, dass du angeblich c#7 benötigst? In Visual Studio! Und das kennt von sich aus ersteinmal keine Befehle, Funktionen und Besonderheiten von Unity. Selbst c#7 wird diese Besonderheiten nicht kennen. Um überhaupt mit Unity zu agieren musst du div. Using Befehle nutzen (Die üblichen kommen übrigens automatisch beim erstellen eines Scripts, wenn man das mit Unity macht). Außerdem ist es so, wie Sascha gleich im 2ten Post geschrieben hat. Die Klasse muss außerdem vom Typ MonoBehaviour sein.

Egal.

Wenn du in der Klasse die Variable grounded schon deklariert hast. Kannst du nicht nochmal die gleiche Variable in einer Funktion oder Methode der selben Klasse deklarieren.
Das machst du aber in deinem Code, weil du in den OnTrigger Funktionen das bool vor grounded setzt. Du kannst die Variable natürlich in dieser Funktion nutzen aber darfst sie eben nicht nochmal deklarieren.
Hättest du oben in deiner Klasse die Variable nicht deklariert, hättest du die ohne Weiteres in den Funktionen deklarieren können. Das hätte dir in deinem Code aber nichts gebracht, denn diese Variable wäre nur in dieser Funktion gültig und nicht in der gesamten Klasse und somit könntest du die Variable auch nirgendwo anders abfragen.

-Direkt in der Klasse deklariert = überall in der Klasse gütlig. Auch in Funktionen und Methoden dieser Klasse

-Nur in in einer Funktion/Methode deklariert = nur in dieser Funktion/Methode gültig, die Klasse (also der Chef in dem diese Funktion ja steckt) kennt sie nicht. 

Es geht also nur vom Großen ins Kleine, nie umgekehrt und auch nie von einem Kleinen zum anderen Kleinen.^^

Das ist das Problem, wenn mit Spielerstellungstutorials versucht coden zu lernen. Elementar wichtige Dinge werde da in der Regel nicht erklärt! Und wenn man die Strukturen der Programmiersprachen nicht kennt, kommt man schnell an Grenzen.
Ich kann mir übrigens nicht vorstellen, dass der Tutorialersteller die Variablen in den Funktionen neu deklariert hat, da es ja, wie eben erklärt, nicht geht.

Link zu diesem Kommentar
Auf anderen Seiten teilen

Das Codebeispiel - was du da gepostet hast - sieht mir nach einem sehr schlechten Programmierstil aus. Ich würde mir da lieber ein anderes Tutorial suchen. Er verwendet eine innere Klasse namens "Foo" (was an sich nicht verwerflich ist, aber in deinem Codebeispiel sehe ich hierzu keinerlei Notwendigkeit) und diese Klasse bereitet dir aktuell auch die Probleme. Zudem werden im Code ständig unnötige GetComponent()-Aufrufe gemacht.

Ich kann mir allerdings auch vorstellen, das du einfach 2 Klassen zusammenkopiert hast, die du aus dem Tutorial übernommen hast, weil es macht überhaupt keinen Sinn eine innere Klasse zu definieren, die von Monobehavior erbt.

Ich vermute mal, so sollte es eigentlich aussehen. Die innere Klasse "Foo" ist damit entfernt (ich habe auch gleich mal die unnötigen GetComponent()-Aufrufe entfernt).
 

using System.Collections;
using System.Collections.Generic;
using UnityEngine;

public class PlayerController : MonoBehaviour
{

    public float speed = 7;
    public float jump = 20;
    private bool grounded = true;
    private Rigidbody m_Rigidbody;

    // Use this for initialization
    void Start()
    {
        m_Rigidbody = GetComponent<Rigidbody>();
    }

    // Update is called once per frame
    void Update()
    {
        //===========================
        // Jump Start
        //===========================
        if (Input.GetButtonDown("Jump"))

        {
            if (grounded)
            {
                m_Rigidbody.velocity = new Vector3(m_Rigidbody.velocity.x, jump, (m_Rigidbody.velocity.z));
            }
        }
        //===========================
        // Jump End
        //===========================

        //===========================
        //  Move Start
        //===========================
        m_Rigidbody.velocity = new Vector3(Input.GetAxis("Horizontal") * speed, m_Rigidbody.velocity.y, (Input.GetAxis("Vertical") * speed));
        //===========================
        //  Move End
        //===========================
    }

    //===========================
    //  Check for Grounded Start
    //===========================

    void OnTriggerEnter()
    {
        grounded = true;
    }

    void OnTriggerExit()
    {
        grounded = false;
    }
}

 

Link zu diesem Kommentar
Auf anderen Seiten teilen

Ertmals danke an alle für die vielen Antworten.

@Zer0Cool

Habe den Code wie von dir gepostet eingefügt. Der Fehler ist jetzt weg, danke hierfür. Ev. war es einfach an der falschen Position? Eigentlich sind es keine zwei Scripts, habe lediglich noch den Tipp von Sascha ausprobiert.

Der "Fehler" selbst wurde in Visual Studio angezeigt, siehe auch das Bild von meinem ersten Post. Dachte eben das ich C#7 benötige und bin da einfach nicht fündig geworden. Scheint ja aber nicht der Fall zu sein.

Ich werde mal dein Tipp beherzigen und mir andere Tuts suchen.

 

Vielen Dank an alle!

 

 

Link zu diesem Kommentar
Auf anderen Seiten teilen

Archiviert

Dieses Thema ist jetzt archiviert und für weitere Antworten gesperrt.

×
×
  • Neu erstellen...