1

I want my character to stop everytime I hit the edge of the screen/canvas, so I added some rectangle at the end of each border(with a 2d collider), so my character will collide with it and stop moving in that direction, but the thing is that if, for example, I hit the left rectangle and I still press A to move left, my character strarts 'shaking'. I tried to solve that by setting the speed of it to 0 when it hits the certain rectangle, but then I cant move at all in any directions after I get to the edge.

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;
    }
}

}

4

3 回答 3

1

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

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

就像是

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

希望这可以帮助。

于 2018-12-30T17:52:08.333 回答
1

尝试在角色与侧面碰撞时禁用单个输入,这样您可以在触摸侧面后移动到另一侧,而不是将速度设置为 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 值。

希望能帮助到你

于 2018-12-31T19:23:35.237 回答
1

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

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

不在屏幕上。如果是,您应该将您的 deltaPos 夹到与屏幕边框的距离。

于 2018-12-30T18:04:11.303 回答