将方向应用到当前变换位置

Applying direction into current transform position

我不太确定我是否为问题选择了正确的标题,如果您发现它具有误导性,请随时对其进行编辑。

我正在开发一款以音乐为核心的动作游戏。 它包含一组向多个方向移动的实体(游戏 objects);顶部、右侧、左侧、底部和对角线移动(例如:top-left、top-right、bottom-left 等)。

为了确定这些实体的位置,需要计算一个值,它涉及音乐节奏和实体本身的几个属性,我可以在 Unity 中生成它。

我使用以下函数来确定实体变换的位置:

    private Vector3 _position;

    private void DeterminePosition(float offset)
    {
        // In actual code, the _position is initialized under Start() method
        // But for this simplification sake, I'll just put it here
        _position = _position == null ? new Vector3(0, 0, 1f) : _position;

        if (Direction == Direction.Up || Direction == Direction.RightUp || Direction == Direction.LeftUp)
        {
            _position.y = offset;
        }
        if (Direction == Direction.Down || Direction == Direction.RightDown || Direction == Direction.LeftDown)
        {
            _position.y = -offset;
        }
        if (Direction == Direction.Left || Direction == Direction.LeftDown || Direction == Direction.LeftUp)
        {
            _position.x = -offset;
        }
        if (Direction == Direction.Right || Direction == Direction.RightDown || Direction == Direction.RightUp)
        {
            _position.x = offset;
        }

        transform.position = _position;
    }

其中 offset 是我之前所说的值。

代码按预期完美运行,但游戏需要更改。 我们决定使用度值作为方向(0 到 360 度),而不是固定方向(例如:上、右、左、下、右上、下左等)。

现在我不知道如何实现这一点。我尝试使用以下代码,但它不起作用:

    _position = new Vector3(offset, offset, transform.position.z);

    // Where the direction is between 0 .. 360
    transform.position = Quaternion.Euler(0, direction, 0) * _position;

还有谁能想出解决办法吗?
提前致谢!

如果offset表示从新位置到(0, 0, transform.position.z)的距离(称其为原点,因为只有xy位置似乎发生了变化),并且direction 是正 x 轴与从原点到新位置的矢量之间逆时针测量的角度,您可以使用 [=12 获得新的 xy 位置=] 和 sincosdirection:

_position.x = offset * Mathf.Cos(Mathf.Deg2Rad * direction);
_position.y = offset * Mathf.Sin(Mathf.Deg2Rad * direction);
_position.z = transform.position.z; //assuming the z position stays the same
transform.position = _position;

编辑

为了考虑缩放比例,我认为您需要根据 direction.

替换 offset
float multiplier = 0f;
if(0 <= direction && direction <= 45)
{
    multiplier = Mathf.Abs(offset / Mathf.Cos(Mathf.Deg2Rad * direction));
}
else if(45 < direction && direction <= direction <= 135)
{
    multiplier = Mathf.Abs(offset / Mathf.Sin(Mathf.Deg2Rad * direction));
}
else if(135 < direction && direction <=225)
{
    multiplier = Mathf.Abs(offset / Mathf.Cos(Mathf.Deg2Rad * direction));
}
else if(225 < direction && direction <= 315)
{
    multiplier = Mathf.Abs(offset / Mathf.Sin(Mathf.Deg2Rad * direction));
}
else if(315 < direction && direction <= 360)
{
    multiplier = Mathf.Abs(offset / Mathf.Cos(Mathf.Deg2Rad * direction));
}

_position.x = multiplier * Mathf.Cos(Mathf.Deg2Rad * direction);
_position.y = multiplier * Mathf.Sin(Mathf.Deg2Rad * direction);
_position.z = transform.position.z;
transform.position = _position;

这会将坐标平面分成 4 个 90 度部分(如果您组合 315 < direction <= 3600 <= direction < 45),您在其中使用 sincos of direction 创建一个乘数,该乘数应考虑 offset 需要根据 xy 分量进行缩放的区域的位移。