Jump to content
Unity Insider Forum
Sir_Mathew

Globale Variablen

Recommended Posts

Hallo,

bin neu in Unity und probiere noch rum.

Aus 3D Gamestudio kenne ich, das man Scripte in anderen Scripten einbinden kann und man somit ganz leicht Variablen von überall zugreifen kann.

Versuche das gerade in Unity, aber denke das es so wie ich es denke, garnicht geht. Hoffe da auf eine kleine Hilfe

Script 1:

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

public class Main : MonoBehaviour
{
    void Update()
    {
        int i_global_walk = i_global_walk+34;

        Debug.Log(i_global_walk);
    }
}

Script 2:

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

public class Globale_Variablen : MonoBehaviour
{
    int i_global_walk = 0;
}

---------------------

Also ich dachte mit using Script hab ich die möglichkeit auf eine Variable aus dem zweiten Script zuzugreifen.

Oder Globale_Variablen.i_global_walk  wäre auch was feines.

vieleicht habt ihr Lösungen dafür?

1 Script was für alle Variablen, Strings etc. ist doch das beste, alles zentral ebend.

 

 

Share this post


Link to post
Share on other sites

Hallo!

vor 28 Minuten schrieb Sir_Mathew:

1 Script was für alle Variablen, Strings etc. ist doch das beste, alles zentral ebend.

Ne... das ist das schlimmste! :) (Also.. ehrlich jetzt)

Ganz allgemein gilt beim Programmieren: Dinge sollten so wenig wie möglich von allen anderen Dingen wissen. Stell dir vor, du hast eine Tür, die nicht im richtigen Moment aufgeht. Wäre es dann nicht besser, wenn du nur die Tür nach dem Fehler durchsuchen müsstest, als dass potentiell der gesamte Rest der Codebase noch verantwortlich sein kann?

"So wenig wie möglich" heißt aber nicht "gar nichts" - Manche Dinge müssen voneinander wissen. Ein Knopf muss wissen, welche Tür er öffnet. Aber wenn man eine Beziehung zwischen zwei Klassen vermeiden kann, dann sollte man das auch tun.

Was also hast du genau vor? Auf die Frage "wie weiß das eine Ding die richtige Sache von dem anderen Ding" gibt es nämlich gleich mehrere Antworten, die alle von Fall zu Fall die beste sein können.

Der Vollständigkeit halber aber in aller Kürze: In C# gibt es das Keyword "static". Damit hebst du die Bindung eines Feldes an Instanzen auf, und es gibt das Feld nur noch einmalig im Programm, an die Klasse selbst gebunden. Wenn du dein i_global_walk also statisch machst, kann jeder andere Teil des Programms über Globale_Variablen.i_global_walk darauf zugreifen.

Share this post


Link to post
Share on other sites

Alles sehr interessant.

Hab noch schnell in einen kindle-buch gewälzt und die beispiele waren etwas verwirrend aber mit

public static int i_global_walk = 0;

hat es dann funktioniert,danke.

Muss wohl nochmal genauer lesen was static und public genau macht. Will das natürlich auch verstehen was da passiert.😄

Das mit walk war ja nur ein Beispiel. Aber ich möchte dennoch alle Variablen, Strings etc. zentral haben und das hat dann nix mit Fehlersuche zu tun.

Ich meine nach deinen Beispiel, muss der Knopf ja schließlich eine Variable z.b. auf true Schalten um die Tür zu öffnen. Und diese Variable kann doch in Globale_Variable 

gespeichert werden.

Die Fehlersuche bleibt auch dann eigentlich nur im Tür/Knopf Script.

Und in diesen Script kommen dann auch alle Resourcen Quellen wie Stings z.b.

STRING* str_gl_taschenlampe="objekt_/lampen_/taschenlampe_1.mdl"; // aus lite-C

so lassen sich sehr einfach Modelle Pfade oder Texturen anpassen usw.

Naja wie gesagt, Unity ist Neuland für mich und vielleicht merk ich den ein oder anderen Fehler noch, kann hier aber nur Positives sehen für die Handhabung dieser Art.

Share this post


Link to post
Share on other sites
vor 8 Stunden schrieb Sir_Mathew:

Aber ich möchte dennoch alle Variablen, Strings etc. zentral haben und das hat dann nix mit Fehlersuche zu tun.

Oh doch, das hat es :)

Aber ich habe inzwischen die Erfahrung gemacht, dass Leute meistens selber in den Abgrund schauen müssen, um solche Sachen einzusehen. Ich nehm's dir also nicht übel, wenn du mir das jetzt nicht glaubst :D

vor 8 Stunden schrieb Sir_Mathew:

Und diese Variable kann doch in Globale_Variable 

gespeichert werden.

Geht schon, aber muss halt nicht. Findest du es nicht auch immerhin eleganter (unabhängig von den Spätfolgen), wenn der Knopf zur Tür geht und sie öffnet anstatt dass er zu einem abstrakten Konstrukt läuft, dort irgendetwas ändert das erstmal strukturell nix mit Türen zu tun hat, und die Tür sich das da abholt?

vor 8 Stunden schrieb Sir_Mathew:

so lassen sich sehr einfach Modelle Pfade oder Texturen anpassen usw.

Jo, das geht mit Unity auch - Resources.Load. Benutze ich exakt niemals in meinen Projekten, und das hat auch seine Gründe :)

Aber wie gesagt... bist nicht der erste der da skeptisch ist und erstmal selber ein paar mal auf die Nase fallen muss.

vor 8 Stunden schrieb Sir_Mathew:

Muss wohl nochmal genauer lesen was static und public genau macht. Will das natürlich auch verstehen was da passiert.😄

Im Zweifelsfall immer gerne fragen ;)

Share this post


Link to post
Share on other sites
Am 21.12.2020 um 21:45 schrieb Sascha:

Ganz allgemein gilt beim Programmieren: Dinge sollten so wenig wie möglich von allen anderen Dingen wissen. Stell dir vor, du hast eine Tür, die nicht im richtigen Moment aufgeht. Wäre es dann nicht besser, wenn du nur die Tür nach dem Fehler durchsuchen müsstest, als dass potentiell der gesamte Rest der Codebase noch verantwortlich sein kann?

Geniales Beispiel 😆😆 mir fällt es immer sehr schwer mich daran zu halten. Natürlich achte ich sehr darauf immer alles private zu machen was auch private sein sollte. aber solche Referenzen auf andere Objekte benutze ich leider viel zu oft. in meinem aktuellen Projekt (2d Platformer) habe ich z.b. einen Spieler dessen leben (int health) static und public ist damit auch bloß jeder darauf zugreifen kann. zufrieden bin ich damit absolut nicht. Leider weiß ich nie so recht wie ich sowas anstellen soll. oder wie man es allgemein machen sollte. 

Share this post


Link to post
Share on other sites
vor 2 Stunden schrieb Brighthell96:

Leider weiß ich nie so recht wie ich sowas anstellen soll. oder wie man es allgemein machen sollte. 

Wie @SkipToPlay sagt :)

Falls du das, was im Artikel beschrieben ist, nicht selbst implementieren willst... hier ist meins :)

Share this post


Link to post
Share on other sites

Join the conversation

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

Guest
Reply to this topic...

×   Pasted as rich text.   Paste as plain text instead

  Only 75 emoji are allowed.

×   Your link has been automatically embedded.   Display as a link instead

×   Your previous content has been restored.   Clear editor

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

Loading...

×
×
  • Create New...