在Unity中创造一艘漂浮的船

时间:2013-08-07 17:47:19

标签: c# unity3d physics

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

船使用

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

船转向

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

船具有 RigidBody ,它使用重力,不进行插值,并具有连续动态碰撞检测。它还使用凸网格对撞机,与平滑球体碰撞。

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


现在我需要一种方法让船似乎以编程方式漂浮在水中。 这意味着它

  • 碰到某事时摇摆不定
  • 不触及“河流”的底部
  • 纠正其旋转以在河上保持平稳(撞击岛屿或其他障碍物后不会保持弯曲)

我想这样做,以便我可以给我的船的底部正确的形状,以便它可以与水下障碍物进行更真实的碰撞。

2 个答案:

答案 0 :(得分:3)

除了我的评论之外,如果你真的希望它是浮力的,你必须使它非运动并对重力作出反应,水必须是一个体积网格(或你使用的盒子,但这不太准确如果你使用波浪效果的水,不要使用波浪。)

基本上你想要(至少)将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)来移动船

答案 1 :(得分:1)

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

如果你想让船更加逼真地反应,你也应该把它的重心降低,这样它就会“摆动”而且它会保持正面朝上。