Unity小行星场景角色朝向移动方向旋转异常问题求助
问题:角色朝向移动方向时出现抽搐(类马里奥银河行星重力平台游戏)
我们正在进行一项学生项目,开发一款类似《马里奥银河》的带有小行星与重力系统的平台游戏(这对我的第一个编程项目来说算是个不小的挑战,但如今已无法退出)。目前我遇到的难题是,无法让角色朝向移动方向而不出现抽搐现象。我仅拥有约2个月的编程经验,还请包涵。
角色运动实现代码
using System.Collections.Generic; using UnityEngine; public class SC_RigidbodyWalker : MonoBehaviour { public float speed = 5.0f; public bool canJump = true; public float jumpHeight = 2.0f; public Camera playerCamera; public float lookSpeed = 2.0f; public float lookXLimit = 60.0f; bool grounded = false; Rigidbody r; Vector2 rotation = Vector2.zero; float maxVelocityChange = 10.0f; void Awake() { r = GetComponent<Rigidbody>(); r.freezeRotation = true; r.useGravity = false; r.collisionDetectionMode = CollisionDetectionMode.ContinuousDynamic; rotation.y = transform.eulerAngles.y; Cursor.lockState = CursorLockMode.Locked; Cursor.visible = false; } void Update() { } void FixedUpdate() { if (grounded) { // Calculate how fast we should be moving Vector3 forwardDir = Vector3.Cross(transform.up, -playerCamera.transform.right).normalized; Vector3 rightDir = Vector3.Cross(transform.up, playerCamera.transform.forward).normalized; Vector3 targetVelocity = (forwardDir * Input.GetAxis("Vertical") + rightDir * Input.GetAxis("Horizontal")) * speed; Vector3 velocity = transform.InverseTransformDirection(r.velocity); velocity.y = 0; velocity = transform.TransformDirection(velocity); Vector3 velocityChange = transform.InverseTransformDirection(targetVelocity - velocity); velocityChange.x = Mathf.Clamp(velocityChange.x, -maxVelocityChange, maxVelocityChange); velocityChange.z = Mathf.Clamp(velocityChange.z, -maxVelocityChange, maxVelocityChange); velocityChange.y = 0; velocityChange = transform.TransformDirection(velocityChange); r.AddForce(velocityChange, ForceMode.VelocityChange); if (Input.GetButton("Jump") && canJump) { r.AddForce(transform.up * jumpHeight, ForceMode.VelocityChange); } } grounded = false; } void OnCollisionStay() { grounded = true; } }
重力功能实现代码
using System.Collections.Generic; using UnityEngine; public class SC_PlanetGravity : MonoBehaviour { public Transform planet; public bool alignToPlanet = true; float gravityConstant = 9.8f; Rigidbody r; void Start() { r = GetComponent<Rigidbody>(); } void FixedUpdate() { Vector3 toCenter = planet.position - transform.position; toCenter.Normalize(); r.AddForce(toCenter * gravityConstant, ForceMode.Acceleration); if (alignToPlanet) { Quaternion q = Quaternion.FromToRotation(transform.up, -toCenter); q = q * transform.rotation; transform.rotation = Quaternion.Slerp(transform.rotation, q, 1); } } }
内容的提问来源于stack exchange,提问作者Happy Bell
相关产品推荐
相关产品推荐

