Я делаю руннер игру на Android с использованием C # и Унити . Я пытаюсь сделать управление с свайпом, но код не работает должным образом. Иногда, когда я провожу пальцем влево, игрок идет направо и прыгает ужасно. Вот мой код, я не понимаю, где моя ошибка. иногда вообще не обнаружеваетса касание на экран . Позиция игрока: (10, 1, 0) и позиция земли (плоскости): (10, 0, 0). Игрок - это простой Цилиндр с Rigidbody. пожалуйста помогите!
public int leftLine = 7;
public int rightLine = 13;
public int currentLine = 10;
public int distanceBetweenLines = 3;
public float xSideMoveSpeed = 50f;
public float minSwipDelta = 10f;
public float jumpSpeed = 100f;
Vector2 swipeDelta;
bool canSwipe,
RightSwipe,
LeftSwipe,
UpSwipe,
DownSwipe;
Rigidbody rb;
public float maxDistanceForJumping = 1.05f;
void Start()
{
rb = gameObject.GetComponent<Rigidbody>();
}
void Update()
{
TouchDetector();
MoveByTouch();
}
void FixedUpdate()
{
if (IsGrounded() && UpSwipe)
{
rb.AddForce(Vector3.up * jumpSpeed);
UpSwipe = false;
}
}
public bool IsGrounded()
{
return Physics.Raycast(transform.position, Vector3.down, maxDistanceForJumping);
}
void MoveByTouch()
{
if (canSwipe && RightSwipe)
{
if (currentLine < rightLine)
currentLine += distanceBetweenLines;
canSwipe = false;
swipeDelta = Vector2.zero;
}
if (canSwipe && LeftSwipe)
{
if (currentLine > leftLine)
currentLine -= distanceBetweenLines;
canSwipe = false;
swipeDelta = Vector2.zero;
}
Vector3 newPos = new Vector3(currentLine, transform.position.y, transform.position.z);
transform.position = Vector3.Lerp(transform.position, newPos, xSideMoveSpeed * Time.deltaTime);
}
void TouchDetector()
{
if (Input.touchCount > 0)
{
// can we swipe or ont
if (Input.touches[0].phase == TouchPhase.Began)
{
canSwipe = true;
}
else if (Input.touches[0].phase == TouchPhase.Canceled || Input.touches[0].phase == TouchPhase.Ended)
{
canSwipe = false;
swipeDelta = Vector2.zero;
}
if (Input.touches[0].phase == TouchPhase.Moved)
{
// Calculating delta
if (Mathf.Abs(Input.touches[0].deltaPosition.sqrMagnitude) > minSwipDelta)
swipeDelta = Input.touches[0].deltaPosition;
else
swipeDelta = Vector2.zero;
// Detecting arrows
if (Mathf.Abs(swipeDelta.x) > Mathf.Abs(swipeDelta.y) && swipeDelta.x > 0)
{
RightSwipe = true;
LeftSwipe = UpSwipe = DownSwipe = false;
}
if (Mathf.Abs(swipeDelta.x) > Mathf.Abs(swipeDelta.y) && swipeDelta.x < 0)
{
LeftSwipe = true;
RightSwipe = UpSwipe = DownSwipe = false;
}
if (Mathf.Abs(swipeDelta.x) < Mathf.Abs(swipeDelta.y) && swipeDelta.y > 0)
{
UpSwipe = true;
RightSwipe = LeftSwipe = DownSwipe = false;
}
if (Mathf.Abs(swipeDelta.x) < Mathf.Abs(swipeDelta.y) && swipeDelta.y < 0)
{
DownSwipe = true;
RightSwipe = LeftSwipe = UpSwipe = false;
}
}
}
}
проголосовал за закрытие как дубликат т.к. уже есть запощеное решение реализации свайпа которое значительно удобнее того кода который ты написал
пример использования
(правда, писал не проверяя так что могут затесатся ошибки мелкие)
public void Start()
{
SwipeDetector.OnSwipe += MovementControl;
}
private void MovementControl(SwipeData data)
{
switch(data.swipeData)
{
case (SwipeDirection.Up)
//Логика движения
break;
case (SwipeDirection.Down)
//Логика движения
break;
case (SwipeDirection.Left)
//Логика движения
break;
case (SwipeDirection.Right)
//Логика движения
break;
}
}
Айфон мало держит заряд, разбираемся с проблемой вместе с AppLab
Перевод документов на английский язык: Важность и ключевые аспекты
Есть такая задача: 30 работников отметили дни в которые они бы хотели работать ,а в какие отдыхать
Поймал багу с Entity Framework Core 22 (Npgsql) и не могу понять, что происходит за кулисами, в чем и прошу помочь разобраться