【问题标题】:Unity3d how can i instantiating an object and giving movement in a back direction(endles running game)Unity3d我如何实例化一个对象并向后移动(无尽的跑步游戏)
【发布时间】:2020-09-25 12:48:22
【问题描述】:

我要做的是向前实例化 7 个 tilemap,我的玩家不应该移动,tile 应该移动到后面。我该怎么做? 我试着给予这样的力量:go.GetComponent<Rigidbody>().AddForce(0, 0, -speed, ForceMode.Impulse);go.transform.position += new Vector3(0, 0, speed * Time.deltaTime); 但没有用。我想我需要尝试一些不同的实例化,但我无法弄清楚,有人可以给我一个建议吗? 我的代码:

private void Update()
    {
        if ((spawnZ - amnTilesOnScreen * tileLength) < playerTransform.position.z - safeZone)
        {
            
            SpawnTile();
            DeleteTile();
        }
        
    }
    private void SpawnTile(int prefabIndex = -1)
    {
        GameObject go;
        if (prefabIndex == -1)
        {
            go = Instantiate(tilePrefabs[RandomPrefabIndex()], Vector3.forward * spawnZ,Quaternion.identity) as GameObject;
            
        }
        else
        {
            go = Instantiate(tilePrefabs[prefabIndex], Vector3.forward * spawnZ, Quaternion.identity) as GameObject;
        }
        
        go.transform.SetParent(transform); 
        go.transform.position = Vector3.forward * spawnZ;
        //go.transform.position += new Vector3(0, 0, speed * Time.deltaTime);


        spawnZ += tileLength; 
        //go.GetComponent<Rigidbody>().AddForce(0, 0, -speed, ForceMode.Impulse);
        activeTiles.Add(go);
    }
    private void DeleteTile()
    {
        Destroy(activeTiles[0]);
        activeTiles.RemoveAt(0);
    }

【问题讨论】:

    标签: unity3d game-engine


    【解决方案1】:

    你走在正确的轨道上,只有一个障碍阻止你得到你想要的:

    你需要打电话给你的举动

    go.transform.position += new Vector3(0, 0, speed * Time.deltaTime);
    

    每个块对象的每次更新。就目前而言,您只会在 spawn 方法期间调用一次 move 。看起来你已经有一个要移动的瓷砖列表,里面

    activeTiles
    

    因此,根据这个活动图块列表,您的更新方法可能类似于:

    private void Update()
    {
        // First move all the active tiles
        foreach (var tileObj in activeTiles) {
            tileObj.transform.position += new Vector3(0, 0, speed * Time.deltaTime);
        }
    
        // The, do any spawn or destroy operations on them if needed.
        if ((spawnZ - amnTilesOnScreen * tileLength) < playerTransform.position.z - safeZone)
        {
                
            SpawnTile();
            DeleteTile();
        }
            
    }
    

    除非你有理由说明瓷砖的“力”比它们的运动更重要,否则你可能不需要物理运动。一般来说,直接移动对象更有效,而物理运动更适用于尝试创建不同对象之间的碰撞效果。在这种情况下,由于道路无论如何都会移动,所以像上面那样直接移动它们可能是你最好的选择。

    还记得在销毁道路对象时将其从活动列表中删除,否则当您尝试对不再存在的对象运行更新时会收到 NullReferenceException。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2016-02-16
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-02-04
      • 1970-01-01
      相关资源
      最近更新 更多