Единство общения между скриптами - PullRequest
0 голосов
/ 31 января 2019

Я делаю игру Unity3D.Я хочу реализовать соединение между скриптом Timer.cs и Collide.cs, с помощью которого они обмениваются переменной obji.И прежде чем пометить этот вопрос как дубликат, хочу упомянуть, что уже прочитал этот урок .В результате предоставленного решения я получаю ошибку

Пространство имен не может напрямую содержать элементы, такие как поля или методы

Можете ли вы предоставить решение для обмена информацией между сценариямикоторые не имеют общего элемента.Я хочу, чтобы Timer.cs получил переменную obji из Collide.cs

Timer.cs

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

public class Timer : MonoBehaviour
{
    public ScoresManager ScoresManager;
    Text instruction;
    // Start is called before the first frame update
    void Start()
    {
        instruction = GetComponent<Text>();
        InvokeRepeating("time", 0, 1);

    }
    void time() {


        if (timeLeft <= 0){
        /*   if(move.obji() <= 0){
                instruction.text = "You win!";
            }else{
                instruction.text = "You lost!";
            }*/


} else {
            timeLeft = timeLeft - 1;
            instruction.text = (timeLeft).ToString();
        }
    }
    // Update is called once per frame
    int timeLeft = 30;

    void Update()
    {
    }
}

Collide.cs

using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using UnityEngine.UI;
    public class Collide : MonoBehaviour
{
    public Text txt;
    public int obji = -1; //this is an example, I always try to initialize my variables.
    void Start()
    { //or Awake
        obji = GameObject.FindGameObjectsWithTag("Enemy").Length;
    }
    void OnCollisionEnter(Collision collision)
    {

        if (collision.collider.gameObject.tag == "Enemy")
        {

            transform.localScale -= new Vector3(0.03F, 0.03F, 0.03F);


            Destroy(collision.collider.gameObject);
            obji = obji - 1;
            Debug.Log(obji);

            if ((obji) > 0)
            {
                txt.text = (obji).ToString();
            }
            else {
                txt.text = "You win!";
            }
        }
    }
}

Editor view 1

Editor view 2

Ответы [ 2 ]

0 голосов
/ 31 января 2019

Ошибка, которую вы однажды получили:

Пространство имен не может напрямую содержать элементы, такие как поля или методы,

сообщает, что в пространство имен нельзя поместитьлюбые методы или поля (т.е. переменные) напрямую.Пространство имен может содержать только

  • классов,
  • интерфейсов,
  • перечислений,
  • делегатов,
  • структур
  • пространств имен.

Вообще говоря, пространство имен используется для обеспечения определенной области действия и организации сущностей.


Существует множество способов получить доступ к полям члена другого класса.Самый чистый и простой способ - через так называемый метод Getter (также через get properties ).Вы должны избегать использования и ссылок на открытые поля.Например, в вашем классе Collide

// You don't have to always initialize your fields: they have default values. 
// Initialize only when you need to. 
private int obji;

...

public int GetObji() {
    return obji;
}

Теперь, чтобы вызвать этот метод, вам нужна правильная ссылка на него.Для этого вы можете просто добавить это в качестве параметра в свой класс Timer:

public Collide CollideRef;
...
// Get the field
CollideRef.GetObji();

, а затем просто перетащить GameObject с компонентом Collide на него.

0 голосов
/ 31 января 2019

Такое взаимодействие между скриптами (совместное использование свойств одного класса с другим классом) является очень распространенной задачей в Unity.Сценарий, которому необходимо значение свойства другого класса, должен получить ссылку на этот другой класс.

В вашем примере, поскольку Timer требуется доступ к свойству obji из класса Collide, необходимо добавить ссылку на класс Collide в класс Timer:

public class Timer : MonoBehaviour
{
    public Collide _collide;

    // The rest of the script...
}

Затем в Инспекторе в Unity вам нужно перетащить GameObject, к которому прикреплен скрипт Collide, к свойству _collide объекта GameObject со присоединенным скриптом Timer.

Наконец, вы можете получить доступ к свойству obji через вновь созданную ссылку:

if (_collide.obji > 0)

См. это руководство от Unity , в котором подробно рассматривается эта тема.

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