在我正在制作的游戲中,每當獲得“分裂球”加電功能時,我都會克隆一個 Ball 物件。除了 TrailRenderer 材料外,一切都按預期作業。Ball 預制件在開始時具有用于 TrailRenderer 的默認材質。然而,當球擊中玩家控制的物體(稱為“保險杠”)時,這種情況會發生變化。材料變化在碰撞時完美地發揮作用。這是 Ball 物件的簡短腳本:
[NonSerialized]
public TrailRenderer trailRenderer;
[SerializeField]
private Material defaultTrailMaterial;
void Start()
{
trailRenderer = GetComponent<TrailRenderer>();
trailRenderer.material = defaultTrailMaterial;
}
private void OnCollisionEnter2D(Collision2D collision)
{
if (CollidedObjectIsABumper(collision))
{
// SetTrailColorToBumperColor() is called along other calculations
}
}
private bool CollidedObjectIsABumper(Collision2D collision)
{
return collision.gameObject.CompareTag("Bumper");
}
private void SetTrailColorToBumperColor()
{
trailRenderer.material = lastCollidedBumper.material;
}
為了清楚起見,我丟棄了一些東西。
現在,這是拆分球上電的簡短腳本:
void OnTriggerEnter2D(Collider2D collision)
{
if (!CollidedWithABall(collision))
return;
Ball mainBall = collision.gameObject.GetComponent<Ball>();
// I added this part as a desperate attempt, didn't work.
mainBall.trailRenderer.material = mainBall.lastCollidedBumper.material;
Ball splitBall = Instantiate(mainBall, pos, Quaternion.identity);
splitBall.tag = "Split Ball";
splitBall.GetComponent<TrailRenderer>().material = mainBall.lastCollidedBumper.material;
Destroy(gameObject);
}
private bool CollidedWithABall(Collider2D collision)
{
return collision.gameObject.CompareTag("Ball") || collision.gameObject.CompareTag("Split Ball");
}
pos 是在剪切部分中宣告的 Vector3 變數。上電后,游戲場景是這樣的:

通電后,沒有一個球碰到保險杠。我希望分裂球有一條紅色的軌跡,但事實并非如此。我確定我錯過了一些東西,Instantiate()但我不知道是什么。
我假設的一件事是Instantiate()使用主球的預制件,在這種情況下,軌跡將具有中性顏色,但我在之后添加了一個賦值陳述句,Instantiate()所以我認為這不是這里唯一的問題。作為參考,分裂球在撞到保險杠時會改變其軌跡顏色。
謝謝,如果您需要更多資訊,請告訴我。
uj5u.com熱心網友回復:
如前所述,這是一個時間問題。
你有
void Start()
{
trailRenderer = GetComponent<TrailRenderer>();
trailRenderer.material = defaultTrailMaterial;
}
這會覆寫您的材料。
Start對新實體化物件的呼叫被延遲到下一幀開始,以便在呼叫Instantiate之前仍然能夠更改某些欄位值Start。
所以你把材料放在
splitBall.GetComponent<TrailRenderer>().material = mainBall.lastCollidedBumper.material;
但后來又被Start.
Awake 然而被立即呼叫。
所以要么你把它改成
void Awake()
{
trailRenderer = GetComponent<TrailRenderer>();
trailRenderer.material = defaultTrailMaterial;
}
所以這是首先完成的,然后是行
splitBall.GetComponent<TrailRenderer>().material = mainBall.lastCollidedBumper.material;
可以正確覆寫材料,或者您也可以制作
public Material defaultTrailMaterial;
而不是直接將材料設定在
splitBall.GetComponent<TrailRenderer>().material = mainBall.lastCollidedBumper.material;
你寧愿只設定
splitBall.GetComponent<YourComponent>().defaultTrailMaterial = mainBall.lastCollidedBumper.material;
然后Start像現在一樣做這項作業。
轉載請註明出處,本文鏈接:https://www.uj5u.com/qukuanlian/408543.html
標籤:
上一篇:從購物系統獲取空參考
