1

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

船移动使用

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

船转弯使用

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

这艘船有一个使用重力的刚体,不插值,并有一个连续动态碰撞检测。它还使用带有平滑球体碰撞的凸面网格碰撞器。

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


现在我需要一种方法来让船看起来像程序化地漂浮在水中。这意味着它

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

我想这样做,这样我就可以给我的船底一个正确的形状,这样它就可以与水下障碍物发生更真实的碰撞。

4

2 回答 2

3

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

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

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

于 2013-08-07T18:17:57.057 回答
1

使用浮力脚本。只需将此添加到船中,然后在代码中添加水位(它的 y 值)。此外,最好使用 addForce 而不是 translate 来移动船。

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

于 2013-08-19T13:27:43.313 回答