bugfix> unity > 投稿

Unityで2Dプラットフォーマーを作っています。使ったこの コードを書くためのビデオですが、少し変更があります。キーボードとゲームパッドの両方をサポートしたいので、新しい入力システムを使用します。私はという3つの変数を定義しました GroundedRememeberJumpPressedRemember そして JumpPressedRememberTime 基本的にはタイマーのように機能し、プレーヤーが地面を離れるかどうかを確認します。離れている場合、プレーヤーは地面に近づくことなくジャンプできます。これらのタイマーが機能していなかったので、私はという新しいメソッドを追加しました TryJump いくつかの行を削除すると、プレーヤーは宙に浮いて上に移動します。

using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using UnityEngine.InputSystem;
public class PlayerController : MonoBehaviour, PlayerInputActions.IPlayerActions
 {
   private PlayerInputActions controls; 
   [SerializeField] LayerMask groundLayers;     
   private Rigidbody2D rb;
   private Animator anim;
   private bool facingRight = true;
   private Vector2 moveInput;
  [SerializeField] private float jumpForce;
    float JumpPressedRemember = 0;
   
   [SerializeField] float JumpPressedRememberTime = 0.2f;
    float GroundedRemember = 0;
     
   [SerializeField]  float GroundedRememberTime = 0.25f;  
   [SerializeField]  float HorizontalAcceleration = 1;
   [SerializeField] [Range(0, 1)] float HorizontalDampingBasic = 0.5f;
   [SerializeField] [Range(0, 1)] float HorizontalDampingWhenStopping = 0.5f;
   [SerializeField] [Range(0, 1)] float HorizontalDampingWhenTurning = 0.5f;
   [SerializeField] [Range(0, 1)] float JumpHeight = 0.5f;
   private void Awake() 
   {
      controls = new PlayerInputActions();
      controls.Player.SetCallbacks(this);
    }
     void Start()
    {
      rb = GetComponent<Rigidbody2D>();
      anim = GetComponent<Animator>();       
}
   void PlayerInputActions.IPlayerActions.OnMove(InputAction.CallbackContext context)
   {
      moveInput = context.ReadValue<Vector2>();        
   }
     bool TryJump() {
    if (GroundedRemember > 0) {
        Jump();
        return true;
    } else {
        JumpPressedRemember = JumpPressedRememberTime;
        return false;
    }
}
     void PlayerInputActions.IPlayerActions.OnJump(InputAction.CallbackContext context)
   {
       jumpForce = context.ReadValue<float>();
       switch (context.phase) {
            case InputActionPhase.Performed:
               TryJump();
               break;
       }
   }
    void Jump() {
     rb.AddForce(Vector2.up * jumpForce, ForceMode2D.Force);
     GroundedRemember = 0;
     JumpPressedRemember = 0;
   }
 
 
  void FixedUpdate()
  {
   if(facingRight == false && moveInput.x > 0){
   
    Flip();
   
   }else if (facingRight == true && moveInput.x < 0){
    
    Flip();
   }
 }
    void Flip(){
    
    facingRight = !facingRight;
    Vector3 Scaler = transform.localScale;
    Scaler.x *= -1;
    transform.localScale = Scaler;
    
 }  
 void OnEnable()
 {
     controls.Enable();
 }
 
 void OnDisable()
{
    controls.Disable();
}
 void Update()
  {
   Vector2 GroundedBoxCheckPosition = (Vector2)transform.position + new Vector2(0, -0.01f);
   Vector2  GroundedBoxCheckScale = (Vector2)transform.localScale + new Vector2(-0.02f, 0);
   bool Grounded = Physics2D.OverlapBox(GroundedBoxCheckPosition, transform.localScale, 0, groundLayers);
    
    
    JumpPressedRemember -= Time.deltaTime; 
    GroundedRemember -= Time.deltaTime;
   
    if (Grounded)  { 
      GroundedRemember = GroundedRememberTime; 
       }
  
    if ((JumpPressedRemember > 0)) {
      TryJump();
     float HorizontalVelocity = rb.velocity.x;
      HorizontalVelocity += moveInput.x;
          
     if (Mathf.Abs(moveInput.x) < 0.01f)
            HorizontalVelocity *= Mathf.Pow(1f - HorizontalDampingWhenStopping, Time.deltaTime * 10f);
     else if (Mathf.Sign(moveInput.x) != Mathf.Sign(HorizontalVelocity))
           HorizontalVelocity *= Mathf.Pow(1f - HorizontalDampingWhenTurning, Time.deltaTime * 10f);
     else
            HorizontalVelocity *= Mathf.Pow(1f - HorizontalDampingBasic, Time.deltaTime * 10f);
        rb.velocity = new Vector2(HorizontalVelocity, rb.velocity.y);    
  }
}
 }

回答 1 件
  • この行をフレームごとに実行するつもりでしたか?

    rb.velocity = new Vector2(rb.velocity.x, jumpForce);
    
    

    場合 jumpForce がゼロの場合、フレームごとに垂直速度がゼロになるため、重力によってプレーヤーが加速するのを防ぐことで、プレーヤーの落下が遅くなります。 jumpForceがゼロより大きい場合、プレーヤーが上昇する可能性があります。

    この行がStackExchangeにもたらす問題を与える以外に役立つ機能は見当たらないので、削除すると思います。

あなたの答え