我需要找到一种制作3D船的方法,看起来在水中漂浮。目前我正在使用一个平底的船,并使其沿着地形滑动,就在水面下方。这给人一种浮力的幻觉,但并不是我想要的。
船使用
移动this.transform.Translate(Vector3.left * Time.smoothDeltaTime * ((speed) + 1));
船转向
this.transform.Rotate(Vector3.forward*Time.smoothDeltaTime*(int)(30*horizontal));
船具有 RigidBody ,它使用重力,不进行插值,并具有连续动态碰撞检测。它还使用凸网格对撞机,与平滑球体碰撞。
Water有一个 Box Collider ,用作触发器。
现在我需要一种方法让船似乎以编程方式漂浮在水中。 这意味着它
我想这样做,以便我可以给我的船的底部正确的形状,以便它可以与水下障碍物进行更真实的碰撞。
答案 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来移动船。
如果你想让船更加逼真地反应,你也应该把它的重心降低,这样它就会“摆动”而且它会保持正面朝上。