[英]How to smooth out 2D rotation in C#?
我正在 Unity 中制作 2D 游戏,我正在尝试实现的一个功能是在鼠标 position 超过 90 时翻转玩家,这意味着他总是面向鼠标的方向。
Vector3 mousePosition = UtilsClass.GetMouseWorldPosition();
Vector3 aimDirection = (mousePosition - transform.position).normalized;
float angle = Mathf.Atan2(aimDirection.y, aimDirection.x) * Mathf.Rad2Deg;
Vector3 aimLocalScale = Vector3.one;
if (angle > 90 || angle < -90)
{
rotate = true;
}
else
{
rotate = false;
}
gameObject.transform.localScale = aimLocalScale;
if (rotate == true)
{
transform.Rotate(0f, 180f, 0f);
}
else
{
transform.Rotate(0f, 0f, 0f);
}
但是,我遇到的一个问题是一个,它非常挑剔,如果你 go 太快,玩家看向错误的方向,第二,如果你直视,他不知道到底该往哪里看,一直在抓拍左右真快。
有谁知道解决这个问题的方法,可以实现更流畅的功能翻转?
尝试通过将其比例从 1 调整为 -1 来翻转精灵。 然后将其实现为 FlipSprite() 方法,并在您想要翻转它时调用它
因此,如果您想翻转和精灵,一种方法可能是反转精灵的 localScale,如下所示:
private void FlipSprite()
{
// Multiply the player's x local scale by -1.
Vector3 flippedScale = transform.localScale;
flippedScale.x *= -1;
transform.localScale = flippedScale;
}
我建议你保留一个像isFacingRight
这样的 boolean 变量来跟踪精灵的方向!
问题是您在角色面向左右时使用相同的旋转阈值,因此当您跨过该阈值时,他会翻转很多并且它对玩家来说是糟糕的用户体验。
解决方案:使旋转阈值动态化,因此每次玩家旋转阈值时都会被向下推。
float thresholdAngle = 90.0f;
改变角度 > 90 || 角度 < -90 到
if (angle > thresholdAngle || angle < -1.0f * thresholdAngle)
然后加入
if (rotate == true)
{
transform.Rotate(0f, 180f, 0f);
thresholdAngle = 110.0f;
}
else
{
transform.Rotate(0f, 0f, 0f);
thresholdAngle = 80.0f;
}
我不确定您的角色首先面向哪个方向,因此您可能必须将 thresholdAngle = 110.0f 与 threshold = 80.0f 交换;
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.