#c# #unity3d
#c# #unity3d
Вопрос:
Я создаю 2D-платформер с Unity. Я хочу, чтобы моя игра поддерживала как клавиатуру, так и геймпад, поэтому я использую новую систему ввода и компонент ввода игрока. Моя проблема в том, что когда я нажимаю кнопку перехода, player не прыгает должным образом. Фактически, он прыгает, когда начинается игра, но после этого он больше не может прыгать и просто движется вверх на небольшой высоте. Я свернул окно игры и нажал play и обнаружил, что после первого прыжка значение силы прыжка автоматически изменяется с 300 на 1. Я хочу знать, почему это происходит и как я могу это исправить. Заранее спасибо.
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using UnityEngine.InputSystem;
public class PlayerController : MonoBehaviour, PlayerInputActions.IPlayerActions
{
private PlayerInputActions controls;
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>();
}
void PlayerInputActions.IPlayerActions.OnJump(InputAction.CallbackContext context)
{
jumpForce = context.ReadValue<float>();
switch (context.phase)
{
case InputActionPhase.Performed:
this.Jump();
break;
}
}
void PlayerInputActions.IPlayerActions.OnShoot(InputAction.CallbackContext context)
{
}
public void Jump()
{
rb.AddForce(Vector2.up * this.jumpForce, ForceMode2D.Force) ;
}
void FixedUpdate()
{
if(facingRight == false amp;amp; moveInput.x > 0){
Flip();
}else if (facingRight == true amp;amp; 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);
GroundedRemember -= Time.deltaTime;
if (Grounded)
{
GroundedRemember = GroundedRememberTime;
}
JumpPressedRemember -= Time.deltaTime;
if (controls.Player.Jump.triggered)
{
JumpPressedRemember = JumpPressedRememberTime;
}
if (controls.Player.Jump.triggered)
{
if (rb.velocity.y > 0)
{
rb.velocity = new Vector2(rb.velocity.x, rb.velocity.y * JumpHeight);
}
}
if ((JumpPressedRemember > 0) amp;amp; (GroundedRemember > 0))
{
JumpPressedRemember = 0;
GroundedRemember = 0;
rb.velocity = new Vector2(rb.velocity.x, jumpForce);
}
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. Я полагаю, вы имеете в виду
jumpForce
изменение. Возможно ли, что значение, которое вы читаете, нормализуется между 0 и 1? Вы можете попробовать сделать силу прыжка постоянной и умножить ее на это значение.2. Да, я имел в виду jumpForce. Не могли бы вы быть более конкретными или показать это в коде?
Ответ №1:
Я прочитал ваш сценарий, я не знаю всех функциональных возможностей всех других сценариев, но я думаю, что нашел вашу проблему:
void PlayerInputActions.IPlayerActions.OnJump(InputAction.CallbackContext context)
{
jumpForce = context.ReadValue<float>(); <-- HERE you set your jumpforce to something!!!
switch (context.phase)
{
case InputActionPhase.Performed:
this.Jump();
break;
}
}
Комментарии:
1. Спасибо за ваш ответ. Я пробовал то, что вы сказали, но когда я пишу любое число в круглых скобках, возникает ошибка «Нет перегрузки для метода ‘readValue’ принимает 1 аргумент [Assembly-CSharp] «.
2. да, я думаю, вам нужно полностью удалить эту строку и повторить попытку.
3. Если я удаляю эту строку, игрок выпрыгивает из экрана. Это не очень хорошая идея. Возможно, есть что-то, что мне нужно изменить, но я не знаю, что это такое.
4. это странно, потому что вы используете context.ReadLine . но, к сожалению, я не знаю, в чем тогда проблема