我有這個方法'SetStats',它是一個類的一部分。
public class HeroUnit: MonoBehaviour {
public virtual void SetStats(Stats stats) => Stats = stats;
}
當我通過指向一個預制件來實體化一個游戲物件,然后將一個已知型別“HeroUnit”的組件附加到它上面時,我可以毫無問題地呼叫 SetStats 方法。
void SpawnUnit(Vector3 pos) {
var spawnedGameObject = Instantiate(unitPrefab, pos, Quaternion.identity,transform) as GameObject;
var spawned = spawnedGameObject.GetComponent<HeroUnit>();
spawned.SetStats(stats);
}
但是,當我不強制使用已知組件型別時,我寧愿將它動態地提供給 GetComponent() 方法:實體化作業,但我不能再呼叫 SetStats 方法。
void SpawnUnit(String myUnit, Vector3 pos) {
var spawnedGameObject = Instantiate(unitPrefab, pos, Quaternion.identity,transform) as GameObject;
Type unitType = Type.GetType(myUnit);
var spawned = spawnedGameObject.GetComponent(unitType);
spawned.SetStats(stats);
}
這將回傳以下編譯錯誤:
錯誤 CS1061:“組件”不包含“SetStats”的定義,并且找不到接受“組件”型別的第一個引數的可訪問擴展方法“SetStats”
知道如何讓編譯器在運行代碼時理解“生成”不是“組件”嗎?我在運行時檢查了“生成”型別,它應該是“HeroUnit”。
uj5u.com熱心網友回復:
取var
下來看看它是否會編譯。我不認為你得到一個HeroUnit
,我認為你得到一個Component
。
嘗試轉換 GetComponent 的結果,例如
HeroUnit spawned = (HeroUnit) spawnedGameObject.GetComponent(unitType);
我還要說將型別作為字串傳遞是一個壞主意。你從某個地方得到了字串,所以只需使用型別而不是字串。
你可能會回來抱怨你的 unitType 不一定是 HeroUnit,我會回答:“那你怎么知道它有SetStats
方法?”
您最好轉換為基類或介面,但同樣,這個字串業務對您沒有幫助。
轉載請註明出處,本文鏈接:https://www.uj5u.com/net/474349.html
下一篇:返回列表