我有帶有腳本播放器的播放器預制件
我也有帶有腳本 TouchMove 的 GameController 預制件。這是 TouchMove 代碼:
public class TouchMove{
[SerializeField] Player player;
.....
}
所以 TouchMove 將玩家物件作為一個組件,我通過統一檢查器附加它。TouchMove 腳本負責玩家移動。這就是為什么它需要玩家物件。
另外我有很多場景,每個場景都包含 GameController 和 Player 物件。當我修改 GameController 或 Player 組件時,我希望更新所有場景中的所有游戲物件。這就是為什么我決定創建預制件:GameController prefab 和 Player prefab。
在檢查器中,我將 Player 預制件添加到 GameController 預制件中,因為 GameController 的 TouchMove 需要玩家物件。

但是之后,當我運行游戲時,玩家腳本變得不活躍。我的意思是我無法在游戲中移動玩家。(播放器腳本不起作用) 如果我將 Player 附加到 GameController作為游戲物件(不是預制件或沒有預制件),這個問題就解決了
所以,我的問題:
- 為什么如果我用預制件附加它,播放器腳本不起作用,如果我把它作為游戲物件(沒有預制件)附加它就可以作業
- 是否可以按照我描述的方式鏈接兩個預制件?
uj5u.com熱心網友回復:
您遇到此問題的原因是玩家預制件和玩家預制件的特定實體- 不是同一個物件。它們都是 GameObject-s,并且都可以被參考。
在你的例子中,GameController 參考了一個玩家預制件,但場景中的玩家是一個新物件,它是通過克隆玩家預制件在場景開始時創建的。由于它僅在場景開始時創建 - 另一個預制件永遠無法參考它。
為了解決這個問題,您可以采取幾種方法。
首先,將玩家和游戲控制器都放在 1 個新物件下,例如將其命名為 GameManager。那么您將只有一個預制件 - 游戲管理器,其中包含玩家和控制器。
第二種選擇,我通常使用的一種,是在加載時找到播放器物件。不是通過 player sa 公共引數,而是在喚醒時找到它,例如這樣:
private Player player;
void Awake() {
player = FindObjectOfType<Player>();
Assert.IsNotNull(player);
}
uj5u.com熱心網友回復:
預制件需要在場景中存在(被實體化)才能發揮作用,您嘗試做的是可腳本化物件的作業流程。
不要通過檢查器從專案目錄中附加源預制件,而是嘗試在場景中(在運行時)查找預制件的現有實體。
private void Awake()
{
player = FindObjectOfType<Player>();
}
轉載請註明出處,本文鏈接:https://www.uj5u.com/yidong/385947.html
