Jump to content
Unity Insider Forum

Script TouchpadAbfrage


paintinx

Recommended Posts

Guten Morgen -

ich habe mir die diversen Tutorials von der wirklich umfaenglichen UnityLearnEdition angetan und eine spezielle Frage.

 

Seht dazu gern die angehangenen Bilder ... ich hoffe zudem, dass es nicht off topic ist, wenn ich hier der Frage entsprechenden Code poste ... dann schnell löschen und

ich beantrage ForumWelpenSchutz ...

1. Das Kart aus dem Unity Beispiel /ist frei downloadbar im Netz/ beinhaltet eine KeyboardAbfrage und ich moechte gern meine durch die Tutorials gelernten Anederungen

auf meinem Android Phone ausprobieren -und mich also an eine Touchpad-Abfrage wagen.

 

{

Edit: 9.10.19, 13:17: Ich hab mich jetzt ein wenig umgesehen in Unity ^^ - ich denke, dass ich mit dem frei erhaeltlichen JoystickPack ausm AssettStore besser fahre und daher

versuche ich gerade ... das Joystick Script in das Kart einzubauen ... der Thread bleibt aber aktuell ... wegen der Tutorial Anfrage ...

}

 

Hat dazu jemand ein gutes Tutorial parat bzw kann ich ggflls auf ein Script aus dem Asset Store zurueckgreifen - sich er ist es NICHT mit einfachem COPY and PASTE getan ...

 

An dieser Stelle daher entsprechend der Bilder auch das KeyboardScript zum Verstaendnis.

Beste Gruesze in den Tag, Stephan

 

 

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

namespace KartGame.KartSystems
{
    /// <summary>
    /// A basic keyboard implementation of the IInput interface for all the input information a kart needs.
    /// </summary>
    public class KeyboardInput : MonoBehaviour, IInput
    {
        public float Acceleration
        {
            get { return m_Acceleration; }
        }
        public float Steering
        {
            get { return m_Steering; }
        }
        public bool BoostPressed
        {
            get { return m_BoostPressed; }
        }
        public bool FirePressed
        {
            get { return m_FirePressed; }
        }
        public bool HopPressed
        {
            get { return m_HopPressed; }
        }
        public bool HopHeld
        {
            get { return m_HopHeld; }
        }

        float m_Acceleration;
        float m_Steering;
        bool m_HopPressed;
        bool m_HopHeld;
        bool m_BoostPressed;
        bool m_FirePressed;

        bool m_FixedUpdateHappened;

        void Update ()
        {
            if (Input.GetKey (KeyCode.UpArrow))
                m_Acceleration = 1f;
            else if (Input.GetKey (KeyCode.DownArrow))
                m_Acceleration = -1f;
            else
                m_Acceleration = 0f;

            if (Input.GetKey (KeyCode.LeftArrow) && !Input.GetKey (KeyCode.RightArrow))
                m_Steering = -1f;
            else if (!Input.GetKey (KeyCode.LeftArrow) && Input.GetKey (KeyCode.RightArrow))
                m_Steering = 1f;
            else
                m_Steering = 0f;

            m_HopHeld = Input.GetKey (KeyCode.Space);

            if (m_FixedUpdateHappened)
            {
                m_FixedUpdateHappened = false;

                m_HopPressed = false;
                m_BoostPressed = false;
                m_FirePressed = false;
            }

            m_HopPressed |= Input.GetKeyDown (KeyCode.Space);
            m_BoostPressed |= Input.GetKeyDown (KeyCode.RightShift);
            m_FirePressed |= Input.GetKeyDown (KeyCode.RightControl);
        }

        void FixedUpdate ()
        {
            m_FixedUpdateHappened = true;
        }
    }
}

 

Bildschirmfoto 2019-10-09 um 08.57.55.png

Bildschirmfoto 2019-10-09 um 08.58.59.png

Bildschirmfoto 2019-10-09 um 08.59.07.png

Bildschirmfoto 2019-10-09 um 08.59.39.png

Link zu diesem Kommentar
Auf anderen Seiten teilen

