C# 向前移动对象是相乘而不是相加

C# 向前移动对象是相乘而不是相加,c#,unity3d,C#,Unity3d,我需要将一个物体向前移动一段距离,距离空间的起点。起点没有正向向量,所以我需要从起点到(0,0,0)计算一个 我可以用正确的正向向量成功地计算出一个新的起点,但是当我使用它移动一个对象时,它会乘以移动距离,而不是将其相加 // "start" is actually a raycast hit point, but am using a Vector3 here for simplicity float moveDistance = 2; Vector3 start = new Vec

我需要将一个物体向前移动一段距离,距离空间的起点。起点没有正向向量,所以我需要从起点到(0,0,0)计算一个

我可以用正确的正向向量成功地计算出一个新的起点,但是当我使用它移动一个对象时,它会乘以移动距离,而不是将其相加

// "start" is actually a raycast hit point, but am using a Vector3 here for simplicity
float moveDistance = 2;
Vector3 start      = new Vector3 (0, 0, 3);
Vector3 center     = new Vector3 (0, 0, 0);
Vector3 fwd        = start - center;
myObject.position  = start + fwd * moveDistance;

Debug.Log (fwd);               //returns: (0.0, 0.0, 0.3)
Debug.Log (myObject.position); //returns: (0.0, 0.0, 9.0)
结果是myObject.position=0,0,9//乘以移动距离

期望的结果是=0,0,5//moveDistance


结果确实有一个正向向量,但它是相乘的,而不是相距。当我使用游戏对象的前向向量对myObject.position进行相同的计算时,它会增加距离。

尝试以下方法:

float distanceToMove = 2;
Vector3 start = new Vector3 (0, 0, 3);
Vector3 center = new Vector3 (0, 0, 0);
Vector3 fwd = (center - start).normalized;
myObject.position = start + fwd * distanceToMove;
Debug.Log (myObject.position);

请记住,向量既有方向也有大小。将一个向量乘以一个标量将使其每个分量相乘。如果
fwd
为(0,0,3),将其乘以2将得到(0,0,6)。要获得与
moveDistance
length相同方向的向量,可以先对其进行规格化:

myObject.position = start + fwd.normalized * moveDistance;
(就个人而言,我宁愿在将向量分配给
fwd
之前对其进行规范化,但这取决于您。)

始终可以分离向量的方向和幅值部分,这使得单独使用它们更容易:

Vector3 move = <some vector>
Vector3 moveDir = move.normalized;  //a normalized vector has length 1
float moveDist = move.magnitude;    //move = moveDir * moveDist
Vector3移动=
Vector3 moveDir=move.normalized//归一化向量的长度为1
float moveDist=move.magnity//move=moveDir*moveDist

我怀疑这是您的实际代码,因为其中存在编译错误
Vector3
没有
transform
属性。我猜您的问题是这个表达式的操作顺序问题:
start.transform.position+fwd*distanceToMove
使用“fwd=transform.forward;”从运行脚本的对象获取正向向量。相反,我需要找到一个从起点到世界原点0,0,0的正向向量;然后像这样使用向量:myObject.position=start+fwd*distanceToMove;我知道发生了什么事。从中心减去起点,这样就可以进行如下正向向量计算:Vector3 fwd=(center-start).normalized;谢谢拉特!我不知道这两件事都有可能。这会很方便的。