Как я могу связать свои скрипты на C #, чтобы количество предметов влияло на счет в моей игре Unity? - PullRequest
0 голосов
/ 06 октября 2018

Я пытаюсь сделать так, чтобы при сборе предмета счет увеличивался.Изучив документацию по Unity, я написал следующие скрипты на C #.CollectableItem.cs прикрепляется к предметам в игре.ScoreBoard.cs прикреплен к отображению пользовательского интерфейса.Я получаю сообщение об ошибке: «ScoreBoard.score недоступен из-за уровня защиты».Если я сделаю переменные в ScoreBoard.cs общедоступными, я получу другое сообщение об ошибке: «Ссылка на объект требуется для нестатического поля, метода или свойства« ScoreBoard.score ».»

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

public class CollectibleItem : MonoBehaviour {

    [SerializeField] private string itemName;
    [SerializeField] private int pointsValue;

    void OnTriggerEnter(Collider other) {
        Managers.Inventory.AddItem(itemName);
        Destroy(this.gameObject);
        ScoreBoard.score += pointsValue;
    }
}


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

public class ScoreBoard : MonoBehaviour {

    [SerializeField] private Text scoreLabel;
    private int score;

    void Start () {
        score = 0;
    }

    void Update () {
        scoreLabel.text = "Score: " + score.ToString();
    }
}

ОБНОВЛЕНИЕ: Вот взять 2 на CollectibleItem.cs.Теперь мне сообщили, что «доска» не существует в текущем контексте ...

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

public class CollectibleItem : MonoBehaviour {
    [SerializeField] private string itemName;
    [SerializeField] private int pointsValue;

    void Start() {
        var uiObject = GameObject.Find("Timer");
        ScoreBoard board = uiObject.GetComponent<ScoreBoard>();
    }

    void OnTriggerEnter(Collider other) {
        Managers.Inventory.AddItem(itemName);
        Destroy(this.gameObject);
        board.score += pointsValue;
    }
}

1 Ответ

0 голосов
/ 06 октября 2018

Это не может работать, потому что вы делаете так называемый статический доступ к классу ScoreBoard.Это означает, что вы пытаетесь изменить переменную класса ScoreBoard.Что вы хотите сделать, это изменить переменную в одном из экземпляров.Когда объект пользовательского интерфейса создан, создается экземпляр класса вашего ScoreBoard-Script.Как и у каждого предмета есть свой экземпляр CollectibleItem.Вы можете получить экземпляр следующим образом:

var uiObject = GameObject.Find("Name of UI Object");
ScoreBoard board = uiObject.GetComponent<ScoreBoard>();

Вы можете сделать это в Start () и сохранить переменную ScoreBoard в сценарии, где находятся ваши другие личные переменные, и использовать ее позже в триггере, или выВы можете сделать это непосредственно в функции триггера и напрямую установить счет:

board.score += pointsValue;

РЕДАКТИРОВАТЬ: Вы должны поместить объявление табло внутри класса:

ScoreBoard board;

void Start ()
...

или поставить кодот начала до OnTriggerEnter.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...