これで、infoという変数があり、これはKingdom Perkという独自のクラスです。あなたの王国に追加することができるそれぞれの異なるアップグレードについての情報を保持し、それはセットアップ関数を介してスクリプトに渡され、その関数ではパブリック変数 "info"が渡されたものに割り当てられます。ユニティ(C#) - パブリック変数は特定の関数では機能しません
アップデート機能私が書いた場合、:
Debug.Log("Perk Name: " + info.Name);
をそれは「キャノン」や「壁」など
私に語った。しかし、私はボタンが押されたときに実行される関数でそれにアクセスしようとすると、それがいることを私に語りました"info"はnullです。
セットアップ機能は常にボタンが押された機能の前に実行され、同じ機能を持つ唯一の機能である正しい機能を常に伝えるので、同じグローバル変数がアップデート機能で機能します。異なるグローバル変数もこれだけの機能でNULLとして示しています。あなたがより多くの詳細が必要な場合
すべてのヘルプ感謝、
おかげ
EDITをお願いします。
EDIT 2:
private KingdomPerk info;
public void Setup(KingdomPerk data)
{
info = data;
perkName.text = data.Name;
perkType.text = "Type: " + data.Type.ToString();
perkHealth.text = "Health: " + data.Health.ToString() + "HP";
perkUpgradeCost.text = "Upgrade Cost: " + data.UpgradeCost.ToString();
perkImage.sprite = data.Sprite;
}
public void UpgradeButtonPressed()
{
float money = FindObjectOfType<MapGenerator>().worldInfo.money;
if (money >= info.UpgradeCost && info.Level != info.MaxUpgradeLevel)
{
Debug.Log("We've got enough!");
money -= info.UpgradeCost;
info.DamagePerShot *= info.DamageMultiplier;
info.Health *= info.HealthMultiplier;
info.Level++;
info.UpgradeCost *= info.CostMultiplier;
info.FireRate *= info.FireRateMultiplier;
RefreshInfo();
}
else if (money < info.UpgradeCost)
Debug.Log("Get more money!");
else if (info.Level == info.MaxUpgradeLevel)
Debug.Log("Already max level!");
}
セットアップが別のスクリプトで、ここに呼ばれている:
固定void RefreshListItems()
{
ClearListItems();
for (var i = 0; i < perks.Count; i++)
{
if (perks[i].UnlockLevel <= FindObjectOfType<MapGenerator>().worldInfo.playerLevel)
{
GameObject perkObject = Instantiate(itemPrefab);
perkObject.transform.SetParent(scrollViewTransform);
PerkListItem perkItem = perkObject.GetComponent<PerkListItem>();
perkItem.Setup(perks[i]);
upgradeGOList.Add(perkObject);
}
}
}
あなたのコードをもっと見せてください。つまり'info'が初期化されている場所、どこで使われているのか、どこで宣言されていますか?現在のところ根本的な原因を特定するのに十分なコンテキストがありません。 – Serlite
もう一度お知らせします。 –
'Setup(KingdomPerk data)'関数を呼び出し、 'info 'を初期化するために' KingdomPerk'の新しいインスタンスを渡す必要があります。 – Programmer