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

时间:2017-08-07 00:27:58

标签: c# unity3d transform unity2d

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

我正在开发一款以音乐作为其游戏玩法核心的动作游戏。 它包含一组移动到多个方向的实体(游戏对象);顶部,右侧,左侧,底部和对角线移动(例如:左上角,右上角,左下角等)。

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

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

offset

_position = new Vector3(offset, offset, transform.position.z); // Where the direction is between 0 .. 360 transform.position = Quaternion.Euler(0, direction, 0) * _position; 是我之前谈论的价值。

代码完全符合预期,但游戏需要改变。 我们决定使用度数值作为方向(0到360度)而不是固定方向(例如:向上,向右,向左,向下,向右,向下等)。

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

{{1}}

其他人可以提出解决方案吗? 提前谢谢!

1 个答案:

答案 0 :(得分:2)

如果offset表示从新位置到(0, 0, transform.position.z)的距离(称为原点,因为只有xy位置似乎发生变化),{{1是从正x轴到从原点到新位置的向量之间以度为单位逆时针测量的角度,您可以使用direction获得新的xy位置offset sin cos

direction

修改

考虑到缩放问题,我认为您需要根据_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

这将把坐标平面分成4个90度的部分(如果你将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; 315 < direction <= 360组合在一起)你正在使用 sin cos 0 <= direction < 45创建一个乘数,该乘数应该考虑需要缩放direction的区域,具体取决于位移的offsetx分量。