Podstawowy ruch gracza w Unity
W Unity mamy do czynienia z dwoma* podstawowymi pętlami, Update( której częstotliwość zmienia się zależnie od mocy komputera i złożoności programu) i FixedUpdate, która wywołuje się w stałych odtępach czasu, domyślnie 50 razy na sekundę.
Aby zapewnić poprawne działanie gry na każdym urządzeniu, należy rozgraniczyć wywołania poszczególnych mechanizmów gry.
Sprawdzanie inputu użytkownika może przebiegać w Update, ale już wykonanie ruchu powinno odbywać się w FixedUpdate, aby na każdym urządzeniu ruch wyglądał podobnie.
Download Unity package: Player basic move and jump
Przykład: Podstawowy ruch w Unity z użyciem fizyki
using UnityEngine;
using static UnityEngine.Rendering.DebugUI;
public class PlayerMove : MonoBehaviour
{
Rigidbody2D _rb;
readonly float _speed = 5f;
float _dirx;
int _lastDir = 0;
void Start()
{
_rb = GetComponent<Rigidbody2D>();
}
void Update()
{
_dirx = Input.GetAxisRaw("Horizontal");
Rotate();
}
void FixedUpdate()
{
Move();
}
void Move()
{
_rb.linearVelocity = new(_dirx * _speed, _rb.linearVelocity.y);
}
void Rotate()
{
if (Mathf.Abs(_dirx) > 0.2f)
{
if(_lastDir != Mathf.RoundToInt(_dirx))
{
transform.localScale = new(Mathf.Sign(_dirx), 1f, 1f);
_lastDir = Mathf.RoundToInt(_dirx);
}
}
}
}
Podstawowy skok z użyciem fizyki
using UnityEngine;
public class PlayerJump : MonoBehaviour
{
Rigidbody2D _rb;
readonly float _jumpForce = 12f;
bool _canJump;
void Start()
{
_rb = GetComponent<Rigidbody2D>();
}
void Update()
{
if (Input.GetButtonDown("Jump")) _canJump = true;
}
void FixedUpdate()
{
Jump();
}
void Jump()
{
if (_canJump)
{
_rb.linearVelocity += Vector2.up * _jumpForce;
_canJump = false;
}
}
}