Unity Rigidbody2d.addforce не изменит направление после применения силы - PullRequest
1 голос
/ 18 октября 2019

Возникла проблема, когда 2D-игра (пробел) Я пытаюсь переместить игрока, используя RB2D с addforce. Кажется, я могу выбрать два направления одновременно. Если я нажимаю вниз, проигрыватель падает, но при нажатии вверх он не поднимается, а останавливается. То же самое с левой / правой. Гравитация установлена ​​в 0. Оба объекта имеют жесткое тело2d, и мне нужна динамика, чтобы позволить "подпрыгивать" и другую физику в игре.

  • Всегда присутствует объект (скрипт движения)
    • Спрайт игрока (спрайт)

Я хочу, чтобы игрок былвозможность двигаться вверх, вниз, влево, вправо. Я действительно согласен с медленным, но не обязательным эффектом. (Если вы отпустите клавиши, это замедлится из-за трения) enter image description here

Мой проигрыватель настроен на многоуровневый формат, так как это многопользовательский режим, и родительский объект всегда находится вgame.

Я попробовал следующее: - Обмен Dynamic + Kinematic на обоих или по одному на каждом. -Добавление силы, трансформации, скорости и т. Д. -Настроенные трения, перетаскивания и т. Д. -Проверенные отладочные силы x / y применяются в игре, но игрок не будет двигаться в противоположном направлении после первого движения.

Я загрузилфайлы для github здесь.

Движение игрока

using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using UnityEngine.Networking;

public class PlayerUnit : NetworkBehaviour {
    //float speed = .5F;
    float rotationSpeed = 50.0F;

    float xMin;
    float xMax;
    float yMin;
    float yMax;
    // configuration parameters
    [Header("Player")]
    [SerializeField] float moveSpeed = .5f;
    [SerializeField] float padding = 1f;
    [SerializeField] int health = 200;
    [SerializeField] AudioClip deathSound;
    [SerializeField] [Range(0, 1)] float deathSoundVolume = 0.75f;
    [SerializeField] AudioClip shootSound;
    [SerializeField] [Range(0, 1)] float shootSoundVolume = 0.25f;

    Rigidbody2D rb;

    void Start () {
       rb = this.GetComponent<Rigidbody2D>();
    }


    void Update () {

        if( hasAuthority == false )
        {
            return;
        }
        if ( Input.GetKeyDown(KeyCode.Space) )
        {
            this.transform.Translate( 0, 1, 0 );
        }     
    }

    private void FixedUpdate()
    {
        if (true)
        {
            float leftright = Input.GetAxis("Horizontal");
            float updown = Input.GetAxis("Vertical");
            float xForce = leftright * moveSpeed * Time.deltaTime;
            float yForce = updown * moveSpeed * Time.deltaTime;
            Vector2 force = new Vector2(xForce, yForce);

            rb.AddForce(force);
            Debug.Log("xForce : " + xForce + "      yForce : " + yForce);

            //float leftright = Input.GetAxis("Horizontal") * moveSpeed;
            //float updown = Input.GetAxis("Vertical") * moveSpeed;
            ////rb.MovePosition(rb.position + new Vector2(1, 0) * leftright);
            //rb.MovePosition(transform.position + (transform.right * leftright + transform.up * updown) * moveSpeed);

            //rb.MovePosition(rb.position + new Vector2(0, 1) * updown);
        }
    }
}

enter image description here

enter image description here

enter image description here

1 Ответ

1 голос
/ 20 октября 2019

Ваш код в порядке, вам просто нужно удалить Rigidbody2D на дочернем элементе PlayerParentObject. Единственный Rigidbody2D на игроке должен находиться в том же игровом объекте, что и сценарий Player Unit.

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