2017-01-28 3 views
0

Я пытаюсь создать направленное сопротивление для своей игры, в которой вы управляете парящим космическим кораблем (например, подкраивание от звездных звезд). Перетаскивание, которое уже находится в единстве, не имеет никакого смысла для зависания кораблей, машин и т. Д., Потому что они обычно обтекаются спереди и не являются сторонами. Я плохо разбираюсь в физике, но из-за того, что я знаю, сопротивление увеличивается быстрее. Я написал этот скрипт, но он не работает, объект ускоряется на нем, когда добавляется сила.Как создать направленное сопротивление, изменяя скорость объекта?

public Vector3 dragFactor; 
private Rigidbody _rb; 

void Start() { 
    _rb = GetComponent<Rigidbody>(); 
} 
void FixedUpdate() { 
    Vector3 vel = _rb.velocity; 
    if(vel.x>0) 
     vel.x -= vel.x * dragFactor.x; 
    else 
     vel.x += vel.x * dragFactor.x; 

    if (vel.y > 0) 
     vel.y -= vel.y * dragFactor.y; 
    else 
     vel.y += vel.y * dragFactor.y; 

    if (vel.z > 0) 
     vel.z -= vel.z * dragFactor.z; 
    else 
     vel.z += vel.z * dragFactor.z; 
    _rb.velocity = vel; 
} 

Знаете ли вы, что я делаю неправильно или что можно изменить?

+0

В документах указано, что вы не должны напрямую манипулировать rb.velocity. Вместо этого я бы пошел на rb.AddForce в более или менее суммах, в зависимости от того, чего вы пытаетесь достичь. Я не совсем понимаю, что вы подразумеваете под направленным перетаскиванием, поэтому я не могу привести пример. – Absinthe

+0

@Absinthe Направленное перетаскивание Я имею в виду, что сопротивление должно быть сильнее, когда объект движется, например, вправо, чем когда он движется вперед. –

+0

OK, поэтому вам нужно добавить силы в нужном направлении, поэтому настройте векторы для положительных и отрицательных; если vel.x> ваша целевая rb.AddForce (myNegativeXVector), иначе rb.AddForce (myPositiveXVector) – Absinthe

ответ

1

Перемещение касается площади поверхности. Хотя я не могу дать вам закодированный ответ, так как я сам ищу его, по крайней мере, для углового сопротивления. Таким образом, кажется, что вы это делаете правильно. Я бы сказал, что при ручной перетаскивании также будет влиять перетаскивание по умолчанию объектов. Так что если у вас есть .1, то, что ваше видение в игре vel.x * rb.drag * dragFactor.x , что вы не хотите. Поэтому вам нужно сделать кинематику rb и переместить ее вручную, чтобы естественные силы не применялись к ней.

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

_vel.x - = vel.x * dragFactor.x * Time.fixedDeltaTime

Я нашел этот код, который изменяет сопротивление динамически

https://github.com/CoolOppo/Unity-Networking-FPS/blob/master/Assets/Sample%20Assets/Characters%20and%20Vehicles/Aircraft/Scripts/AeroplaneController.cs

В частности

void CalculateDrag() 
{ 
    // increase the drag based on speed, since a constant drag doesn't seem "Real" (tm) enough 
    float extraDrag = rigidbody.velocity.magnitude * dragIncreaseFactor; 
    // Air brakes work by directly modifying drag. This part is actually pretty realistic! 
    rigidbody.drag = (AirBrakes ? (originalDrag + extraDrag) * airBrakesEffect : originalDrag + extraDrag); 
    // Forward speed affects angular drag - at high forward speed, it's much harder for the plane to spin 
    rigidbody.angularDrag = originalAngularDrag * ForwardSpeed; 
} 

Приведенный выше код поможет вам изменить сопротивление при увеличении скорости.

** Редактировать, удалить ссылки на isKinematic. Если вы не измените положение со скоростью, а также примените гравитацию, то isKinematic бесполезен. Я надеялся, что мы сможем использовать isKinematic для предотвращения применения перетаскивания по умолчанию, лучше всего просто убедиться, что перетаскивание жесткого тела равно 0 и что ваш скрипт устанавливает настраиваемое перетаскивание в фиксированном обновлении.