Hello everyone,
I have been trying for weeks to fix this problem with fixed joystick using this code.
When I go to move the joystick, the knob doesn’t start in the center of joystick. For some reason the knob shifts to the top right of the joystick. So the player starts to move forward as soon as knob is moved.
How can this be fixed? And what is causing knob to move of center?
Here is the youtube video for reference:
This the code I’m using:
using System;
using UnityEngine;
using UnityEngine.AI;
using UnityEngine.InputSystem.EnhancedTouch;
using ETouch = UnityEngine.InputSystem.EnhancedTouch;
public class PlayerManager : MonoBehaviour
{
[SerializeField]
private Vector2 JoystickSize = new Vector2(300, 300);
[SerializeField]
private joyStick Joystick;
[SerializeField]
public NavMeshAgent Player;
private Finger MovementFinger;
public Vector2 MovementAmount;
public Animator playerAnimator;
private void OnEnable()
{
EnhancedTouchSupport.Enable();
ETouch.Touch.onFingerDown += HandleFingerDown;
ETouch.Touch.onFingerUp += HandleLoseFinger;
ETouch.Touch.onFingerMove += HandleFingerMove;
}
private void OnDisable()
{
ETouch.Touch.onFingerDown -= HandleFingerDown;
ETouch.Touch.onFingerUp -= HandleLoseFinger;
ETouch.Touch.onFingerMove -= HandleFingerMove;
EnhancedTouchSupport.Disable();
}
private void HandleFingerMove(Finger MovedFinger)
{
if (MovedFinger == MovementFinger)
{
Vector2 knobPosition;
float maxMovement = JoystickSize.x / 2f; //How Far Knob Moves From Joystick
ETouch.Touch currentTouch = MovedFinger.currentTouch;
if (Vector2.Distance(
currentTouch.screenPosition,
Joystick.RectTransform.anchoredPosition
) > maxMovement)
{
knobPosition = (
currentTouch.screenPosition - Joystick.RectTransform.anchoredPosition
).normalized
* maxMovement;
}
else
{
knobPosition = currentTouch.screenPosition - Joystick.RectTransform.anchoredPosition;
}
Joystick.Knob.anchoredPosition = knobPosition;
MovementAmount = knobPosition / maxMovement;
}
}
private void HandleLoseFinger(Finger LostFinger)
{
if (LostFinger == MovementFinger)
{
MovementFinger = null;
Joystick.Knob.anchoredPosition = Vector2.zero;
Joystick.gameObject.SetActive(true); // If Joystick Is Visible After Touch
MovementAmount = Vector2.zero;
}
}
private void HandleFingerDown(Finger TouchedFinger)
{
if (MovementFinger == null && TouchedFinger.screenPosition.x <= Screen.width / 2f)
{
MovementFinger = TouchedFinger;
MovementAmount = Vector2.zero;
Joystick.gameObject.SetActive(true);
Joystick.RectTransform.sizeDelta = JoystickSize;
}
}
private void Update()
{
Vector3 scaledMovement = Player.speed * Time.deltaTime * new Vector3(
MovementAmount.x,
0,
MovementAmount.y
);
Player.transform.LookAt(Player.transform.position + scaledMovement, Vector3.up);
Player.Move(scaledMovement);
Player.transform.LookAt(worldPosition: Player.transform.position + scaledMovement, Vector3.up);
print("MovementAmount.x: " + MovementAmount.x);
print("MovementAmount.y: " + MovementAmount.y);
playerAnimator.SetFloat(name: "moveX", MovementAmount.x);
playerAnimator.SetFloat(name: "moveZ", MovementAmount.y);
}
}