#c# #unity3d
#c# #unity3d
Вопрос:
Я хочу сделать игру в понг, но мой мяч летит не так, как я хочу. На мой мяч воздействует гравитация. Я знаю, что мне нужно установить тип корпуса от 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. Какова настройка
Use Gravity
дляRigidbody
компонента вашего шара?2. Я использую
rigidbody2D
so, нетUse Gravity
режима
Ответ №1:
Нет useGravity
, RigidBody2D
но вы можете просто оставить IsKinematic
отключенным, а также отключить его gravityScale
private void Start()
{
rbBall.gravityScale = 0;
}
это имеет тот же эффект, что и отключение useGravity
на a RigidBody
. Особенно в контексте вашего вопроса мне очень нравится примечание
может быть проще реализовать летающего персонажа, отключив его гравитацию, а не имитируя силы, которые удерживают его в воздухе.
😉
или, в качестве альтернативы, отключить гравитацию для всей сцены / проекта, используя Physics2D.gravity
private void Start()
{
Physics2D.gravity = Vector2.zero;
}
К самому вопросу
Есть ли альтернатива addforce, если я хочу использовать kinematic?
Нет и да…
Должно ли это жесткое тело быть выведено из-под контроля физики?
Если для этого свойства установлено значение 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;
}
Однако в вашем случае вы не хотите увеличивать скорость каждого кадра, а, вероятно, устанавливаете определенную скорость только один раз при запуске и при столкновениях.
Комментарии:
1. спасибо, Хьюго, мне нужно было кое-что адаптировать, но это сработало, <3