除了我的评论之外,如果你真的想让它有浮力,你必须让它成为非运动的并对重力做出反应,并且水必须是一个体积网格(或者你使用的盒子,但那不太准确,不要如果您使用具有波浪效果的水,请使用波浪)。
基本上,您需要向您的船添加(至少)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
)来移动船