Unity3d 我如何实例化一个对象并向后移动(无尽的 运行 游戏)
Unity3d how can i instantiating an object and giving movement in a back direction(endles running game)
我想做的是向前实例化 7 个瓦片地图,我的玩家不应该移动,瓦片应该向后移动。我该怎么做任何建议?
我试着给这样的力: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);
}
你走在正确的轨道上,只有一个障碍阻止你得到你想要的东西:
您将需要调用您的移动
go.transform.position += new Vector3(0, 0, speed * Time.deltaTime);
每个块对象的每次更新。就目前而言,您只会在 spawn 方法期间调用一次移动。似乎您已经有了要移动的图块列表,里面
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。
我想做的是向前实例化 7 个瓦片地图,我的玩家不应该移动,瓦片应该向后移动。我该怎么做任何建议?
我试着给这样的力: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);
}
你走在正确的轨道上,只有一个障碍阻止你得到你想要的东西:
您将需要调用您的移动
go.transform.position += new Vector3(0, 0, speed * Time.deltaTime);
每个块对象的每次更新。就目前而言,您只会在 spawn 方法期间调用一次移动。似乎您已经有了要移动的图块列表,里面
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。