1.检测玩家方向和平面法向量的夹角
//解决玩家上下坡的问题
public class PlayerController : MonoBehaviour
{
public float moveSpeed;
private float rayDis = 0.6f;
private void Update()
{
Vector3 moveDire = new Vector3(Input.GetAxis("Horizontal") * moveSpeed, 0, 0);
RaycastHit hit;
Debug.DrawLine(Vector3.zero, moveDire.normalized, Color.red);
//斜坡移动
if(Physics.Raycast(transform.position, Vector3.down, out hit, rayDis))
{
Vector3 normal = hit.normal;
float angle = Vector3.Angle(normal, moveDire);
if(angle > 90 && angle < 180)
{
Debug.Log("向上走");
}
else if(angle > 0 && angle < 90)
{
Debug.Log("向下走");
}
Debug.DrawLine(Vector3.zero, normal, Color.green);
moveDire = Vector3.ProjectOnPlane(moveDire, normal);
}
transform.Translate(moveDire);
}
}
通过向玩家脚下发射一条射线,获取到平面的法向量。然后比较玩家移动方向和法向量的夹角
如果angle>90 && angle<180,则向上走
如果angle>0 && angle<90, 则向下走
否则不是斜坡