我正在尝试创建一些基本的游戏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位于“后面”并且与跑步者相同。我是否缺少简单的东西?这是故意的吗?我该如何让两位选手都相对于自己的旋转向前移动(即都朝中间方向跑)
[
答案 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
。