我正在开发一个2D平台(使用Unity和新的输入系统),并试图实现一个破折号(类似于空心骑士/塞莱斯特)。破折号应该推动玩家水平向前(取决于玩家面对的位置),只能在跳跃时激活。
然而,Dash似乎并没有在游戏测试中发挥作用。
当我尝试跳跃和短跑时,玩家只以与跑步速度相同的速度水平向前移动。协程中的其他一切似乎都工作正常(包括TrailRenderer)。
冲刺时感觉好像没有增加速度。
这是我的代码:
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using UnityEngine.InputSystem;
public class PlayerMovement : MonoBehaviour
{
//drag and drop the component to the script in the inspector
public Rigidbody2D rb;
public Transform groundCheck;
public LayerMask groundLayer;
public Animator myAnimator;
public ParticleSystem dust;
//this will make the public float accessible in the inspector
private float horizontal;
public float speed = 8f;
public float jumpingPower = 16f;
private bool isFacingRight = true;
//coyote time
public float coyoteTime = 0.1f;
private float coyoteTimeCounter;
//Dash goes here
bool canDash = true;
bool isDashing;
[SerializeField] float dashForce = 30f;
[SerializeField] float dashTime = 0.2f;
[SerializeField] float dashCooldown = 1f;
[SerializeField] TrailRenderer dashTrail;
//Dash Ends here
void Start()
{
canDash = true;
}
void Update()
{
if (IsGrounded())
{
coyoteTimeCounter = coyoteTime;
}
else
{
coyoteTimeCounter -= Time.deltaTime;
}
if (!isFacingRight && horizontal > 0f)
{
Flip();
}
else if (isFacingRight && horizontal < 0f)
{
Flip();
}
if (isDashing)
{
return;
}
//Falling();
}
private void FixedUpdate()
{
rb.velocity = new Vector2(horizontal * speed, rb.velocity.y);
if (isDashing)
{
return;
}
}
public void Move(InputAction.CallbackContext context)
{
horizontal = context.ReadValue<Vector2>().x;
if (Mathf.Abs(horizontal) > 0f)
{
myAnimator.SetBool("isRunning", true);
}
else
{
myAnimator.SetBool("isRunning", false);
}
}
public void Jump(InputAction.CallbackContext context)
{
if (context.performed && coyoteTimeCounter > 0f)
{
CreateDust();
rb.velocity = new Vector2(rb.velocity.x, jumpingPower);
}
if (context.canceled && rb.velocity.y > 0f)
{
rb.velocity = new Vector2(rb.velocity.x, rb.velocity.y * 0.5f);
coyoteTimeCounter = 0f;
}
}
private bool IsGrounded()
{
return Physics2D.OverlapCircle(groundCheck.position, 0.5f, groundLayer);
}
private void Flip()
{
CreateDust();
isFacingRight = !isFacingRight;
Vector3 localScale = transform.localScale;
localScale.x *= -1f;
transform.localScale = localScale;
}
public void Dash(InputAction.CallbackContext context)
{
if (context.performed && canDash && !IsGrounded())
{
StartCoroutine(Dash());
}
}
private IEnumerator Dash()
{
canDash = false;
isDashing = true;
float originalGravity = rb.gravityScale;
rb.gravityScale = 0f;
rb.velocity = new Vector2(transform.localScale.x * dashForce, 0f); //issue? feels like the player isnt speeding up
dashTrail.emitting = true;
yield return new WaitForSeconds(dashTime);
dashTrail.emitting = false;
rb.gravityScale = originalGravity;
isDashing = false;
yield return new WaitForSeconds (dashCooldown);
canDash = true;
}
void CreateDust()
{
dust.Play();
}
}
我猜错误是由于协程中的这一行,但我不确定用什么来替换它:
rb.velocity = new Vector2(transform.localScale.x * dashForce, 0f);
希望这是有意义的。这是我第一次在Unity项目上工作,我正在Udemy和Youtube上学习教程-但我似乎找不到这个问题的答案。任何帮助都很感激!
1条答案
按热度按时间h5qlskok1#
是的,你只是用一个全新的速度向量替换了现有的速度向量,因此没有考虑之前设置的任何东西。
这种情况表明,为什么选择Unity clearly says:
在大多数情况下,不应直接修改速度,因为这可能导致不切实际的行为-请改用AddForce。
通过计算速度而不是力和方向,人们很容易陷入陷阱,在计算中犯一个小错误,这将毁了一切,此外还失去了物理引擎的好处,在其一边以正确的方式处理运动。任何中断这样复杂的机器将导致不自然的感觉行为放在第一位,许多不必要的影响第二和第三位。
所以,总结一下:如果你使用向量,通常它足以构造他们一次(从输入),然后只变换-规范化,乘法,反转,旋转(四元数 * 向量3)如果需要,削减未使用的轴为2D和高兴的是,有零毛刺的一面。
希望我能帮到你。保持棒极了:)