Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/file/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 如何使矢量2偏移点始终相对于变换';自上而下射手的旋转?_C#_Unity3d - Fatal编程技术网

C# 如何使矢量2偏移点始终相对于变换';自上而下射手的旋转?

C# 如何使矢量2偏移点始终相对于变换';自上而下射手的旋转?,c#,unity3d,C#,Unity3d,我在游戏中设置射击,但投射物的起点(武器的终点)不随玩家旋转。该点由脚本上的向量2定义,该向量应该是与玩家位置的偏移量,但也考虑了玩家旋转。 我相信这很简单,但似乎无法解决如何修复我的代码。(我想使用此脚本中的代码,而不是子转换引用) 在图片中,起点显示为一个绿色圆圈,红色十字穿过。它需要和玩家一起旋转,所以它总是在箭头的顶端 private void OnDrawGizmos() { localProjectileStart = new Vector3( transfo

我在游戏中设置射击,但投射物的起点(武器的终点)不随玩家旋转。该点由脚本上的向量2定义,该向量应该是与玩家位置的偏移量,但也考虑了玩家旋转。 我相信这很简单,但似乎无法解决如何修复我的代码。(我想使用此脚本中的代码,而不是子转换引用)

在图片中,起点显示为一个绿色圆圈,红色十字穿过。它需要和玩家一起旋转,所以它总是在箭头的顶端

private void OnDrawGizmos()
{
    localProjectileStart = new Vector3(
        transform.position.x + projectileStart.x,
        transform.position.y + projectileStart.y,
        transform.position.z);
    Gizmos.color = Color.green;
    Gizmos.DrawWireSphere(localProjectileStart, 0.04f);
    Gizmos.color = Color.red;
    Gizmos.DrawLine(new Vector3(-0.05f, 0, 0) + localProjectileStart, new Vector3(0.05f, 0, 0) + localProjectileStart);
    Gizmos.DrawLine(new Vector3(0, -0.05f, 0) + localProjectileStart, new Vector3(0, 0.08f, 0) + localProjectileStart);
}

您可以创建一个新的游戏对象,并将其作为玩家对象的子对象,以便点随玩家旋转。您可以获取该点的参考并获取其位置。

花了一段时间才弄清楚,但我将其作为完全基于代码的位置偏移解决方案:

public Vector2 projectileStart;
private void OnDrawGizmos()
{
    // Script-based constant position offset
    Vector3 _localPositionAndRotation = transform.rotation * new Vector3(
        projectileStart.x,
        projectileStart.y,
        0);
    Vector3 _relativePosition = _localPositionAndRotation + transform.position;
    Gizmos.color = Color.green;
    Gizmos.DrawWireSphere(_relativePosition, 0.04f);
    Gizmos.color = Color.red;
    Gizmos.DrawLine((transform.right * -0.05f) + _relativePosition, (transform.right * 0.05f) + _relativePosition);
    Gizmos.DrawLine((transform.up * -0.05f) + _relativePosition, (transform.up * 0.08f) + _relativePosition);
}
这段代码在偏移点绘制了一个线球体(不旋转),还有一个t型箭头,它总是指向transform.up,因此很容易获得2D前进方向。在我的例子中,我用它作为玩家和敌人的投射武器。 使用OnDrawGizmos提供了一个仅用于编辑器的位置视图,然后在我的更新代码中,我会在游戏运行时执行完全相同的操作


感谢@SushiWaUmai提供了有关变换、旋转相乘的技巧。

谢谢。我确实知道这种方法,但我的目标是通过代码来实现,而不是依赖于另一个游戏对象引用。我想我以前做过,可能使用了transform.up/etc之类的工具,但现在我无法让它工作,也没有在网上找到答案。有什么想法吗?你可以计算相对向量,然后乘以玩家的旋转来旋转向量。好的,我该如何用C#代码来写它,来更改
localprojectlestart
变量?我尝试了许多不同的方法来乘法,但都不正确。(玩家在Z轴上旋转,顺便说一句)代码就是我遇到麻烦的地方。如何旋转向量?你可以通过将向量乘以四元数来旋转向量3,更多信息请参见