将方向应用到当前变换位置
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)
的距离(称其为原点,因为只有x
和y
位置似乎发生了变化),并且direction
是正 x 轴与从原点到新位置的矢量之间逆时针测量的角度,您可以使用 [=12 获得新的 x
和 y
位置=] 和 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;
编辑
为了考虑缩放比例,我认为您需要根据 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 <= 360
和 0 <= direction < 45
),您在其中使用 sin 或 cos of direction
创建一个乘数,该乘数应考虑 offset
需要根据 x
和 y
分量进行缩放的区域的位移。
我不太确定我是否为问题选择了正确的标题,如果您发现它具有误导性,请随时对其进行编辑。
我正在开发一款以音乐为核心的动作游戏。 它包含一组向多个方向移动的实体(游戏 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)
的距离(称其为原点,因为只有x
和y
位置似乎发生了变化),并且direction
是正 x 轴与从原点到新位置的矢量之间逆时针测量的角度,您可以使用 [=12 获得新的 x
和 y
位置=] 和 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;
编辑
为了考虑缩放比例,我认为您需要根据 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 <= 360
和 0 <= direction < 45
),您在其中使用 sin 或 cos of direction
创建一个乘数,该乘数应考虑 offset
需要根据 x
和 y
分量进行缩放的区域的位移。