Unity:人造重力 - 内部胶囊/圆柱体
Unity: Faux Gravity - inner Capsule/ Cylinder
我正在与圆柱体或胶囊中的虚假重力作斗争。基本上我认为我可以采用与球形重力相同的代码,但这是行不通的。所以我更改了一些行以获得更好的结果。
[SerializeField] float gravity = 10;
public void Attract ( Transform target )
{
Vector3 gravityUp = (target.position - new Vector3(transform.position.x, transform.position.y,target.position.z)).normalized;
Vector3 bodyDown = -target.up;
Rigidbody rb = target.GetComponent<Rigidbody>();
rb.AddForce(gravityUp * gravity);
Quaternion targetRotation = Quaternion.FromToRotation(bodyDown, gravityUp) * target.rotation;
targetRotation.x = 0;
target.rotation = Quaternion.Slerp(target.rotation, targetRotation, 30.0f * Time.deltaTime);
}
第一次尝试时效果不错。但是玩家(目标)不能旋转 Y 轴。有人有什么想法吗?
好的,我尝试了以下方法。
Quaternion targetRotation = Quaternion.FromToRotation(bodyDown, gravityUp) * target.rotation;
targetRotation.x = 0;
target.rotation = Quaternion.Slerp(target.rotation, targetRotation, 30.0f * Time.deltaTime);
现在我使用 Surface 法线来旋转 Player。
if (Physics.Raycast(attractedBody.transform.position + attractedBody.transform.forward, -attractedBody.transform.up, out hit, distance))
{
surfaceNorm = hit.normal;
}
但是如果没有刚体约束,玩家会在没有任何输入的情况下开始旋转。所以我必须使用:
rb.constraints = RigidbodyConstraints.FreezeRotation;
这有效。
我正在与圆柱体或胶囊中的虚假重力作斗争。基本上我认为我可以采用与球形重力相同的代码,但这是行不通的。所以我更改了一些行以获得更好的结果。
[SerializeField] float gravity = 10;
public void Attract ( Transform target )
{
Vector3 gravityUp = (target.position - new Vector3(transform.position.x, transform.position.y,target.position.z)).normalized;
Vector3 bodyDown = -target.up;
Rigidbody rb = target.GetComponent<Rigidbody>();
rb.AddForce(gravityUp * gravity);
Quaternion targetRotation = Quaternion.FromToRotation(bodyDown, gravityUp) * target.rotation;
targetRotation.x = 0;
target.rotation = Quaternion.Slerp(target.rotation, targetRotation, 30.0f * Time.deltaTime);
}
第一次尝试时效果不错。但是玩家(目标)不能旋转 Y 轴。有人有什么想法吗?
好的,我尝试了以下方法。
Quaternion targetRotation = Quaternion.FromToRotation(bodyDown, gravityUp) * target.rotation;
targetRotation.x = 0;
target.rotation = Quaternion.Slerp(target.rotation, targetRotation, 30.0f * Time.deltaTime);
现在我使用 Surface 法线来旋转 Player。
if (Physics.Raycast(attractedBody.transform.position + attractedBody.transform.forward, -attractedBody.transform.up, out hit, distance))
{
surfaceNorm = hit.normal;
}
但是如果没有刚体约束,玩家会在没有任何输入的情况下开始旋转。所以我必须使用:
rb.constraints = RigidbodyConstraints.FreezeRotation;
这有效。