簡體   English   中英

如何阻止我的角色離開屏幕?

[英]How to stop my character going 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;
    }
}

}

我不熟悉單聲道行為方法,但我認為問題是當你等於邊緣時,它會在下次更新時保持不變。 由於沒有任何東西使它成為假,速度仍為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值。

希望能幫助到你

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM