如何阻止我的角色离开屏幕?

How to stop my character going off-screen?

我希望我的角色在每次碰到 screen/canvas 的边缘时停止,所以我在每个边界的末端添加了一些矩形(使用 2d 碰撞器),这样我的角色就​​会与它碰撞并且停止朝那个方向移动,但问题是,例如,如果我点击左侧矩形并且我仍然按 A 键向左移动,我的角色开始 'shaking'。我试图通过在它碰到某个矩形时将它的速度设置为 0 来解决这个问题,但是当我到达边缘后我无法向任何方向移动。

public class CharacterMovement : MonoBehaviour {

public float speed = 5f;



void Start() {


}


void Update() {
    if (Input.GetKey(KeyCode.W))
    {
        transform.Translate(0, speed * Time.deltaTime, 0);
    }
    if (Input.GetKey(KeyCode.S))
    {
        transform.Translate(0, -speed * Time.deltaTime, 0);
    }
    if (Input.GetKey(KeyCode.A))
    {
        transform.Translate(-speed * Time.deltaTime, 0, 0);
    }
    if (Input.GetKey(KeyCode.D))
    {
        transform.Translate(speed * Time.deltaTime, 0, 0);
    }
}


void OnCollisionEnter2D(Collision2D col)
{
    if (col.gameObject.name == "offscreen")
    {
        speed = 0f;
    }else
    {
        speed = 5f;
    }
}

}

我不熟悉单声道行为方法,但我认为问题在于当您等于边缘时它在下一次更新中保持为真。由于没有任何东西使它为假,因此速度保持为 0。

尝试在您的更新方法中检查每个按下的键。

类似于

if (key ==moveleft)
{
    if(sprite.leftedge>edgeoftheleftscreen+1)
         Sprite.moveleft();   
}
if(key==moveright)
{
    if(sprite.rightedge<edgeoftherightscreen-1)
         Sprite.moveright();
}

希望对您有所帮助。

摇晃发生了,因为你只是把你的角色放在边界的碰撞器中,而物理正试图把他带回来。 在这种情况下,我不太喜欢依赖对撞机。假设您将您的角色设置得非常高或者您的帧丢失并且您的角色可能出现在您的对撞机的另一侧或者至少您的摇晃会再次发生。我要做的是检查是否点:

deltaPos = speed * Time.deltaTime
transform.position + deltaPos

在屏幕外。如果是,您应该将 deltaPos 限制在与屏幕边框的距离。

尝试在角色与侧面碰撞时禁用各个输入,这样您就可以在接触侧面后移动到另一侧,而不是将速度设置为 0。

你现在遇到的问题是,当你和侧面发生碰撞时,你还在碰到侧面的时候将速度设置为0,并且你不能从你不断碰到的侧面移开,因为速度为0.

public class CharacterMovement : MonoBehaviour {

    public float speed = 5f;

    public bool touchingLeft;
    public bool touchingRight;


    void Start() {


    }


    void Update() {
        if (Input.GetKey(KeyCode.W))
        {
            transform.Translate(0, speed * Time.deltaTime, 0);
        }
        if (Input.GetKey(KeyCode.S))
        {
            transform.Translate(0, -speed * Time.deltaTime, 0);
        }
        if (Input.GetKey(KeyCode.A) && !touchingLeft)
        {
            transform.Translate(-speed * Time.deltaTime, 0, 0);

            touchingRight = false;
        }
        if (Input.GetKey(KeyCode.D) && !touchingRight)
        {
            transform.Translate(speed * Time.deltaTime, 0, 0);

            touchingLeft = false;
        }
    }


    void OnCollisionEnter2D(Collision2D col)
    {
        if (col.gameObject.name == "leftOffscreen")
        {
            touchingLeft = true;
        } 

        if else (col.gameObject.name == "rightOffscreen")
        {
            touchingRight = true;
        }
    }
}

不过,还有更有效的方法可以做到这一点,但我觉得这与您现有的代码配合得很好。

如果屏幕调整大小,您可能希望将播放器的 x 值固定到屏幕边缘的 x 值。

希望对您有所帮助