C# Unity玩家移动脚本无法正常工作

C# Unity玩家移动脚本无法正常工作,c#,unity3d,C#,Unity3d,这是一个非常广泛的问题 我正在做一个2d侧滚平台游戏,我刚刚制作了玩家移动脚本。然而,当玩家在空中向左或向右移动时撞到墙时,玩家只是停留在那里,不会摔倒 这说明发生了什么 这是我的玩家移动脚本代码: using System; using System.Collections; using System.Collections.Generic; using UnityEngine; public class Character : MonoBehaviour { private Ri

这是一个非常广泛的问题

我正在做一个2d侧滚平台游戏,我刚刚制作了玩家移动脚本。然而,当玩家在空中向左或向右移动时撞到墙时,玩家只是停留在那里,不会摔倒

这说明发生了什么

这是我的玩家移动脚本代码:

using System;
using System.Collections;
using System.Collections.Generic;
using UnityEngine;

public class Character : MonoBehaviour
{

    private Rigidbody2D rb;
    private Animator anim;
    private float moveSpeed;
    private float dirX;
    public bool facingRight = true;
    private Vector3 localScale;

    // Start is called before the first frame update
    private void Start()
    {
        rb = GetComponent<Rigidbody2D>();
        anim = GetComponent<Animator>();
        localScale = transform.localScale;
        moveSpeed = 5f;
    }

    // Update is called once per frame
    private void Update()
    {
        dirX = Input.GetAxisRaw("Horizontal") * moveSpeed;

        if (Input.GetButtonDown("Jump") && rb.velocity.y == 0)
        {
            rb.AddForce(Vector2.up * 350f);
        }

        if (Math.Abs(dirX) > 0 && rb.velocity.y == 0)
        {
            anim.SetBool("isRunning", true);
        }
        else
        {
            anim.SetBool("isRunning", false);
        }

        if (rb.velocity.y == 0)
        {
            anim.SetBool("isJumping", false);
            anim.SetBool("isFalling", false);
        }

        if (rb.velocity.y > 0)
        {
            anim.SetBool("isJumping", true);
        }

        if (rb.velocity.y < 0)
        {
            anim.SetBool("isJumping", false);
            anim.SetBool("isFalling", true);
        }
    }

    private void FixedUpdate()
    {
        rb.velocity = new Vector2(dirX, rb.velocity.y);
    }

    private void LateUpdate()
    {
        if (dirX > 0)
        {
            facingRight = true;
        }
        else if (dirX < 0)
        {
            facingRight = false;
        }

        if (((facingRight) && (localScale.x < 0)) || ((!facingRight) && (localScale.x > 0)))
        {
            localScale.x *= -1;
        }

        transform.localScale = localScale;
    }
}
但这只会让它更疯狂


有人能帮我吗?(请不要烘烤)

与游戏对象关联的碰撞器可能有问题。如果你只有一个矩形,那就不应该是它。如果您使用的是自定义重力,那么问题可能是您正在或unity正在重置重力撞击墙壁时的重力。你可以换个标签什么的。我不是unity2d方面的专家,但我希望这能有所帮助。

问题很可能是你的角色与墙壁相撞,而它们都是物理对象。当两个物体相互碰撞时,当两个表面相互摩擦时,一种反应就是摩擦

一种解决方案是通过将摩擦力设置为0.0f,为玩家增加滑球

我使用的这个解决方案的一个修改版本是在对象上创建一个碰撞器的副本,它具有光滑的材质,同时保持基本材质不变。然后让这个新的对撞机稍微宽一点但短一点。对于任何水平碰撞,将使用光滑材料,但对于垂直碰撞,将使用具有摩擦力的原始材料。这意味着当你在斜坡上或地面上行走时,你的球员会有摩擦力,但当你行走或跳入墙壁时,你不会有摩擦力

我刚刚了解的另一个解决方案是。使用此组件,您可以设置对象的摩擦力,使其取决于您从哪一侧撞击对象。我相信要使其工作,您只需选中碰撞器上的一个框,以供效应器使用,添加组件,然后选中平台效应器上名为
Use Side Friction
的bool

如果您在实施任一解决方案时遇到问题,请告诉我。我可以尝试提供更多的细节,或者可能得到一些截图

if ((Math.Abs(dirX) == 5 && Input.GetAxisRaw("Horizontal") == 1 && rb.velocity.y == 0) || (Math.Abs(dirX) == -5 && Input.GetAxisRaw("Horizontal") == -1 && rb.velocity.y == 0))
        {
            anim.SetBool("isFalling", true);
            dirX = 0;
        }