https://futabazemi.net/unity/addforce_velocity_jump
https://qiita.com/yuki2006/items/a60fc92e033dddcb3a83
transform.positionを直接操作したりAddforceしたりするより動きが自然な気がするよというお話。
// 横移動速度
private float MOVE_SPEED = 4f;
// ジャンプの高さ
private float JUMP_SPEED = 8f;
// 横移動入力状態(右が1・左が-1)
private int inputX = 0;
// 接地判定結果
private bool isGround;
void Update()
{
if (Input.GetKey(KeyCode.RightArrow))
{
inputX = 1;
}
else if (Input.GetKey(KeyCode.LeftArrow))
{
inputX = -1;
}
else
{
inputX = 0;
}
if (Input.GetKeyDown(KeyCode.Space) && isGround)
{
Jump();
}
CheckGround();
}
private void Jump()
{
// ジャンプ移動
rb.velocity = new Vector2(rb.velocity.x, JUMP_SPEED);
}
private void FixedUpdate()
{
if (inputX == 1)
{
animator.SetInteger("direction", 1);
rb.velocity = new Vector2(MOVE_SPEED, rb.velocity.y);
}
if (inputX == -1)
{
animator.SetInteger("direction", -1);
rb.velocity = new Vector2(-MOVE_SPEED, rb.velocity.y);
}
if (isGround && inputX == 0)
{
rb.velocity = new Vector2(0, 0);
}
}
private static float RAY_LENGTH = 0.5f;
void CheckGround()
{
/* 設置判定(足元だけバージョン) */
Vector2 rayPosition = transform.position + new Vector3(0.5f, -1f, 0);
Ray2D ray = new Ray2D(rayPosition, transform.up * -1);
int layerMask = LayerMask.GetMask(new string[] {
"Default"
});
RaycastHit2D hit = Physics2D.Raycast((Vector2)ray.origin, Vector2.down, RAY_LENGTH, layerMask);
if (hit.collider == null)
{
if (SystemConfig.Debug.ViewRayCast)
{
Debug.DrawRay(ray.origin, ray.direction * RAY_LENGTH, Color.blue);
}
isGround = false;
}
else if (!isGround)
{
if (hit.collider.name == "Field")
{
if (SystemConfig.Debug.ViewRayCast)
{
Debug.DrawRay(ray.origin, ray.direction * RAY_LENGTH, Color.red);
Debug.Log("着地");
}
isGround = true;
}
else
{
if (SystemConfig.Debug.ViewRayCast)
{
// 想定外
Debug.DrawRay(ray.origin, ray.direction * RAY_LENGTH, Color.red);
}
}
}
else
{
if (SystemConfig.Debug.ViewRayCast)
{
Debug.DrawRay(ray.origin, ray.direction * RAY_LENGTH, Color.green);
}
}
}