Как я могу получить доступ к общедоступной переменной из экземпляра объекта? - PullRequest
1 голос
/ 25 октября 2019

В настоящее время у меня есть объект GameMaster, который я использую для сохранения статистики в переходных сценах. Одно из полей, которое я храню, это значение playerMaxHealth. Я пытаюсь загрузить это значение в объект Player в значение playerStats.MaxHealth в начале каждой сцены. В этот момент мой экземпляр GameMaster работает отлично, и значения сохраняются от сцены к сцене, но у меня возникают проблемы с доступом к значению playerMaxHealth из недавно загруженного объекта Player. Я пробовал множество вещей, в том числе решения на этом сайте, и я никогда не смогу получить доступ к этому объекту. Я включил код из моей текущей попытки, в виде обоих сценариев, а также в текущее сообщение об ошибке (оно меняется с каждым другим методом, который я пробую). Как правильно получить доступ к этому значению и загрузить его в значение Player playerStats.MaxHealth?

GAMEMASTER:

    using System.Collections;
    using System.Collections.Generic;
    using UnityEngine;

    public class GameMaster : MonoBehaviour
    {
        public static GameMaster Instance;    

        public static int playerLevel = 1;
        public static int playerExp = 0;
        public static int expTilNextLevel = 1000;
        public static int playerMaxHealth = 100;


        void Awake () {
            if (Instance == null) {
                DontDestroyOnLoad(gameObject);
                Instance = this;
            }
            else if (Instance != this){
                Destroy (gameObject);
            }
        }

        void Update() {
            if(Input.GetKeyDown(KeyCode.L)){
                AddExp();
            }

            if(Input.GetKeyDown(KeyCode.H)){
                //Player.DamagePlayer(10);
            }
        }

        public static void KillPlayer (Player player) {
            Destroy (player.gameObject);
        }

        public static void KillEnemy (Enemy enemy) {
            Destroy (enemy.gameObject);
            AddExp();
        }

        private static void AddExp () {
            playerExp += 100;
            if (playerExp >= expTilNextLevel) {
                playerLevel++;
                playerExp = playerExp - expTilNextLevel;
                expTilNextLevel = (int)((float)expTilNextLevel * 1.5f);
            } 
            Debug.Log("Player Exp: " + playerExp + "/" + expTilNextLevel + "   Player Lvl: " + playerLevel);
        }

    }

PLAYER:



    using System.Collections;
    using System.Collections.Generic;
    using UnityEngine;

    public class Player : MonoBehaviour
    {

        [System.Serializable]
            public class PlayerStats {
            public int MaxHealth = 100;
            public int Health = 100;
            public int Exp = 0;
            public int Strength = 1;
        }

        public PlayerStats playerStats = new PlayerStats();


        void Start() {
            GameObject gameMaster = GameObject.FindWithTag("GameMaster") as GameObject;
            playerStats.MaxHealth = gameMaster.playerMaxHealth;
            Debug.Log("Player Max Health: ");
        }


        public void DamagePlayer(int damage){
            playerStats.Health -= damage;
            if (playerStats.Health <= 0) {
                GameMaster.KillPlayer(this);
                Debug.Log ("YOU DIED");
            }
        }

    }

Сообщение об ошибке: «GameObject» не содержит определения «playerMaxHealth» и недоступен метод расширения «playerMaxHealth»'можно найти первый аргумент типа' GameObject '(вам не хватает директивы using или ссылки на сборку?)

1 Ответ

1 голос
/ 25 октября 2019

Если GameMaster является компонентом, который присоединен к GameObject, тогда playerMaxHealth является свойством этого компонента, а не GameObject.

. То, что вы хотите сделать, это получитьсам компонент, так что вы можете получить доступ к переменной-члену.

например:

GameMaster gameMasterComponent = gameMaster.GetComponent<GameMaster>();

playerStats.MaxHealth = gameMasterComponent.playerMaxHealth;

В качестве альтернативы, поскольку вы рассматриваете GameMaster как одиночный, а playerMaxHealth является статическим, либоследующее также должно работать:

// as singleton 
playerStats.MaxHealth = GameMaster.Instance.playerMaxHealth;

// as static property
playerStats.MaxHealth = GameMaster.playerMaxHealth;
...