【问题标题】:Creating a buoyant boat in Unity在 Unity 中创建浮力船
【发布时间】:2013-08-19 21:42:15
【问题描述】:

我需要找到一种方法来制作一艘 3D 船,让它看起来在水中漂浮。目前,我正在使用平底船,并使其沿地形滑行,就在水面之下。这给人一种浮力的错觉,但并不是我真正想要的。

船移动使用

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

船转弯使用

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

船有一个刚体,它使用重力,不插值,并具有连续动态碰撞检测。它还使用凸形 Mesh Collider,具有平滑球体碰撞。

The Water 有一个 Box Collider 用作触发器。


现在我需要一种以编程方式使船看起来漂浮在水中的方法。 就是这个意思

  • 撞到东西时会摇晃
  • 不触“河”底
  • 修正了它的旋转以在河流上保持平坦(在撞到岛屿或其他障碍物后不会保持弯曲)

我想这样做是为了给我的船底设置正确的形状,这样它就可以更逼真地与水下障碍物发生碰撞。

【问题讨论】:

  • 首先,如果你想让船在物理上正确移动,你不能也不应该通过transform.Translate 移动它,因为这会导致具有刚性物体并对物理有反应的物体出现问题(读:设置为运动学)。原因:当您在另一个运动对象内部移动一个对象时,您会收到强烈的反应,因为两个物理对象在彼此内部并且物理必须将它们推开。它们彼此夹得越远,反推反应就越强
  • 我在统一论坛上看到一个页面提到了几个船浮力脚本,比如高级并且至少一个是免费的。使船摇摆,类似于船。

标签: c# unity3d physics


【解决方案1】:

除了我的评论之外,如果你真的想让它有浮力,你必须让它成为非运动的并对重力做出反应,并且水必须是一个体积网格(或者你使用的盒子,但这不太准确, 如果您使用具有波浪效果的水,请不要使用波浪)。

基本上,您希望向您的船添加(至少)4 个对象,并将刚体放置在其中,并在其中放置一个脚本,该脚本将施加大于您的重力的向上力。

然后在您的OnCollisionStay 方法中设置一个布尔值。也许是这样的(在我的头上)

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 个浮力物体上(当然还有对撞机或触发器)。当物体在水中时,它会将船向上推,如果它在水面上,它会被重力拉下,直到它再次到达水中,它会再次被拉起,直到找到平衡。

附:如果你想移动船,你将使用this.rigidbody.AddForce(Vector.forward * 5, ForceMode.Force)(或ForceMode.Accelerate)来移动船

【讨论】:

  • 也试过了。 OnTriggerEnter/Exit 不是使用 OnTriggerStay,而是提供更好的结果。您可能还需要玩阻力(即在水下时增加阻力,在水面时降低阻力)
  • 那我怎样才能让船自行纠正呢?我希望它摇摆不定,但不要停留在它撞到东西时的旋转方式。
【解决方案2】:

使用Buoyancy script。只需将其添加到船上,然后在代码中添加水位(它的 y 值)。另外最好使用 addForce 而不是 translate 来移动船。

如果你想让船的反应更真实,你还应该把它的重心放低,这样它会“摇晃”并保持正面朝上。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多