Jump to content
Unity Insider Forum

DerStefan

Members
  • Posts

    31
  • Joined

  • Last visited

Recent Profile Visitors

The recent visitors block is disabled and is not being shown to other users.

DerStefan's Achievements

Advanced Member

Advanced Member (3/3)

1

Reputation

  1. Hallo allerseits, ich bin diesem Tutorial gefolgt, um Animationen zwischen Szenen zu erzeugen. https://www.youtube.com/watch?v=CE9VOZivb3I Die Animationen habe ich einwandfrei hinbekommen, aber leide bleibt danach alles hellblau (Kamera-Farbe). Meine Hiearchy ist: LevelLoader (Empty Object) -Crossfade (Canvas) --Image (schwarzer Hintergrund, der ein- und ausgeblendet wird) Main Camera Hintergrundbild (das eigentliche Bild) EventSystem Anscheinend muss das Hintergrundbild zwingend in einem Canvas sein, damit es angezeigt wird, obwohl es als Sprite definiert ist. Sobald das Hintergrundbild in einem Canvas ist, funktioniert die Animation aber nicht mehr. Es wirkt so, als würden die beiden Canvase nicht miteinander kompatibel sein. Könnt ihr mir bitte einen Tipp geben, was ich falsch mache? Vielen Dank und beste Grüße Stefan
  2. Hallo allerseits, in meiner aktuellen Szene gibt es 3 verschiedene Screens, die horizontal ausgewählt werden können (mittels Wischen). Es funktioniert auch wunderbar, dass die Screens diesen Einrast/Snap-Effekt haben. Bei einer Sache bin ich aber aktuell ratlos: Wie würde ich es hinbekommen, dass ich z.B. im mittleren Screen noch eine ScrollView habe, die vertikal gescrollt werden kann, ohne dass es das horizontale Wischen zum linken oder rechten Screen verhindert? Aktuell muss ich, um wieder auf den 1. oder 3. Screen zu kommen, außerhalb der ScrollView horizontal Wischen. Bei der mittleren ScrollView (die vertikal gescrollt wird) ist es eigentlich egal, ob da gesnapped wird oder nicht. Aber beim Wechsel der Screens ist der Snap-Effekt sehr hilfreich. Ich weiß, dass es beim Android ViewPager problemlos möglich ist (ich hatte das selbst vor über 1 Jahr geschafft). Leider kann ich das Android-Projekt nicht mehr öffnen und um ehrlich zu sein hab ich mich von Android auch distanziert, da ich Unity viel benutzerfreundlicher finde. Hier mal eine GIF-Animation (wie es aktuell läuft), ein Bild des Inspectors und der Code des ScrollSnap-Skripts. using UnityEngine; using System.Collections; using UnityEngine.UI; public class ScrollRectSnap : MonoBehaviour { float[] points; [Tooltip("how many screens or pages are there within the content (steps)")] public int screens = 2; // Anzahl der Bilder bzw. Screens float stepSize; ScrollRect scroll; bool lerpH; float targetH; [Tooltip("Snap horizontally")] public bool snapInH = true; bool lerpV; float targetV; [Tooltip("Snap vertically")] public bool snapInV = true; void Start() { scroll = gameObject.GetComponent<ScrollRect>(); // Zugriff auf ScrollRect-Komponente im Inspector scroll.inertia = false; if (screens > 0) // Nur falls es mehr als 1 Screen gibt: { points = new float[screens]; stepSize = 1 / (float)(screens - 1); for (int i = 0; i < screens; i++) { points[i] = i * stepSize; } } else { points[0] = 0; } } void Update() // Läuft permanent { if (lerpH) { //scroll.horizontalNormalizedPosition = Mathf.Lerp(scroll.horizontalNormalizedPosition, targetH, 10 * scroll.elasticity * Time.deltaTime); // Orig scroll.horizontalNormalizedPosition = Mathf.Lerp(scroll.horizontalNormalizedPosition, targetH, 0.3f * scroll.elasticity * 5f); // Relativ gute Einstellung if (Mathf.Approximately(scroll.horizontalNormalizedPosition, targetH)) { lerpH = false; } } if (lerpV) { //scroll.verticalNormalizedPosition = Mathf.Lerp(scroll.verticalNormalizedPosition, targetV, 10 * scroll.elasticity * Time.deltaTime); // Orig scroll.verticalNormalizedPosition = Mathf.Lerp(scroll.verticalNormalizedPosition, targetV, 0.3f * scroll.elasticity * 5f); // Relativ gute Einstellung if (Mathf.Approximately(scroll.verticalNormalizedPosition, targetV)) { lerpV = false; } } } public void DragEnd() // Beim Loslassen des Fingers bzw. der Maus: { if (scroll.horizontal && snapInH) { targetH = points[FindNearest(scroll.horizontalNormalizedPosition, points)]; lerpH = true; } if (scroll.vertical && snapInV) { targetH = points[FindNearest(scroll.verticalNormalizedPosition, points)]; lerpH = true; } } public void OnDrag() // Während der Finger den Bildschirm berührt bzw. die Maus geklickt ist: { lerpH = false; lerpV = false; } int FindNearest(float f, float[] array) { float distance = Mathf.Infinity; int output = 0; for (int index = 0; index < array.Length; index++) { if (Mathf.Abs(array[index] - f) < distance) { distance = Mathf.Abs(array[index] - f); output = index; } } return output; } } Vielen Dank für jede Hilfe und beste Grüße
  3. Hallo, die Methode/Funktion PlaySound hat Unity automatisch generiert. Wenn ich diese Methode nicht habe, wird mir PlaySound rot unterstrichen und es heißt, "Der Name PlaySound ist im aktuellen Kontext nicht vorhanden." Ich habe es jetzt etwas anders geschrieben und es funktioniert einwandfrei. Desweiteren werden 2 Dateien (gewollt) nacheinander abgespielt, ohne dass es zu Überschneidungen kommt. Bei mehr als 2 Dateien wären eine for-Schleife und ein Array die wahrscheinlich bessere Wahl. Hier der finale Code. using System.Collections; using UnityEngine; public class SoundPlay : MonoBehaviour { public AudioSource audioSource; // Globale Variable für die AudioSource public AudioClip audioClipLinks, audioClipRechts; // Globale Variablen für die beiden AudioClips public int wertLinks, wertRechts = 7; // Werte, die als Wildcards für die Audioclips dienen (wertRechts wird testweise mit 7 initialisiert) private void Start() // Wird einmalig ausgeführt { audioSource = GetComponent<AudioSource>(); // Zugriff auf AudioSource-Komponente } public void WertFestlegen() // wertLinks wird mit Button-Click inkrementiert { wertLinks++; // Wert um 1 erhöhen StartCoroutine(PlaySound(wertLinks, wertRechts)); // Beide Werte akustisch wiedergeben } IEnumerator PlaySound(int wertLinks, int wertRechts) // Beide Werte akustisch wiedergeben { audioClipLinks = Resources.Load<AudioClip>("Sounds/English" + wertLinks); // Datei für wertLinks festlegen, z.B. English3.wav audioSource.PlayOneShot(audioClipLinks); // Datei abspielen yield return new WaitForSeconds(audioClipLinks.length); // Warten, bis Datei vollständig abgespielt worden ist audioClipRechts = Resources.Load<AudioClip>("Sounds/English" + wertRechts); // Datei für wertRechts festlegen, in diesem Fall English7.wav audioSource.PlayOneShot(audioClipRechts); // Datei abspielen } } Danke für eure Hilfe und beste Grüße 😃
  4. Hallo und Danke für eure Hilfe! var name = fileName + intWert + ".wav"; PlaySound(name); Was genau macht "fileName" hier? intWert + ".wav"; würde doch reichen, wenn alle Dateinamen 1.wav, 2.wav etc sind - oder nicht? @Sascha: Ja, Zufallsgenerator brauche ich in diesem Fall nicht. Ebenso möchte ich nur ungern alle WAV-Dateien in den Inspector reinziehen müssen. Wenn ich 100-WAV-Dateien hätte, wäre es auch ein großes Array. ---- Leider funktioniert es immer noch nicht. Es passiert nichts, wenn ich das Skript starte - also kein SoundPlay. using System; using UnityEngine; public class SoundPlay : MonoBehaviour { private AudioSource audioSource; public int wert; private void Start() { WertFestlegen(); } public void WertFestlegen() { wert = 2; ClickSound(wert); } public void ClickSound(int nr) { audioSource = GetComponent<AudioSource>(); var name = "Resources/Sounds/" + nr + ".wav"; PlaySound(name); audioSource.PlayOneShot(audioSource.clip); } private void PlaySound(string name) { throw new NotImplementedException(); } } Woran könnte es liegen? Beste Grüße
  5. Hallo, mein aktuelles Skript besteht aus 2 eigenen Funktionen. Die erste erfasst Werte (Integer) und die zweite spielt eine WAV-Datei (von mehreren möglichen) ab. Die Dateinamen sind 1.wav bis 10.wav und befinden sich in Assets\Resources\Sounds\ (Schön wäre es, wenn ich die 10 WAV-Dateien nicht in den Inspector reinziehen müsste.) Mein Ziel ist es, die entsprechende WAV-Datei in Abhängigkeit des Integer-Wertes abzuspielen, anstatt 10 if-Abfragen a la "if int=1, play 1.wav etc" zu erzeugen. Beispiel: Ist der int-Wert 5, dann soll auch die 5.wav abgespielt werden Hier mal ein Code, der eher als Beispiel zu betrachten ist: using UnityEngine; public class SoundPlay : MonoBehaviour { private AudioSource audioSource; private AudioClip soundDatei; // Beliebige WAV-Datei public AudioClip[] soundArray; // Sollte normalerweise nicht benötigt werden private void Start() { WertFestlegen(); } public void WertFestlegen() { wert = 2; // Wird im echten Skript natürlich nicht so festgelegt und dient hier nur zur Veranschaulichung ClickSound(wert); } public void ClickSound(int nr) { audioSource = GetComponent<AudioSource>(); audioSource.clip = soundArray[Random.Range(0, soundArray.Length)]; // Funktioniert, aber nicht gewollt audioSource.PlayOneShot(audioSource.clip); //Mein Ziel: //audioSource.PlayOneShot(%wert%.wav); // Ich bräuchte eine Art Platzhalter, ich kenne die % % aus anderen Programmiersprachen } } P.S: Sorry, hab ganz oben "int wert" vergessen, aber tut aktuell nichts zur Sache. Vielen Dank für jede Hilfe und beste Grüße!
  6. Hallo, mittels des Package Managers habe ich den Unity Reorder (2.40 preview1) und die Timeline (1.36) importiert. Nach kurzer Einstellungen der Timeline und einem Klick auf Play wird ein mp4-Video meiner GameView erzeugt. (60 FPS FHD) Das Problem ist, dass es immer kleine Performance-Schwankungen gibt, die aber auch beim Klick auf Play innerhalb von Unity sichtbar sind. (Ist also kein Recorder-Problem - das erzeugte Video ist vom Prinzip her einwandfrei.) Klicke ich hingegen auf Build, gibt es überhaupt keine Performance-Probleme, aber es wird kein Video erzeugt. Auf YT sah ich, wie ein User die Project Settings -> Time die Fixed Timestep auf 0.005 gesetzt hat. Auch dies hilft nicht! Es ist nicht mal grafisch anspruchsvoll - einfach nur wenige 2D-Balken, die von oben nach unten fallen - Super Nintendo-Grafik. Ich bräuchte also Hilfe, entweder diese Mikro-Ruckler während die Szene abgespielt wird, zu beseitigen, oder eine Aufnahme nach Build zu erzeugen. P.S: Intel i5-4590, 16 GB DDR3, GeForce GTX 1060 6 GB, Windows 10 Pro 64 Bit - Unity 2020.1.13f1 Danke für jede Hilfe und beste Grüße!
  7. Hallo Unity-Experten, in meinem einfachen Beispiel habe ich ein Image (mit einer Button-Komponente ausgestattet), welches den Inhalt eines Textfeldes modifizieren soll. Mein Wunsch ist es, das Image auf 3 verschiedene Arten zu klicken (Touchscreen): 1) 1-Finger-Touch (wie Linksklick) 2) 2-Finger-Touch (wie Rechtsklick) 3) Swipe-Up (wie Mausrad nach unten) 4) Andere Gesten wie Swipe-Down, Right, Left oder mehr als 2 Finger können ignoriert werden Ich habe vorhandene Touch-Skripte genommen und kombiniert. Das Skript habe ich dann an die MainCamera gehängt und diese in die OnClick-Komponente des Button-Komponents reingezogen. Anschließend Build und auf dem Touchscreen meines Lenovo Yogas getestet. Es funktioniert ziemlich unzuverlässig. 🤨 Habt ihr eine Idee, woran es liegt und wie man das verbessern kann? using System; using UnityEngine; using UnityEngine.UI; public class SwipeManager : MonoBehaviour { private Vector2 fingerDown; private Vector2 fingerUp; public GameObject gameObjectText; // Platzhalter für UI-Textelement public float SWIPE_THRESHOLD = 40f; // Minimaler Abstand für Swipe in px public void MultiTouch() // Funktion, auf die der Button zugreift (daher public) { foreach (Touch touch in Input.touches) { if (touch.phase == TouchPhase.Began) { fingerUp = touch.position; fingerDown = touch.position; } if (touch.phase == TouchPhase.Ended) // Detects swipe after finger is released { fingerDown = touch.position; CheckSwipe(); // Prüfen, in welchr Richtung geswiped wurde } } } void CheckSwipe() // Prüfen, in welchr Richtung geswiped wurde { if (VerticalMove() > SWIPE_THRESHOLD && VerticalMove() > HorizontalValMove()) // Check if Vertical swipe { if (fingerDown.y - fingerUp.y > 0) // Up swipe { OnSwipeUp(); } else if (fingerDown.y - fingerUp.y < 0) // Down swipe { TextSchreiben(0); } fingerUp = fingerDown; } else if (HorizontalValMove() > SWIPE_THRESHOLD && HorizontalValMove() > VerticalMove()) // Check if Horizontal swipe { if (fingerDown.x - fingerUp.x > 0) // Right swipe { //OnSwipeRight(); // Vorerst nicht benötigt } else if (fingerDown.x - fingerUp.x < 0) // Left swipe { //OnSwipeLeft(); // Vorerst nicht benötigt } fingerUp = fingerDown; } else // Falls keine Swipe-Bewegung erfolgte: { TouchEingabe(); // Funktion aufrufen, die die Anzahl der Fingereingabe ermittelt } } float VerticalMove() // Berechnung vertikale Bewegung { return Mathf.Abs(fingerDown.y - fingerUp.y); } float HorizontalValMove() // Berechnung horizontale Bewegung { return Mathf.Abs(fingerDown.x - fingerUp.x); } void OnSwipeUp() { TextSchreiben(6); Debug.Log("Swipe UP"); } void TouchEingabe() { Touch myTouch = Input.GetTouch(0); Touch[] myTouches = Input.touches; for (int i = 0; i < Input.touchCount; i++) // Ermitteln, mit wie vielen Fingern getoucht wurde { TextSchreiben(i); } } void TextSchreiben(int i) // Anzahl Finger = Parameter { Text text = gameObjectText.GetComponent<Text>(); // Zugriff auf das Textfeld if (i == 0) // 1 Finger { text.text = "1 Finger touch"; // Anzuzeigender Text innerhalb des Textfeldes } if (i == 1) // 2 Finger { text.text = "2 Finger touch"; // Anzuzeigender Text innerhalb des Textfeldes } if (i == 6) // Swipe-up (könnte auch durch else ersetzt werden) { text.text = "Swipe up"; // Anzuzeigender Text innerhalb des Textfeldes } Invoke("TextLeeren", 1); // Funktion in 1 Sekunde aufrufen } void TextLeeren() { Text text = gameObjectText.GetComponent<Text>(); // Zugriff auf das Textfeld text.text = ""; // Textfeld leeren } } Vielen Dank für jede Hilfe und beste Grüße
  8. *Thread kann gelöscht werden*
×
×
  • Create New...