c# - Unity - FPS刚体控制器未与球形重力对齐
问题描述
我目前正在开发一款 fps 游戏,您可以在其中旅行到小行星并在它们上面行走,目前我对这些小行星有重力,并且我有一个适用于我所有其他运动系统(游泳、漂浮)的 fps 控制器,但要翻译它小行星的引力给我带来了很多麻烦。我可以让控制器使用 Unity 的重力在平面上完美工作,但不能在小行星上工作。
当前的 fps 控制器朝着摄像机的方向移动,这意味着角色在抬头时会浮起来,我所有的其他 fps 控制器都无法在地球上工作,而这个是我让它工作的壁橱.
有没有什么办法解决这一问题?我对编码很陌生,所以任何解释都会帮助我!
这是我用于控制器的代码:
public Transform targetCamera;
public Rigidbody targetRigidbody;
public Transform targetBody;
public float walkSpeed = 9f;
public float runSpeed = 14f;
public float maxSpeed = 20f;
public float jumpPower = 30f;
public float extraGravity = 0;
float bodyRotationX;
float camRotationY;
Vector3 directionIntentX;
Vector3 directionIntentY;
float speed;
public bool grounded;
public float thrust = 20f;
public float forwardSwimSpeed = 45f;
private float xRotation;
private const float Sensitivity = 50f;
private const float SensitivityMultiplier = 1f;
private float desiredX;
public float dragMult = 2f;
public float rotationSmoothSpeed = 10f;
void Update()
{
Look();
targetRigidbody.drag = dragMult;
}
private void FixedUpdate()
{
if (targetRigidbody.velocity.magnitude > maxSpeed)
{
targetRigidbody.velocity = targetRigidbody.velocity.normalized * maxSpeed;
}
if (Input.GetKey(KeyCode.W))
AddForce(Vector3.forward);
if (Input.GetKey(KeyCode.S))
AddForce(Vector3.back);
if (Input.GetKey(KeyCode.A))
AddForce(Vector3.left);
if (Input.GetKey(KeyCode.D))
AddForce(Vector3.right);
if (Input.GetKey(KeyCode.Space))
AddForce(Vector3.up);
if (Input.GetKey(KeyCode.LeftControl))
AddForce(Vector3.down);
}
private void AddForce(Vector3 direction)
{
float scaledForwardSwimSpeed = Time.deltaTime * forwardSwimSpeed;
targetRigidbody.AddForce(targetCamera.transform.TransformDirection(
direction * thrust) * scaledForwardSwimSpeed,
ForceMode.Acceleration);
}
private void Look()
{
float mouseX = Input.GetAxis("Mouse X") * Sensitivity * Time.fixedDeltaTime * SensitivityMultiplier;
float mouseY = Input.GetAxis("Mouse Y") * Sensitivity * Time.fixedDeltaTime * SensitivityMultiplier;
Vector3 rotation = targetCamera.transform.localRotation.eulerAngles;
desiredX = rotation.y + mouseX;
xRotation -= mouseY;
xRotation = Mathf.Clamp(xRotation, -90f, 90f);
targetCamera.transform.localRotation = Quaternion.Euler(xRotation, desiredX, 0);
}
这是小行星的两个代码中的第一个:GravityCtrl
public float gravity = 10f;
private void OnTriggerEnter(Collider other)
{
if (other.GetComponent<GravityCtrl>())
{
other.GetComponent<GravityCtrl>().gravity = this.GetComponent<GravityOrbit>();
}
这是第二个:重力轨道
public GravityOrbit gravity;
private Rigidbody rb;
public float rotationSpeed = 20f;
// Start is called before the first frame update
void Start()
{
rb = GetComponent<Rigidbody>();
}
// Update is called once per frame
void FixedUpdate()
{
if (gravity)
{
Vector3 gravityUp = Vector3.zero;
gravityUp = (transform.position - gravity.transform.position).normalized;
Vector3 localUp = transform.up;
Quaternion targetrotation = Quaternion.FromToRotation(localUp, gravityUp) * transform.rotation;
transform.up = Vector3.Slerp(transform.up, gravityUp, rotationSpeed * Time.deltaTime);
rb.AddForce((-gravityUp * gravity.gravity) * rb.mass);
}
解决方案
推荐阅读
- electron - yarn monorepo 工作区 nohoist 并发问题
- python - 带有 Splash 的 CrawlSpider,仅抓取和处理第一个链接
- c# - 无法从传输连接读取数据。FtpWeb 请求。C#
- node.js - Kerberos 错误:杂项故障(请参阅文本):未找到 macOS 的凭据缓存文件
- set - 具有 Kleene 星的两组意味着一组是另一组的子集
- python - 黑色不会遵守长导入语句的行长限制
- python - 使用 psycopg2 参数化 SQL 查询
- c - 如何知道从哪个接口接受了新套接字?
- xamarin - 如何检查我的应用程序 ios 在 Xamarin.ios 中是否具有蓝牙权限?
- javascript - 反应条件渲染无法从状态中识别真