Du bist nicht angemeldet.

Werbeanzeige

1

25.04.2017, 16:19

Unity- Fahrzeuglenkung softer machen.

Ich habe ein Unity-Projekt mit dem Standardasset/Vehicle/Car für mich optimiert und bin insgesamt mit dem Fahrverhalten zufrieden. Bis auf einen Punkt: Die Steuerung des Fahrzeugs per Joystick/Gamepadstick reagiert viel zu ruckartig und das Auto übersteuert dadurch viel zu leicht. Dafür habe ich nun im InputManager die Sensibilität der horizontalen Achse auf 0.18 gesetzt. Zwar schlägt die Lenkung jetzt nicht mehr so stark an, aber dafür bleiben die Reifen jetzt fast in der Mittelstellung stehen und man kann kaum noch Lenken. Für mich sieht es so aus, als wenn Unity hier ein Bug hat ? Sollte die Sensibilität der Achsen nicht einfach Zeitverzögert (gesmooth) werden oder expositionell ansteigen? Anstatt die kompletten End-Werte zu reduzieren ? Bei der Steuerung mit Tasten ist es ja auch nicht so... Im Script des Fahrzeugs habe ich Input.GetAxis bereits mit Input.GetAxisRaw ohne Erfolg ausgewechselt. Falls man in Unity nicht direkt etwas an der Input ändern kann: Gibt es eine Möglichkeit die horizontale Input-Achse per Script wenigstens zu filtern, damit die Lenkung expositionell ansteigt ?

Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von »vreezer« (25.04.2017, 16:58)


2

26.04.2017, 10:36

Ich bin etwas weitergekommen und möchte jetzt die Deadzone weicher machen. Vielleicht kann mir hier jemand einen Tipp geben, ob ich auf dem richtigen Pfad bin ?

Ich wollte dieses Script:

C#-Quelltext

1
2
3
4
5
6
float deadzone = 0.25f;
    Vector2 stickInput = new Vector2(Input.GetAxis(“Horizontal”), Input.GetAxis(“Vertical”));
    if(stickInput.magnitude < deadzone)
        stickInput = Vector2.zero;
    else
        stickInput = stickInput.normalized * ((stickInput.magnitude - deadzone) / (1 - deadzone));

Quelle: http://www.third-helix.com/2013/04/12/do…ones-right.html

in das Script vom StandardAsset-Car integrieren:

C#-Quelltext

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
using System;
using UnityEngine;
using UnityStandardAssets.CrossPlatformInput;

namespace UnityStandardAssets.Vehicles.Car
{
    [RequireComponent(typeof (CarController))]
    public class CarUserControl : MonoBehaviour
    {
        private CarController m_Car; // the car controller we want to use


        private void Awake()
        {
            // get the car controller
            m_Car = GetComponent<CarController>();
        }


        private void FixedUpdate()
        {
            // pass the input to the car!
            float h = CrossPlatformInputManager.GetAxis("Horizontal");
            float v = CrossPlatformInputManager.GetAxis("Vertical");
#if !MOBILE_INPUT
            float handbrake = CrossPlatformInputManager.GetAxis("Jump");
            m_Car.Move(h, v, v, handbrake);
#else
            m_Car.Move(h, v, v, 0f);
#endif
        }
    }
}


Oder bin ich hier auf dem Holzweg ?

3

26.04.2017, 12:03

Mir wurde nun freundlicherweise von Garzec geholfen. Hier ist das Script, falls jemand das Auto vom StandardAsset auseinander nimmt. Mit einer weichen DeadZone kann man es viel agiler gestalten.

C#-Quelltext

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
using System;
using UnityEngine;
using UnityStandardAssets.CrossPlatformInput;

namespace UnityStandardAssets.Vehicles.Car
{
    [RequireComponent(typeof (CarController))]
    public class CarUserControl : MonoBehaviour
    {
        private CarController m_Car;
        float deadzone = 0.15f;

        private void Awake()
        {
        m_Car = GetComponent<CarController>();
        }

    private void FixedUpdate()
        {
        Vector2 stickInput = new Vector2(CrossPlatformInputManager.GetAxis("Horizontal"), CrossPlatformInputManager.GetAxis("Vertical"));

        if (stickInput.magnitude < deadzone)
            stickInput = Vector2.zero;
        else
            stickInput = stickInput.normalized * ((stickInput.magnitude - deadzone) / (1 - deadzone));

        float handbrake = CrossPlatformInputManager.GetAxis("Jump");

        m_Car.Move(stickInput.x, stickInput.y, stickInput.y, handbrake);

        //m_Car.Move(h, v, v, 0f);
        }
    }
}


1 von 1k Schritten nach vorn :D

Werbeanzeige