Unity实现不倒翁
Unity 实现不倒翁
https://www.aigei.com/item/zekpackage_unit.html
请使用URP渲染管线创建工程,导入此插件,有问题评论区告诉我。
备用下载地址:B站
csharp
using UnityEngine;
[RequireComponent(typeof(Rigidbody))]
public class RolyPoly : MonoBehaviour
{
[Header("重心设置")]
[Tooltip("重心高度偏移(负值降低重心)")]
public float centerOfMassOffset = -0.25f;
[Header("物理参数")]
[Range(0.1f, 10f)] public float angularDrag = 2f;
[Range(0.1f, 10f)] public float maxAngularVelocity = 8f;
private Rigidbody rb;
private Vector3 originalCenterOfMass;
[Header("摇摆优化")]
public float stabilizationForce = 5f;
/* 参数、作用、推荐值
centerOfMassOffset 重心越低越稳定 (-0.5, -1.5)
angularDrag 旋转阻力,值越大停止越快 (1.0, 3.0)
maxAngularVelocity 最大旋转速度 (5, 10)
stabilizationForce 主动稳定力度 (2, 5)
*/
void Start()
{
rb = GetComponent<Rigidbody>();
rb.maxAngularVelocity = maxAngularVelocity;
rb.angularDrag = angularDrag;
// 设置重心
originalCenterOfMass = rb.centerOfMass;
AdjustCenterOfMass();
}
void AdjustCenterOfMass()
{
// 降低重心(Y轴负方向)
Vector3 newCenter = originalCenterOfMass;
newCenter.y += centerOfMassOffset;
rb.centerOfMass = newCenter;
}
void FixedUpdate()
{
// 增加稳定性
if (rb.velocity.magnitude < 0.1f)
{
Vector3 uprightDirection = Vector3.up;
Vector3 currentUp = transform.up;
// 计算恢复力矩
Vector3 torque = Vector3.Cross(currentUp, uprightDirection);
rb.AddTorque(torque * stabilizationForce, ForceMode.Acceleration);
}
}
// 可选:在编辑器中可视化重心
void OnDrawGizmosSelected()
{
if (!Application.isPlaying) return;
Gizmos.color = Color.red;
Gizmos.DrawSphere(transform.TransformPoint(rb.centerOfMass), 0.1f);
}
}