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

标签 c# transform unity3d

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

我正在开发一款以音乐为核心的 Action 游戏。 它包含一组向多个方向移动的实体(游戏对象);上、右、左、下和对角线移动(例如:左上、右上、左下等)。

为了确定这些实体的位置,需要计算一个值,该值涉及音乐节奏和实体本身的几个属性,我可以在 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 轴与来自原点到新位置,你可以使用 xysincos 获得新的 offsetdirection 位置:

_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;

编辑

为了考虑缩放,我认为您需要根据 offset 替换 direction

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 ),您在其中使用 directionsincos 创建乘数这应该说明需要根据位移的 offsetx 分量缩放 y 的区域。

关于c# - 将方向应用到当前变换位置,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45537930/

相关文章:

c# - 窗体关闭但可见

c# - unity5 中的圆形端盖 2d 线

unity3d - 'foreach'仍然在 'modern'统一性(> = 5.4.x)中不好吗?

c# - 在弹出窗口关闭时终止 session ,直到浏览器关闭

c# - 尝试在我的WPF应用程序(ColumnSeries)中构建一个简单的实时图表

ios - 为什么两个矩阵相乘需要与其在变换矩阵中的视觉应用顺序相反的顺序

javascript - Adobe Edge Animate 和 d3.js : d3. scale.range([value]) 在 Chrome 和 Safari 中无法正常工作

html - 具有 3-D 变换的 Firefox 交叉结构

c# - 自动设置与手动减少(如何同时进行?)

c# - 链接我的实体结果的错误做法