繁体   English   中英

如何平滑 C# 中的二维旋转?

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM