Принудительный режим работает только на оси Y Unity3D - PullRequest
0 голосов
/ 14 мая 2018

Я изучаю, как использовать Unity3D.

У меня есть эта сцена, где элементами являются два изображения PNG (два черных круга), с которыми я связал свойство Rigidbody (без гравитации).

enter image description here

enter image description here

С помощью скрипта я связал контроллер горизонтальной оси, и он работает: Iможно управлять центральным кругом с помощью клавиатуры.

Теперь я пытаюсь связать постоянную силу.Мой сценарий выглядит следующим образом.Но это работает только вдоль оси Y.Я не могу заставить его работать вдоль горизонтальной оси.

Сценарий:

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

public class CircleController : MonoBehaviour {

    float MaxSpeed = 10f;
    Rigidbody rigid2D;
    public Vector3 tensor;

    // Use this for initialization
    void Start()
    {
        rigid2D = GetComponent<Rigidbody>();
        rigid2D.AddForce(new Vector3(0,10,0), ForceMode.Force);
    }

    // Update is called once per frame
    void FixedUpdate()
    {
        float move = Input.GetAxis("Horizontal");
        rigid2D.velocity = new Vector2(move * MaxSpeed, rigid2D.velocity.y);
    }
}

Может кто-нибудь помочь мне понять, почему я не могу приложить силу вдоль этой оси?

В частности, когда я выполняю сценарий с этой инструкцией: rigid2D.AddForce(new Vector3(0,10,0), ForceMode.Force);, я вижу, что центральный круг движется навстречу другому.Это правильно.

enter image description here

Вместо этого, когда я выполняю его с помощью этой инструкции rigid2D.AddForce(new Vector3(10,0,0), ForceMode.Force);, центральный круг остается неподвижным.

1 Ответ

0 голосов
/ 14 мая 2018

Вы вызываете следующую строку в функции Start (выполняется один раз)

rigid2D.AddForce(new Vector3(10,0,0), ForceMode.Force);

Применяет силу к жесткому телу справа на заданное значение (10). Физический движок вычисляет ускорение для применения к твердому телу и автоматически вычисляет velocity (скорость) и новые позиции каждый кадр.

Однако в FixedUpdate вы вызываете следующие строки

float move = Input.GetAxis("Horizontal");
rigid2D.velocity = new Vector2(move * MaxSpeed, rigid2D.velocity.y);

Здесь вы заставляете скорость движения твердого тела по горизонтальной оси, переопределяя значение, вычисленное физическим движком. Если вы не нажмете кнопки, определенные в Диспетчере ввода, круг останется неподвижным на горизонтальной оси, поскольку move равно 0.


При вызове rigid2D.AddForce(new Vector3(0,10,0), ForceMode.Force); круг перемещается вверх, потому что rigid2D.velocity = new Vector2(move * MaxSpeed, rigid2D.velocity.y); сохраняет скорость на вертикальной оси.

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