Unity transform.up不旋转

时间:2019-09-28 23:08:46

标签: c# unity3d transform

我正在尝试创建一些基本的游戏AI逻辑,该逻辑可以让一个玩家逃避另一个玩家。这样做很好,但是当我这样做时,我现在正在寻找防守者(以前是静态的)来追赶跑步者。我为此奋斗了很长时间,但发现了transform.up是我一直在寻找的魔术,因为它使用玩家Y(绿轴)继续前进并使用旋转。

在我的2D飞机上,这可以很好地运行,让跑步者运行页面,但是我的防守者正在运行,这就是我的问题。我预期,因为我将字符在Z轴上旋转了180度,transform.up会在页面上下降。我发现,transform.up仍在页面上,我我不确定我想念什么。

要移动玩家,我需要执行以下操作(在Update()中):

transform.Translate(transform.up * 15f * Time.deltaTime);

要尝试调试该问题,我将以下内容添加到Start()中:

// DEBUG: Show position indicators;
if (showPositionIndicators == true) {

    Dictionary<string, Vector3> posIndicators = new Dictionary<string, Vector3>();
    posIndicators.Add("Up", transform.up);
    posIndicators.Add("Rt", transform.right);
    posIndicators.Add("Dn", -transform.up);
    posIndicators.Add("Lt", -transform.right);
    posIndicators.Add("Fd", transform.forward);
    posIndicators.Add("Bk", -transform.forward);

    Vector3 scaleLocPos = new Vector3(10f, 10f, 10f);
    dbgPosInd = new List<GameObject>();
    foreach (KeyValuePair<string, Vector3> posIndicator in posIndicators) {

        GameObject t = Instantiate(prefabPosInd, transform);
    t.name = "Pos_" + posIndicator.Key;
        t.transform.localPosition = Vector3.Scale(posIndicator.Value, scaleLocPos);
        t.GetComponent<TextMeshProUGUI>().text = posIndicator.Key;
        dbgPosInd.Add(t);
    }
}

这似乎表明确实transform.up位于“后面”并且与跑步者相同。我是否缺少简单的东西?这是故意的吗?我该如何让两位选手都相对于自己的旋转向前移动(即都朝中间方向跑)

[Two circles.  Blue circle (bottom) with up going up the page. Yellow circle (top) has up also going up the page.[1]

1 个答案:

答案 0 :(得分:2)

您在transform.up中将t.transform.localPosition = Vector3.Scale(posIndicator.Value, scaleLocPos);用作局部空间矢量,但是transform.up world-space 中提供了变换的局部向上矢量。就像transform.TransformDirection(Vector3.up);的简写。

旋转180度的对象在世界空间中的局部空间向上矢量为 向下 。你说对了。但是,当您将其用作旋转对象的 localPosition 时,由于该对象已旋转,因此该局部空间位置设置为 down ,并且将会再次 在世界空间中。

这就是为什么“ UP”调试文本应该颠倒,却又在世界范围内定位的原因。这是因为在对象的本地空间中,它处于关闭状态。

Vector3.up分配中使用t.transform.localPosition(和其他方向),因为该引用已引用本地空间位置。


由于默认情况下transform.Translate()使用 local-space ,因此会发生相同的问题。您的本地空间增加(获取时)减少了(在世界空间中),但是您本地空间的转换减少了在世界空间中。

使用transform.Translate(Vector3.up * 15f * Time.deltaTime) (推荐),或进行相对于世界空间的翻译,transform.Translate(transform.up * 15f * Time.deltaTime , Space.World {{1 }}


另一个潜在的问题:

假设您的角色已经或将要拥有物理元素,请不要进行更新或变换操作。在);上使用Rigidbody2D.MovePosition()。有一个FixedUpdate(),但是它会覆盖其他物理效果,因此建议使用Rigidbody2d.position