2013-08-07 2 views
1

Мне нужно найти способ сделать 3D-лодку, которая кажется плавучей в воде. В настоящее время я использую лодку с плоским дном и заставляю ее скользить по рельефу, который находится чуть ниже воды. Это дает иллюзию плавучести, но не совсем то, что я ищу.Создание плавучего лодку в Unity

движется лодка с использованием

this.transform.Translate(Vector3.left * Time.smoothDeltaTime * ((speed) + 1)); 

лодка поворачивает с помощью

this.transform.Rotate(Vector3.forward*Time.smoothDeltaTime*(int)(30*horizontal)); 

Лодка имеет Rigidbody, которая использует гравитацию, не интерполировать и имеет непрерывное обнаружение динамического столкновения. Он также использует выпуклый Mesh Collider с плавными столкновениями сферических поверхностей.

У воды есть Коллайдер Box, который используется как триггер.


Теперь мне нужно, чтобы лодка, казалось, плавала в воде программно. Это означает, что

  • качается, когда она попадает что-то
  • Не прикасайтесь к нижней части «река»
  • Корректирует вращение, чтобы остаться плоской на реке (не остается криво после удара остров или другое препятствие)

Я хотел бы сделать это так, что я могу дать основание моей лодки правильную форму, так что она может иметь более реалистичные столкновения с подводными препятствиями.

+1

Во-первых, если вы хотите, чтобы лодка двигалась физически правильно, вы не можете, и вы не должны ее перемещать с помощью 'transform.Translate', поскольку это вызывает проблемы с объектами, которые имеют жесткое тело и реагируют на физику (читайте: is ** не ** устанавливается в кинематику). Причина: Когда вы перемещаете объект внутри другого кинематического объекта, вы получите тяжелую реакцию, потому что 2 физических объекта находятся внутри друг друга, и физике приходится отталкивать их. Чем дальше они зажимаются друг в друга, тем сильнее будет реакция отклика на – Tseng

+0

. Я видел страницу, на которой упоминалось несколько сценариев плавучести лодки, таких как продвинутый и, по крайней мере, один был свободен, на форумах единства. сделать лодку и похож на лодку. –

ответ

1

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

В принципе, вы хотели бы добавить (по крайней мере) 4 объекта к своей лодке и поместить в нее жесткое тело и сценарий, который будет применять усилие вверх, которое больше, чем ваша сила тяжести.

Затем в вашем методе OnCollisionStay установите bool. Может быть, что-то вроде этого (на макушке)

using UnityEngine; 
using System.Collections; 

public class Buoyancy : MonoBehaviour { 
    public float UpwardForce = 12.72f; // 9.81 is the opposite of the default gravity, which is 9.81. If we want the boat not to behave like a submarine the upward force has to be higher than the gravity in order to push the boat to the surface 
    private bool isInWater = false; 

    void OnTriggerEnter(Collider collidier) { 
     isInWater = true; 
     rigidbody.drag = 5f; 
    } 

    void OnTriggerExit(Collider collidier) { 
     isInWater = false; 
     rigidbody.drag = 0.05f; 
    } 

    void FixedUpdate() { 
     if(isInWater) { 
      // apply upward force 
      Vector3 force = transform.up * UpwardForce; 
      this.rigidbody.AddRelativeForce(force, ForceMode.Acceleration); 
      Debug.Log("Upward force: " + force+" @"+Time.time); 
     } 
    } 
} 

И место это на всех 4-х объектах плавучести (вместе с коллайдером или триггером, конечно). Когда объект находится в воде, он подталкивает лодку вверх, если она находится над водой, она будет сбрасываться под действием силы тяжести, пока она не вернется к воде снова, где ее снова подтянут, пока она не найдет равновесие.

P.S. Если вы хотите переместить лодку, вы будете использовать this.rigidbody.AddForce(Vector.forward * 5, ForceMode.Force) (или ForceMode.Accelerate), чтобы переместить лодку

+0

Пробовал тоже. Вместо использования OnTriggerStay OnTriggerEnter/Exit дает лучшие результаты. Вам также может понадобиться играть с помощью перетаскивания (т. Е. Увеличить сопротивление, пока оно находится под водой, и опустить его, пока его вода) – Tseng

+0

Как я могу заставить лодку исправить себя тогда? Я хочу, чтобы он качался, но не остался, как он повернулся, когда он что-то ударил. – Flotolk

1

Используйте Buoyancy script. Просто добавьте это в лодку и добавьте уровень воды (ее значение y) в код. Также лучше использовать addForce вместо перевода, чтобы переместить лодку.

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

Смежные вопросы