Tại sao Unity Eventsystem tụt hậu trong lần chạm đầu tiên?


7

Xin chào Tôi đang làm một game platformer đơn giản rất đơn giản cho các thiết bị Android. Tôi đang sử dụng hệ thống sự kiện của Unity cho phong trào người chơi. Vấn đề là khi tôi chạm vào nút lần đầu tiên có một độ trễ (nấc) sau đó mọi thứ đều ổn. Tôi đã mô tả trò chơi của mình có một sự tăng đột biến trong phương pháp Cập nhật sự kiện.

đây là mã đơn giản hóa

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

[RequireComponent (typeof(Rigidbody2D)) ]   
[RequireComponent (typeof(BoxCollider2D)) ]
public class PlayerController : MonoBehaviour {


public float movementSpeed = 5f;
public float jumpForce = 5f;
public float distanceToGround = 0.2f;
public LayerMask staticCollider;
public playerState state;

private Rigidbody2D rBody;
public Transform leftmost;
public Transform rightmost;

Collider2D[] platforms = new Collider2D[2];
public int hrInput = 0;

// Use this for initialization
void Start ( ) {
    rBody = GetComponent<Rigidbody2D> ();

}


//FixedUpdate is framerate independent, and therefore completely unrelated to your framerate

void FixedUpdate ()
{
    state.grounded = isGrounded ();


    if (hrInput > 0) {
        MOVE_RIGHT ();
    }
    else if (hrInput < 0) {
        MOVE_LEFT ();
    } else {
        STOP_MOVE ();

    }

}

public bool isGrounded(){
    print ("ground");
    if (Physics2D.OverlapAreaNonAlloc (leftmost.position, rightmost.position, platforms, staticCollider) > 0) {
        return true;
    } else
        return false;
}


public void setHrInput (int h ) {
//    print (h);

    hrInput = h;
}

public void JUMP(){
    if(state.grounded){
        state.onAir = true;
      //  rBody.AddForce(Vector2.up * jumpForce, ForceMode2D.Impulse);
        rBody.velocity = Vector2.up * jumpForce;
    }
}

public void MOVE_LEFT(){
    rBody.velocity = new Vector2 (-1 * movementSpeed * Time.deltaTime, rBody.velocity.y);
}

public void MOVE_RIGHT(){
    rBody.velocity = new Vector2(1 * movementSpeed*Time.deltaTime, rBody.velocity.y);
}

public void STOP_MOVE(){
    rBody.velocity = new Vector2(0,rBody.velocity.y);
    }

} // end 

Đây là hình ảnh hồ sơ.

nhập mô tả hình ảnh ở đây

Xin hãy giúp tôi khắc phục vấn đề này.


1
Đó thực sự là một câu hỏi hay. Tôi luôn trải nghiệm điều tương tự, cho dù trò chơi có lớn đến đâu
Jacob

Nút nào bị trễ khi bạn nhấn lần đầu tiên, tất cả chúng hoặc chỉ một hoặc trò chơi chỉ bị trễ ở lần chạm đầu tiên không liên quan đến nút? Ngoài ra, sẽ rất hữu ích khi thấy độ trễ của trình biên dịch và để xem sự kiện nào đang sử dụng bao nhiêu thời gian trong khung đó.
John Hamilton

tất cả trong số họ, ok tôi đang tải lên ảnh chụp màn hình hồ sơ.
Shohanur Rahaman

Ảnh chụp màn hình không đặc biệt hữu ích. Bạn đang nhìn vào 100 khung hình / giây khá chắc chắn ở đó. Nhanh thật. Phần gạch chân của 4,6 kb là bộ sưu tập rác và khá nhỏ.
Draco18 không còn tin tưởng SE

1
Không có ích gì khi mã của bạn không liên quan gì đến Hệ thống sự kiện hoặc vấn đề bạn đang cố gắng giải quyết. Bạn có thể sửa đổi ví dụ của mình để không bao gồm bất cứ điều gì không liên quan đến vấn đề "chạm đầu tiên" không?
Daniel Yaroslavski

Câu trả lời:


1

Đầu vào cảm ứng luôn là một chút của PITA (Tôi thực sự khuyên bạn nên sử dụng gói InControl / không liên kết với nhau), tôi tin rằng vấn đề chính bạn gặp phải là do kiểm tra đầu vào của bạn trong FixedUpdate. Đầu vào phải được kiểm tra trong Cập nhật, FixedUpdate là để cập nhật các vật lý. https://docs.unity3d.com/Manual/ExecutOrder.html


1
Khái niệm rằng đầu vào chỉ nên được kiểm tra trong Cập nhật cũng có vấn đề. Các tài liệu Unity có đề cập đến nó, nhưng mô tả của họ không khớp với hành vi trong Unity 4.6+ (sớm nhất tôi đã thử nghiệm), trong đó đầu vào cập nhật có sẵn sớm nhất là FixedUpdate. Nếu bạn đang sử dụng đầu vào để tạo phản hồi vật lý, xử lý nó trong FixedUpdate thực sự có thể loại bỏ một khung có độ trễ, liên quan đến việc thực hiện trong Cập nhật. Nó chỉ cần chăm sóc thêm để tránh xử lý hai lần hoặc bỏ qua đầu vào. Trong mọi trường hợp, việc kiểm tra một biến int trong FixedUpdate sẽ không phải là nguyên nhân của gian hàng được mô tả trong câu hỏi
DMGregory

1
Nói từ kinh nghiệm thực tế. Kiểm tra đầu vào trong FixedUpdate sẽ gây ra sự cố độ trễ / đầu vào bị giảm và hành vi không mong muốn. Theo hiểu biết của tôi (kể từ Unity 3.2 / 3.3) FixedUpdate được thiết kế dành riêng cho Hệ thống Vật lý. Kiểm tra đầu vào trong Cập nhật, không phải FixedUpdate. Câu trả lời của tôi đứng. Quan tâm để làm cho ý kiến ​​của bạn một câu trả lời?
Robert Pháp
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.