Как остановить моего персонажа за кадром? - PullRequest
0 голосов
/ 30 декабря 2018

Я хочу, чтобы мой персонаж останавливался каждый раз, когда я ударяю по краю экрана / холста, поэтому я добавил некоторый прямоугольник в конце каждой границы (с помощью двухмерного коллайдера), чтобы мой персонаж столкнулся с ним и прекратил двигаться в этомнаправление, но дело в том, что если, например, я нажму левый прямоугольник и все еще нажимаю 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 голосов
/ 30 декабря 2018

Трясение происходит, потому что вы просто помещаете своего персонажа в коллайдер границы, а физика пытается вернуть его обратно.Я не очень люблю полагаться на коллайдеры в подобных случаях.Допустим, вы установили для своего персонажа очень высокую скорость, или ваши кадры упали, и ваш персонаж может появиться на другой стороне коллайдера или, по крайней мере, ваше дрожание произойдет снова.Что я хотел бы сделать, это проверить, если точка:

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

вне экрана.Если это так, вы должны закрепить свои deltaPos на расстоянии до границы экрана.

0 голосов
/ 31 декабря 2018

Попробуйте отключить отдельные входы, когда персонаж сталкивается с боков, так что вы можете перейти на другую сторону после прикосновения к сторонам, вместо установки скорости на 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 края экрана.

Надеюсь, это поможет

0 голосов
/ 30 декабря 2018

Я не знаком с методами монофонического поведения, но думаю, что проблема в том, что когда вы равны краю, оно остается верным для следующего обновления.Поскольку ничто не делает его ложным, скорость остается равной 0.

Попробуйте поставить проверку в своем методе обновления для каждой нажатой клавиши.

Что-то вроде

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

Надеюсь, это поможет.

...