Как я могу решить эту странную ошибку коллайдера в Unity? - PullRequest
1 голос
/ 15 марта 2019

Итак, я новичок в Unity и работаю над 2D-игрой.Здесь у меня только фон, лодка и остров.Проблема в том, что лодка не должна идти под островом.

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

РЕДАКТИРОВАТЬ: Извините, пока нет видео, но здесь полная последовательность: enter image description here

Это скрипт для движения моих лодок, если вам это нужно:

public float moveSpeed;
    private Animator anim;
    private bool playerMovement;
    private Vector2 lastMove;

    // Start is called before the first frame update
    void Start()
    {
        anim = GetComponent<Animator>();
    } 

    // Update is called once per frame
    void Update()
    {
        playerMovement = false;
        if (Input.GetAxisRaw("Horizontal") > 0.5f || Input.GetAxisRaw("Horizontal") < -0.5f) {
            transform.Translate(new Vector3(Input.GetAxisRaw("Horizontal") * moveSpeed * Time.deltaTime,0f,0f));
            playerMovement = true;
            lastMove = new Vector2(Input.GetAxisRaw("Horizontal"), 0f);
        }

        if (Input.GetAxisRaw("Vertical") > 0.5f || Input.GetAxisRaw("Vertical") < -0.5f)
        {
            transform.Translate(new Vector3(0f, Input.GetAxisRaw("Vertical") * moveSpeed * Time.deltaTime, 0f));
            playerMovement = true;
            lastMove = new Vector2(0f, Input.GetAxisRaw("Vertical"));
        }
        anim.SetFloat("MoveX", Input.GetAxisRaw("Horizontal"));
        anim.SetFloat("MoveY", Input.GetAxisRaw("Vertical"));
        anim.SetBool("PlayerMoving", playerMovement);
        anim.SetFloat("LastMoveX", lastMove.x);
        anim.SetFloat("LastMoveY", lastMove.y);
    }

Аниматор - enter image description here

Ответы [ 3 ]

0 голосов
/ 16 марта 2019

Измените sortingLayerName на то, что вы хотите.

myCanvasObject.GetComponent(Canvas).sortingLayerName="mySortingLayer";

Вы также можете сделать это в редакторе Unity.

enter image description here

0 голосов
/ 16 марта 2019

Чтобы применить физику, вы должны использовать Rigidbody2D вместо Transform.

Вместо использования transform.Translate() для перемещения корабля используйте Rigidbody2D.velocity вместо.

В начале вы можете получить Rigidbody2D, как вы получаете Animator, выполнив:

rb = gameObject.GetComponent<Rigidbody2D>();

Затем вы можете установить его скорость в зависимости отinput:

rb.velocity = new Vector2(
    Input.GetAxisRaw("Horizontal") * moveSpeed,
    Input.GetAxisRaw("Vertical") * moveSpeed);

Также убедитесь, что для твердого тела не установлено значение Kinematic (в отличие от того, что предлагалось в предыдущем ответе).

0 голосов
/ 16 марта 2019

Я думаю, что у вас странное поведение, потому что вы пытаетесь контролировать свой объект с помощью анимации и физики.Всякий раз, когда вы попадаете на коллайдер, симулятор физики прерывается аниматором.Вы можете попробовать изменить Rigidbody2D BodyType на Kinematic:

enter image description here

В любом случае, пока анимация / движение вашей лодки настолько простыЛучше управлять движением с помощью физики, а не аниматора.Используйте аниматор для анимации, такой как взрыв, затопление корабля и т. Д., И управляйте положением своего корабля с помощью физики или трансформации.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...