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

时间:2018-12-30 17:30:43

标签: c# unity3d collision off-screen

我希望我的角色在每次碰到屏幕/画布的​​边缘时都停下来,所以我在每个边框的末尾添加了一个矩形(带有2d碰撞器),所以我的角色会与它碰撞并停止在其中移动方向,但事实是,例如,如果我击中了左矩形,而我仍然按A向左移动,我的角色就​​会“摇晃”。我试图通过将其碰到某个矩形时将其速度设置为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;
    }
}

}

3 个答案:

答案 0 :(得分:1)

我不熟悉单声道行为方法,但是我认为问题是当您等于边缘时,它对于下一次更新仍然适用。由于没有错误,速度保持为0。

请尝试将选中的每个检查项放入更新方法中。

类似

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

希望这会有所帮助。

答案 1 :(得分:1)

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

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

在屏幕外。如果是这样,则应将deltaPos固定到屏幕边框的距离。

答案 2 :(得分: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值上。

希望有帮助