出现该问题的代码如下:
using System; using System.Collections; using System.Collections.Generic; using UnityEngine; public class PlayController : MonoBehaviour { [Header("移动参数")] public Vector2 currentVelocity; public float xInput; public float LRMoveForce; private void Start() { pos = GetComponent<Transform>(); rb = GetComponent<Rigidbody2D>(); } private void Update() { LRMovement(); } private void LRMovement() { if (rb.velocity.x < 0) { faceDir = -1; pos.rotation = Quaternion.Euler(0, 180, 0); //transform.localScale = new Vector3(-1, 1, 1); } if (rb.velocity.x > 0) { faceDir = 1; pos.rotation = Quaternion.Euler(0, 0, 0); //transform.localScale = new Vector3(1, 1, 1); } xInput = Input.GetAxisRaw("Horizontal"); rb.velocity = new Vector2(xInput * LRMoveForce, rb.velocity.y); currentVelocity = rb.velocity; } }该脚本挂载在player上,当player在水平方向上遇到static刚体的collider时持续按下移动键可能会发生角色左右抽搐的情况。同时观察到position.x会在极小范围内抖动,potion.y会以极小的速率递减。
无论是将物体左右翻转的方式改为修改loaclscale,还是将物体移动的方式由修改velocity改为addforce均无法解决问题。
可行的解决方案:判断物体朝向的代码不放在rb.velocity.x的判断下,修改后的代码如下
private void LRMovement() { if (rb.velocity.x < 0) { faceDir = -1; //pos.rotation = Quaternion.Euler(0, 180, 0); //transform.localScale = new Vector3(-1, 1, 1); } if (rb.velocity.x > 0) { faceDir = 1; //pos.rotation = Quaternion.Euler(0, 0, 0); //transform.localScale = new Vector3(1, 1, 1); } xInput = Input.GetAxisRaw("Horizontal"); if (xInput < 0) { pos.rotation = Quaternion.Euler(0, 180, 0); } if (xInput > 0) { pos.rotation = Quaternion.Euler(0, 0, 0); } rb.velocity = new Vector2(xInput * LRMoveForce, rb.velocity.y); currentVelocity = rb.velocity; }(第一次尝试制作游戏,不是很有经验,如果有更好的方法或者知道原因的也希望各位能在评论区指出。)
