我不太确定我是否为问题选择了正确的标题,随时可以编辑它如果您发现它具有误导性。
我正在开发一款以音乐作为其游戏玩法核心的动作游戏。 它包含一组移动到多个方向的实体(游戏对象);顶部,右侧,左侧,底部和对角线移动(例如:左上角,右上角,左下角等)。
要确定这些实体的位置,需要计算一个值,该值涉及音乐速度和实体本身的几个属性,我可以在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}}
其他人可以提出解决方案吗? 提前谢谢!
答案 0 :(得分:2)
如果offset
表示从新位置到(0, 0, transform.position.z)
的距离(称为原点,因为只有x
和y
位置似乎发生变化),{{1是从正x轴到从原点到新位置的向量之间以度为单位逆时针测量的角度,您可以使用direction
获得新的x
和y
位置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
的区域,具体取决于位移的offset
和x
分量。