есть ли альтернатива для addforce, если я хочу использовать кинематическую - PullRequest
0 голосов
/ 18 апреля 2019

Я хочу сыграть в понг, но мой мяч летит не так, как я хочу. На мой мяч влияет гравитация. Я знаю, что мне нужно установить тип телосложения от dynamic до kinematic, но если я использую kinematic, мой шар больше не движется, потому что мой шар летит с addforce. Какую силу я могу использовать, чтобы я мог kinematic использовать?

public class BallPhysics : MonoBehaviour {

public Rigidbody2D rbBall;
public float SpeedX = 10.0f;
public float SpeedY = 5.0f;

void FixedUpdate()
{
    rbBall.AddForce(new Vector2(SpeedX, SpeedY)); // my ball is flying
}

void OnCollisionEnter2D(Collision2D collisionInfo) // collision for the walls
{
    if (collisionInfo.collider.tag == "wall")
    {
        SpeedX = -SpeedX;
        SpeedY = -SpeedY;
    }
}

}

1 Ответ

3 голосов
/ 18 апреля 2019

Нет useGravity в RigidBody2D, но вы можете просто оставить IsKinematic отключенным, а также отключить его gravityScale

private void Start()
{
    rbBall.gravityScale = 0;
}

, это имеет тот же эффекткак отключение useGravity на RigidBody.Особенно в контексте вашего вопроса мне очень нравится примечание:

может быть проще реализовать летающего персонажа, отключив его гравитацию, чем симулируя силы, которые удерживают его в воздухе.

;)


или альтернативно отключить гравитацию для всей сцены / проекта, используя Physics2D.gravity

private void Start()
{
    Physics2D.gravity = Vector2.zero;
}

К вопросусамо по себе

Есть ли альтернатива для addforce, если я хочу использовать кинематическую?

Нет и да ...

С RigidBody2D.isKinematic

Если это твердое тело будет выведено из-под контроля физики?

Если это свойство установлено в значение true, то твердое тело перестанет реагировать на столкновения и приложенные силы.Это может быть полезно, когда объектом обычно нужно управлять "кинематически" (то есть, не физически), но тогда иногда требуется физика для реализма.Например, человеческий характер обычно не реализуется с помощью физики, но иногда может быть выброшен в воздух и сталкиваться с объектами в результате удара или взрыва.

Или также из Rigidbody.isKinematic

Если включено isKinematic, силы, столкновения или соединения больше не будут влиять на твердое тело.Твердое тело будет полностью контролироваться анимацией или скриптом, если изменить transform.position.

Так что просто используйте

transform.position = ...

как обычно.


Для получения чего-то похожего на AddForce вы можете сохранить локальный вектор скорости идобавьте больше скорости, например

// public so you can also configure 
// it in the inspector or set it from another script
public Vector2 speed;

public void AddForce(Vector2 force)
{
    speed += force;
}

private void Update()
{
    transform.position += speed * Time.deltaTime;
}

Однако в вашем случае вы не хотите добавлять скорость каждому кадру, а, вероятно, устанавливаете определенную скорость только один раз при запуске и при столкновениях.

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