目前在我的游戲中,我有一條簡單的道路和一個從攪拌機匯入的 3D 背景。在路的盡頭,我有一個盒子碰撞器,當玩家觸摸它時,它會向前移動道路(無盡的跑步者),效果很好。3D 背景也被盒子碰撞器觸發生成,但它只是創建了它自己的一個新實體。
我的問題是如何洗掉背景的舊實體,因為它們現在只是彼此相鄰堆積。
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
public class TileSpawner : MonoBehaviour
{
private int initAmount = 5;
private float plotsize = 10f;
private float lastXPos = 15f;
public List<GameObject> plots;
// Start is called before the first frame update
void Start()
{
for (int i = 0; i < initAmount; i )
{
SpawnPlot();
}
}
// Update is called once per frame
void Update()
{
}
public void SpawnPlot() {
GameObject plot = plots[Random.Range(0, plots.Count)];
float xPos = lastXPos plotsize;
Instantiate(plot, new Vector3(xPos, 51.08614f, 25.10745f), plot.transform.rotation);
lastXPos = plotsize;
}
}
uj5u.com熱心網友回復:
目前,您的代碼正在實體化新圖,但不保留對那些實體化圖的參考。
一種解決方案是將您的繪圖參考保留在Queue中,并在適當的時候銷毀佇列前面的物件。
public class TileSpawner : MonoBehaviour
{
private int initAmount = 5;
private float plotsize = 10f;
private float lastXPos = 15f;
public List<GameObject> plots;
private Queue<GameObject> _queue;
void Start ( )
{
_queue = new Queue<GameObject> ( );
for ( int i = 0; i < initAmount; i )
SpawnPlot ( );
}
public void SpawnPlot ( )
{
var plot = plots [ Random.Range ( 0, plots.Count ) ];
var xPos = lastXPos plotsize;
// for readability
var go = Instantiate ( plot, new Vector3 ( xPos, 51.08614f, 25.10745f ), plot.transform.rotation );
_queue.Enqueue ( go );
lastXPos = plotsize;
// You could possibly call RemovePlot here
// RemovePlot ();
}
public void RemovePlot ( )
{
if ( _queue.Count <= 0 ) return;
var go = _queue.Dequeue ( );
if ( go == null ) return;
Destroy ( go );
}
}
何時要洗掉舊圖由您決定,但邏輯點可能在生成方法本身內,因為當您添加新圖時,您可能想要洗掉舊圖。但是,這是你自己決定的事情。
uj5u.com熱心網友回復:
我不確定這對你有什么用,但你不能只在玩家后面制作一個碰撞器并使用 OnCollision() 破壞碰撞背景嗎?
轉載請註明出處,本文鏈接:https://www.uj5u.com/qianduan/511528.html
標籤:C#unity3d
上一篇:當我將鏡像匯入統一時,我收到此錯誤:找不到型別或命名空間名稱“ReadOnlySpan<>”
下一篇:物體之間的碰撞?