Hallo, ich mache ein sehr einfaches Platformer-Spiel für Android-Geräte. Ich benutze das Ereignissystem von Unity für Spielerbewegungen. Das Problem ist, wenn ich den Knopf zum ersten Mal berührte, gab es eine Verzögerung (Schluckauf), danach ist alles in Ordnung. Ich habe mein Spiel profiliert, da die EventSystem Update-Methode einen Spitzenwert aufweist.
Hier ist der vereinfachte Code.
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
Hier ist das Profiler-Image.
Bitte helfen Sie mir, dieses Problem zu beheben.
unity
unityscript
Shohanur Rahaman
quelle
quelle
Antworten:
Die Berührungseingabe ist immer eine Art PITA (ich empfehle das InControl-Paket tatsächlich / bin ohnehin nicht angeschlossen), unabhängig davon, ob das Hauptproblem bei Ihnen darin besteht, dass Sie in FixedUpdate nach Eingaben suchen. Die Eingabe sollte in Update überprüft werden. FixedUpdate dient zum Aktualisieren von physischen Körpern. https://docs.unity3d.com/Manual/ExecutionOrder.html
quelle