C# 为什么我的物体的位置不变?

C# 为什么我的物体的位置不变?,c#,unity3d,C#,Unity3d,我目前正在开发基于Unity3D的进化算法。模拟是二维的。一个单独的主题被描绘成汽车,是一个预制件,由3个精灵(2个轮子和身体)和一个汽车脚本组成。每个精灵都有一个合适的碰撞器(BoxCollider2D用于车身,CircleCollider2D用于车轮)。车体也有 两轮接头2d。这些对撞机的参数由代码更改 我希望这辆车被摧毁,如果它停止移动或更好-前进。在游戏窗口中,汽车显然正在下坡行驶。问题是,在检查游戏对象的transform.position之后,这个值似乎是常量。它始终显示繁殖点的位置

我目前正在开发基于Unity3D的进化算法。模拟是二维的。一个单独的主题被描绘成汽车,是一个预制件,由3个精灵(2个轮子和身体)和一个汽车脚本组成。每个精灵都有一个合适的碰撞器(BoxCollider2D用于车身,CircleCollider2D用于车轮)。车体也有 两轮接头2d。这些对撞机的参数由代码更改

我希望这辆车被摧毁,如果它停止移动或更好-前进。在游戏窗口中,汽车显然正在下坡行驶。问题是,在检查游戏对象的transform.position之后,这个值似乎是常量。它始终显示繁殖点的位置。SpawnPoint是带有SpawnScript的空游戏对象,其片段如下:

public GameObject carprefab; //Set from editor
public Transform[] spawnPoints; //transform of SpawnPoint, just one element. Set from editor.
private void GenerateCar(Chromosome chromosome)
{
int spawnPointIndex = Random.Range(0, spawnPoints.Length);
var instace = (GameObject)Instantiate(carprefab, spawnPoints[spawnPointIndex].position,     spawnPoints[spawnPointIndex].rotation);
    instace.SendMessage("SetChromosome", chromosome);

    foreach (Transform child in instace.transform)
    { //code omitted for clarity, changes some of parameters based on chromosome.
实例化的对象有一个CarScript:

 // Update is called once per frame
    void Update()
    {
        if (frames%10 == 0)
            CheckForMoving();
        frames++;
    }
 private void CheckForMoving()
    {
        var pos = gameObject.transform.position; //this is never changing - why?


        var diff = pos - startingPosition; //difference between local position and starting position
        if (CountLength(diff) >= recordLengthYet)
        {
            Debug.Log("It is moving!");
            recordLengthYet = CountLength(diff);
            framesTillLastRecord = 0;
        }
        else
        {
            Debug.Log("It is not moving");
            if (framesTillLastRecord > 4)
                Destroy(gameObject, 0f);
            framesTillLastRecord++;
        }
    }
我尝试通过以下任何方式获得该职位:

var pos = gameObject.transform.position;
var pos = GameObject.FindGameObjectWithTag("player");
var pos = this.transform.position;

问题是——我错过了什么,或者为什么这一点没有改变?我最近才开始学习Unity,以前没有使用任何类似软件的经验。我还想知道,这样做是否正确。

假设您使用的是刚体,您应该根据Unity doco覆盖
FixeUpdate()
,而不是
Update()

如果启用了MonoBehavior,则每个固定帧速率帧调用此函数。处理刚体时,应使用FixedUpdate而不是Update。例如,向刚体添加力时,必须在FixedUpdate中的每个固定帧而不是更新中的每个帧应用力。-

替换:

 // Update is called once per frame
void Update()
{
    if (frames%10 == 0)
        CheckForMoving();
    frames++;
}
与:


几天过去了,没有人上传正确的答案,我设法找到了解决办法。只要它真的很脏,它似乎就行

我在子游戏对象上放置了一个标签,而不是预置,我通过

var pos = GameObject.FindGameObjectWithTag("player");

我不确定这是否真的是一个好答案,但我希望有一天有人会发现它有用。

当然,这是一个很好的建议,因为我没有意识到这一点,我更改了代码。然而,这仍然不能解决我的主要问题,即当游戏对象明显移动时,this.transform的位置不变。
CountLength
?如果你想知道两点之间的距离,我想你应该使用
Vector3.magnity
Vector3.sqrMagnitude
。您是否尝试过在设置后输出pos值(debug.log(pos)等),或者您是否依赖于上面的调试?我尝试过输出值本身,并且pos似乎是常量值,等于生成点的位置。另外,我将在稍后更改代码以反映您的建议,我不知道这些属性。
var pos = GameObject.FindGameObjectWithTag("player");