So, habe mich mal durch das JoystickPack gewurstelt und komme leider gar nicht zurecht ... ist aber schwierig, dass hier so schriftlich zu machen ... daher erstmal die Frage, ob ich in meinen FrageThread ein kurzes (gepacktes) Prj posten darf so dass ihr euch ein besseres Bild machen koennt abs wenn ich hier nur Scripts poste ... GrzStef

Link zu diesem Kommentar
Auf anderen Seiten teilen

Kannst du machen, aber eigentlich reicht das Script.

Du hast halt das Interface IInput, und das definiert diese Propertys:

public float Acceleration
{
  get { return m_Acceleration; }
}

Das KartMovement-Script liest die Werte dieser Propertys aus und entscheidet dann, wie das Kart sich bewegen soll.

Um eine andere Input-Methode zu bauen, musst du eine neue Klasse bauen, die ebenfalls dieses Interface implementiert.

public class TouchInput : MonoBehaviour, IInput
{
  public float Acceleration
  {
    get { return ???; }
  }
  public float Steering
  {
    get { return ???; }
  }
  
  // usw.

Jetzt müssen diese Propertys immer den richtigen Wert zurückgeben. Beim Keyboard-Script wird in Update nachgeschaut, was die Input-Klasse über die aktuellen Tastatur-Tasten sagt (mit Input.GetKey und so). Die Werte werden in Feldern gespeichert (m_Acceleration und so weiter) und die Propertys geben den Wert dieser Felder zurück.

Bei einer Touch-Steuerung brauchst du sichtbare Knöpfe. Diese würden beim Drücken die Werte ebenfalls den Wert von Feldern setzen, deren Wert denn von den Propertys zurückgegeben wird. Es ist vielleicht nicht die eleganteste Methode, aber anfangs recht einfach, wenn du die Felder öffentlich machst.

public float m_Acceleration;
public float m_Steering;
// usw.

Wenn das deine einzige Änderung wäre, sieht das Script erstmal so aus: https://pastebin.com/zvqcsMsZ

Das kannst du zum Verständnis auch einfach mal auf dein Kart packen und aktivieren. Die Felder tauchen jetzt im Inspektor auf, und du kannst das Kart über den Inspektor steuern.

Wenn du jetzt einen Button in dein UI baust, kannst du dem Button sagen, dass er diese Werte beeinflussen soll. Dazu benutzt du ein UnityEvent, wie das "On Click"-Ding im Inspektor des Buttons. Da muss man sich einmal reinfuchsen, ist aber super: Du kannst damit dem Button sagen, dass er eine bestimmte Sache machen soll, wenn er gedrückt wird, ohne extra Code zu schreiben. OnClick ist allerdings hier unpraktisch, da das Event ausgelöst wird, wenn man den Button einmal drückt und wieder loslässt. Du willst ja, dass etwas passiert, wenn der Knopf runtergedrückt wird (z.B. Beschleunings-Wert erhöhen) und wenn er wieder losgelassen wird (z.B. den Wert wieder senken).

Dabei hilft dir die "EventTrigger"-Komponente. Dort kannst du auf weitere Events reagieren - von "Mauszeiger ist neuerdings über dem Objekt" bis hin zu "der Button wurde losgelassen. Auch hier wirst du dich ein bisschen reinfuchsen müssen, aber das wird schon. Du willst dann dem Button über diese Events beibringen, die Werte deiner TouchInput-Komponente zu ändern.

Da fehlt dann noch einiges, aber damit hast du erstmal eine Menge zu tun.

Link zu diesem Kommentar
Auf anderen Seiten teilen

Hallo Sascha - MannMannMann, vielen Dank dass du das so ausführlich aufgeschrieben hast!

 

Ich kenne eigentlich nur 2 weitere Foren in denen einem so ausführlich geholfen wird, das ist zum Einen das Chevy Board und zum anderen das c4d Forum.

Ich gehe das heute abend in Ruhe durch!

 

Topp Arbeit!

 

Stephan

Link zu diesem Kommentar
Auf anderen Seiten teilen

Archiviert

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

×
×
  • Neu erstellen...