运动系统和短跑不协同工作-统一



我一直在努力学习使用统一,对我来说最困难的部分是学习编程。我正在尝试创建一个简单的2d自上而下的游戏。我的角色有一个坚实的运动系统,而不是那么坚实的破折号。但问题是,这两件事不想协同工作。我的角色可以在激活完整代码的情况下四处走动,但不能使用破折号。如果我删除了保证更改的行,仪表板就会神奇地开始工作。

我要把我的代码粘贴在这里:

public class Player_movement : MonoBehaviour
{
public float moveSpeed;
public Rigidbody2D rb;
public float DashSpeed;
private float DashTime;
public float startDashTime;
private int direction;
Vector2 movement;
void Start()
{rb = GetComponent<Rigidbody2D>();
DashTime = startDashTime;   
}
void Update()
{
movement.x = Input.GetAxisRaw("Horizontal");
movement.y = Input.GetAxisRaw("Vertical");
if(direction == 0)
{

if(Input.GetKeyDown(KeyCode.LeftArrow)){
direction = 1;
}else if(Input.GetKeyDown(KeyCode.RightArrow)){
direction = 2;
}else if(Input.GetKeyDown(KeyCode.UpArrow)){
direction = 3;
}else if(Input.GetKeyDown(KeyCode.DownArrow)){
direction = 4;
}

}
else 
{
if(DashTime <= 0){
direction = 0;
DashTime = startDashTime;
rb.velocity = Vector2.zero;}
else
{
DashTime -= Time.deltaTime;
{

if(direction == 1){
rb.velocity = Vector2.left * DashSpeed;
}else if(direction == 2){
rb.velocity = Vector2.right * DashSpeed;
}else if(direction == 3){
rb.velocity = Vector2.up * DashSpeed;
}else if(direction == 4){
rb.velocity = Vector2.down * DashSpeed;
}
}

}    
}  
}
void FixedUpdate()
{
rb.MovePosition(rb.position + movement * moveSpeed * Time.fixedDeltaTime);
}
}

正如我所说,如果我去掉rb。MovePosition,仪表板开始工作。我试着换rb。将Position移动到rb.velocity,但破折号仍然不起作用。我试着交换最后一行的每一个组件,但都没有成功。我真的没有主意了,有人能告诉我我做错了什么吗,或者为什么这不兼容?提前感谢

在刚体上调用MovePosition就像一个覆盖,强制将刚体插值到您给定的位置。因此,刚体不会对其他运动做出响应,例如使用速度的短划线。

解决这个问题的一个简单方法是在你像一样奔跑时设置一个bool

isDashing = true;

然后在你的固定更新中,只有在你没有像那样冲锋陷阵的情况下,你才能做你的移动位置

if (!isDashing) {
rb.MovePosition(rb.position + movement * moveSpeed * Time.fixedDeltaTime);
}

这样,你就可以在冲刺时使用基于速度的移动,在不冲刺时使用MovePosition的移动。

只需记住在短划线结束时将isDashing变量设置为false,这样控制权就会传递回移动代码。

最新更新