我不太确定我是否为问题选择了正确的标题,如果您发现它具有误导性,请随时对其进行编辑。
我正在开发一款以音乐为核心的 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)
的距离(称原点是因为只有 x
和 y
位置似乎发生了变化),而 direction
是正 x 轴与来自原点到新位置,你可以使用 x
和 y
的 sin 和 cos 获得新的 offset
和 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
。
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 <= 360
和 0 <= direction < 45
),您在其中使用 direction
的 sin 或 cos 创建乘数这应该说明需要根据位移的 offset
和 x
分量缩放 y
的区域。
关于c# - 将方向应用到当前变换位置,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45537930/