Jump to content
Unity Insider Forum

devandart

Members
  • Content Count

    401
  • Joined

  • Last visited

  • Days Won

    16

Everything posted by devandart

  1. Moin, es ist einfacher, den Code der ganzen MonoBehaviour zu posten, damit man ein Bild vom Code bekommt. Aber was Du möchtest, sollte eigentlich so ähnlich lösbar sein: //über der klasse einbinden, damit man IEnumerator nutzen kann using System.Collections; //... private WaitForSeconds waitForSeconds = new WaitForSeconds(1f); void Start() { //irgendwo musst du die Coroutine starten StartCoroutine(Test()); } IEnumerator Test() { yield return waitForSeconds; //IEnumerator erwartet einen Rückgabetypen, dieser wartet eine Sekunde //dein text = neuer text } //...
  2. devandart

    Moin

    ich auch. Und... herzlich willkommen!
  3. Müsste sowas nicht funktionieren? private void ActivateScene(string sceneName, bool activate) { var scene = UnityEngine.SceneManagement.SceneManager.GetSceneByName(sceneName); foreach(var go in scene.GetRootGameObjects()) { go.SetActive(activate); } }
  4. Ist die Dokumentation auch öffentlich zugänglich, so dass man sich erstmal einen Überblick verschaffen kann?
  5. Achso das kann sein, wir arbeiten noch mit der 5.6 Joa, würde ich auch so schreiben. Am performantesten ist es nicht, aber am einfachsten, wenn man keine Ahnung von Modeln usw. hat.
  6. Entweder das, was @malzbie schreibt, oder ein Decal Asset benutzen (eine andere Textur, also die Schrift, auf das Auto "legen"), oder mit Unity UI ein 3D Canvas basteln und auf das Auto packen oder das gleiche mit TextMeshPro (freies Asset aus dem Store). Ob das performancetechnisch sinnvoll ist, kommt drauf an.
  7. Mal eine andere Frage... Möchtest Du einmal auf den Button tippen und dann läuft der Spieler permanent? Oder nur während Du den Button "hältst" laufen? Um auf die Methode von einer anderen Komponente zugreifen zu können, musst Du diese auch öffentlich zugänglich machen. Das machst Du z.B. mit dem "public" modifier. Dann müsstest Du im PlayerControl folgendes ändern //original void MovementManagement(float horizontal, float vertical, bool running, bool sprinting) //geändert public void MovementManagement(float horizontal, float vertical, bool running, bool sprinting) Zudem ist es eine ganz schlechte Idee, mit GameObject.Find() zu arbeiten. Stelle in der Running Komponente lieber ein Feld bereit, in welches Du dann im Inspector die PlayerControl Komponente zuweisen kannst. public class Running : MonoBehaviour { public PlayerControl playerControl; //dieses Feld siehst Du im Inspector, dort die PlayerControl Komponente reinziehen! public void ButtonToClick(int clickToButton) { Debug.Log("Test Press Button"); if(playerControl) { playerControl.MovementManagement(Hinput, Vinput, run, sprint); } } }
  8. Statt offensichtlich boolschen Werten für den Schwierigkeitsgrad würde ich eine Enumeration nutzen, damit Du immer nur einen Zustand haben kannst. //Beispiel public enum GameDifficulty { Easy = 0, Medium = 1, Hard = 2 } //... in deiner Komponente public GameDifficulty difficulty = GameDifficulty.Easy; Um die lifetime diesem anzupassen, könntest Du z.B. ein Dictionary nutzen. //in deiner Komponente da oben private Dictionary<GameDifficulty, float> lifetimeDictionary = new Dictionary<GameDifficulty, float>(); void Start() { lifetimeDictionary.Add(GameDifficulty.Easy, 0.1f); lifetimeDictionary.Add(GameDifficulty.Medium, 0.5f); lifetimeDictionary.Add(GameDifficulty.Hard, 1f); } void Update() { //da wo du deine lifetime nutzt... lifetime = lifetimeDictionary[difficulty]; //das ist die difficulty aus dem oberen Pseudocode } Nun kannst Du die "difficulty" ändern und es wird im Update immer die im Dictionary festgelegte lifetime genutzt.
  9. Eventuell musst du den Text noch zum Typen int parsen, damit Du es mit ammo addieren kannst. if(int.TryParse(nameField.text, out M1)) //versuchen, den Input-Text zu Integer zu parsen und in M1 zwischenspeichern { Global.ammo += M1; //usw... }
  10. Um das Problem zu identifizieren, wäre das "Bewegungs"-Skript interessant, welches Du benutzt. Sonst kann Dir wohl kaum einer helfen.
  11. Moin, Du suchst die Buttons, wenn Du ToggleButtons() aufrufst. Das Problem hierbei ist, dass Unity keine GameObjects in der Scene findet, die inaktiv sind. Die einfachste und sauberste Lösung ohne zu viel zu ändern wäre die folgende Änderung, einmal beim Start die Buttons zu finden und dann nur noch das Array zu nutzen. using System.Collections; using System.Collections.Generic; using UnityEngine; public class PanelToggle : MonoBehaviour { private bool buttonStatus = true; // Mit wahr initialisieren private GameObject[] buttonArray; void Start() { //Buttons beim Start einmal suchen und im Array cachen. buttonArray = GameObject.FindGameObjectsWithTag("Button"); // Array aus allen GameObjects generieren, die Buttons sind } public void ToggleButtons() // Alle Buttons ein- bzw. ausblenden { buttonStatus = !buttonStatus; // buttonStatus togglen foreach (GameObject button in buttonArray) // Für alle Buttons: { button.SetActive(buttonStatus); // Aktuellen Button ein- bzw. ausblenden Debug.Log("Buttons sind: " + buttonStatus); // OK } } } Grundsätzlich würde ich aber von "FindGameObjectsWithTag" und anderen Suchfunktionen mit String-Namen abraten, weil das sehr fehleranfällig ist. Entweder direkt nach Components suchen, oder ein im Inspector zugängliches Feld machen, wo Du die Buttons einfach im Editor reinziehst. //Hierfür müsste die Komponente auf dem Panel liegen und dann alle Unterelemente durchsuchen GetComponentsInChildren<Button>() //oder so, mit dem SerializeField Attribut erlaubst Du Unity, ein privates Feld im Inspector sichtbar zu machen [SerializeField] private Button[] buttonArray;
  12. Hast Du ein Beispielbild, wie das Ergebnis aussehen soll?
  13. Wenn ich das richtig sehe, könnte das beim ersten Mal funktioniert haben. Aber setzt Du die PlayerPref Variable "w3sFS" irgendwo wieder auf 0? Weil sonst ist sie bei jedem Start bereits auf 3, was dazu führt, dass Du immer in die letzte Bedingung springst (PlayerPrefs sind sessionübergreifende Speicherzustände).
  14. Hi, das geht mit StreamingAssets. Wie Du diese einrichtest, kannst Du hier nachlesen https://docs.unity3d.com/Manual/StreamingAssets.html
  15. Ist jetzt nicht nötig, aber vielleicht trotzdem interessant. Das kannst Du auch (gut leserlich) kürzen: bool direction = true; if (Input.GetKeyDown(KeyCode.Space)) { direction = !direction; //direction wird einfach negiert }
  16. Ohje, wer lesen kann ist klar im Vorteil. Sorry. Das habe ich in der Tat überlesen, dass Du das schon versucht hattest. Dass Cloth nur Sphere oder Capsule Collider unterstützt hat bestimmt gute Gründe. Vielleicht auch solche, dass eckige Collider Vertices festhalten bzw. feststecken bleiben und es somit zu komischen Verhalten kommt. Aber keine Ahnung... Wie schaut es mit IK (Inverse Kinematics) aus? Damit sollte man sowas auch hinbekommen.
  17. Ich weiß nicht, ob @Sascha bei dieser Lösung an eine der "bescheuerten" denkt. Aber Du kannst sowas auch relativ schnell und einfach mit der Cloth Komponente lösen. Einfach das Plane Mesh in mehrere ("genug") Segmente unterteilen und dann die Cloth Komponente zuweisen. Anschließend im Editor oben die Fixpunkte "reinmalen", damit das Teil nicht runterfällt. Als Collider musst Du dann am einfachsten eine Capsule zuweisen, auf die die Lamellen reagieren und diese musst Du einfach mit der aktuellen Kiste durch das "Tor" schieben. https://docs.unity3d.com/Manual/class-Cloth.html
  18. Kleiner Hinweis: man kann Meshes in Blender auch zusammenführen. Z.B. kannst Du alle Objekte in der Blender Szene markieren und dann mit STRG-J alle zu einem Objekt machen.
  19. Die Betonung lag auf dem Virtual Ich möchte meinen, dass es Visual heißen soll. Aber wir wollen mal nicht kleinkariert sein.
  20. Moin, das ist ein relativ komplexes Thema, welches man auf 1001 Arten lösen kann. Aber anfangen zu suchen könntest Du mit den Stichworten "Streaming", "World Streaming", "Object Culling" und vielleicht (bei vielen gleichen Objekten) "Hardware instancing". Wenn sich Objekte bereits inaktiv in der Welt befinden, sprich diese schon instanziert wurden, wird mindestens der Arbeitsspeicher belastet. Weil irgendwo müssen die Objekte ja schon existieren.
  21. Coole Idee und der Artikel über component based design gefällt mir.
  22. Moin und willkommen hier! Solange Du unter den besagten 100.000$ liegst und Dein Kunde Dir das Spiel im Sinne eines fertigen Produktes abkauft, wird Unity von niemandem irgendwas verlangen. Auch wenn Du wem Deinen Code verkaufst nicht. Einzig, wenn Du mit wem anders kooperierst und im Team am Code arbeitest, müssen alle Entwickler die gleiche Lizenz nutzen, soweit ich weiß.
  23. Und auf die Frage, wie Du das Problem bzw. dessen Lösung umsetzen kannst, gibt es viele Möglichkeiten. Eine einfache wäre, das Objekt zu markieren, dass dieses bei einem Szenenwechsel nicht gelöscht wird. Ein Beispiel für "DontDestroyOnLoad" findet sich hier unten auf der Seite https://docs.unity3d.com/ScriptReference/Object.DontDestroyOnLoad.html Damit bleibt das Objekt auch bei Szenenwechsel erhalten und wenn irgendwo ein weiteres vorkommt, löscht sich dieses selbst um Duplikate zu vermeiden.
  24. Wenn Du in einer erbenden Klasse Parameter im Konstruktor übergibst, musst Du diese an die Basisklasse weiterreichen. public class Mensch { protected readonly int alter; public Mensch(int alter) { this.alter = alter; } } public class SuperMensch : Mensch { public SuperMensch(int alter) : base(alter) { } } Statt im Konstruktor kannst Du auch Eigenschaften beim Erzeugen vom Objekt setzen. Dies hat Vor- und Nachteile. public class Mensch { private int alter; private string name; public int Alter { get { return alter; } set { alter = value; } } public int Name { get { return name; } set { name = value; } } } public class SuperMensch : Mensch { } //... irgendwo var superMensch = new SuperMensch() { Alter = 10, Name = "Hans Wurst" };
  25. Moin aus ebenfalls Hamburg und herzlich willkommen hier! Viel Spaß! War "Virtual Basic" Autokorrektur?
×
×
  • Create New...