C# 在Unity中,如何在碰到对角线时自动沿对角线滑动?

C# 在Unity中,如何在碰到对角线时自动沿对角线滑动?,c#,unity3d,2d,C#,Unity3d,2d,所以,我开始了一个自上而下的2D RPG类游戏,自由形式的运动,而不是大网格特定的运动。我看到一个“基本的家伙在屏幕上移动,与一个tilemap相撞”。然而,当我用对角对撞机撞到一块瓷砖时,我减速了 我似乎在这样做: 当我应该这样做时: 我的代码非常简单。在互联网上搜索了一天的大部分时间后,我想出了这个不起作用的解决方案 void FixedUpdate() { float moveHorizontal = Input.GetAxisRaw("Horizontal"); floa

所以,我开始了一个自上而下的2D RPG类游戏,自由形式的运动,而不是大网格特定的运动。我看到一个“基本的家伙在屏幕上移动,与一个tilemap相撞”。然而,当我用对角对撞机撞到一块瓷砖时,我减速了

我似乎在这样做:

当我应该这样做时:

我的代码非常简单。在互联网上搜索了一天的大部分时间后,我想出了这个不起作用的解决方案

void FixedUpdate()
{
    float moveHorizontal = Input.GetAxisRaw("Horizontal");
    float moveVertical = Input.GetAxisRaw("Vertical");

    Movement = new Vector2(moveHorizontal, moveVertical);
    Movement.Normalize();
    rigidbody2D.velocity = Movement * Speed;
}


void OnCollisionEnter2D(Collision2D other)
{
    Normal = other.contacts[0].normal;
    rigidbody2D.velocity -= Normal * Vector2.Dot(rigidbody2D.velocity, Normal);
}

我做错了什么?我想这是一个相对标准的问题,因为在平台上沿对角线或斜坡滑动在游戏中很常见

我终于解决了这个问题!我的直觉是对的:我想得太多了

步骤1:删除上面的所有代码示例,只需执行以下简单操作:

void FixedUpdate()
{
    float moveHorizontal = Input.GetAxisRaw("Horizontal");
    float moveVertical = Input.GetAxisRaw("Vertical");

    movement = new Vector2(moveHorizontal, moveVertical);
    movement.Normalize();
    rigidbody2D.velocity = movement * Speed;
} 
步骤2:在资产文件夹中,转至创建>Physics2DMaterial。创建一个

第三步:点击你的新材料,并称之为任何你想要的。我称之为无摩擦。将“摩擦力”设定为0,并确保“反弹”为0

第4步:将新材质拖动到方程中涉及的任何对象中的任何物理材质二维场


你完了

嗯,我不确定那会有多大帮助。此外,似乎无论我在碰撞时将速度设置为什么,FixeUpdate循环都会覆盖它。