因此,在 3D 游戏中,我使用 .AddForce(dashForce, ForceMode.Impulse) 来计算和执行 Dash-Function(它的工作方式非常神奇)。然而,当我将我所知道的一切转化为 2D 世界时(因此使用 Vector2 dashForce 并使用 ForceMode2D),有些东西无法正常工作。
public class NewBehaviourScript : MonoBehaviour
{
[Header ("Running Values and bools")]
private float vertical;
private float horizontal;
private float speed = 10f;
private bool isFacingRight = true;
[Header("Sprint")]
private bool canSprint = true;
public float sprintFactor = 5f;
[SerializeField] private Rigidbody2D rb;
[SerializeField] private Transform groundCheck;
[SerializeField] private LayerMask hakenCheck;
[SerializeField] private LayerMask groundLayer;
[Header("Dash Mechanic")]
private bool canDash = true;
private bool isDashing = false;
public float DashCoolDown = 1f;
public float DashDuration = 1f;
private float DashFactorFront = 8f;
[SerializeField] TrailRenderer tr;
private void Start()
{
rb = GetComponent<Rigidbody2D>();
}
void Update()
{
if (canDash && !isDashing && Input.GetKey(KeyCode.C))
{
StartCoroutine(Dash());
}
}
private void FixedUpdate()
{
float horizontal = Input.GetAxisRaw("Horizontal");
float vertical = Input.GetAxisRaw("Vertical");
rb.velocity = new Vector2(horizontal, vertical).normalized * speed;
//sprinting - tr emitting
if (canSprint == true && Input.GetKey(KeyCode.LeftShift))
{
rb.velocity = new Vector2(horizontal, vertical).normalized * speed * sprintFactor ;
}
}
private IEnumerator Dash()
{
Debug.Log("Dash");
canDash = false;
isDashing = true;
if (rb.velocity.x > rb.velocity.y || rb.velocity.x == rb.velocity.y)
{
Vector2 dashForce = rb.transform.right * DashFactorFront;
rb.AddForce(dashForce, ForceMode2D.Impulse);
yield return new WaitForSeconds(DashDuration);
isDashing = false;
yield return new WaitForSeconds(DashCoolDown);
canDash = true;
}
else if (rb.velocity.y > rb.velocity.x)
{
Vector2 dashForce = rb.transform.up * DashFactorFront;
rb.AddForce(dashForce, ForceMode2D.Impulse);
yield return new WaitForSeconds(DashDuration);
isDashing = false;
yield return new WaitForSeconds(DashCoolDown);
canDash = true;
}
}
}
到目前为止我所知道的是协程被执行(通过使用 Debug.Log 消息进行测试以及我实现的冷却时间进行检查)。因此,破折号函数/计算似乎有问题/我有一个错误的想法。我什至尝试使用不同的力模式,尽管我认识到似乎只有“力”和“脉冲”(这些都不适合我)。
我认为可能的一件事是,我必须使用空作为玩家内部玩家的子元素,并对空本身施加力,但是,即使我用不同的空尝试了两次,这也还没有解决。对象。所以,到最后我还是不知道这个问题的根源在哪里。在我提供的解决方案中,我只是返回使用 RigidBody 作为所用轴 (x,y) 的源并向它们施加力。
在
FixedUpdate
中,您直接设置 Rigidbody
的速度,这会撤消您在 Dash
中进行的任何力设置。从表面上看,您正在尝试限制 Rigidbody
可以移动的最大速度,请通过调用以下命令尝试此操作:
rb.velocity = Vector2.ClampMagnitude(rb.velocity, YOUR_MAX_SPEED);
而不是你拥有的:
rb.velocity = new Vector2(horizontal, vertical).normalized * speed;
顺便说一句,您也根本没有使用您的字段
vertical
、horizontal
和 isFacingRight
。目前您有:
float horizontal = Input.GetAxisRaw("Horizontal");
float vertical = Input.GetAxisRaw("Vertical");
如果玩家掉落或被另一个人推挤,会将玩家冻结在空中
RigidBody
/Collider2D
。
希望这有帮助!