Получить функцию из другого класса в том же пространстве имен (для объекта-клона) в единице, c # - PullRequest
0 голосов
/ 04 июня 2018

Я не могу понять, что такое правильное решение, поэтому я надеюсь, что кто-то может мне помочь / объяснить, что я делаю неправильно:

У меня два класса в одном пространстве имен farm;WhichAnimal.cs и Pig.cs.Я пытаюсь получить функцию EatFood() от Pig.cs до WhichAnimal.cs.Объект с прикрепленным к нему скриптом Pig.cs создается только при запуске сцены и является клоном префаба в папке assets / prefabs.

Что я делаю неправильно / как заставить работать функцию EatFood() в скрипте WhichAnimal?

Класс Pig:

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

namespace Farm {
class Pig : MonoBehaviour
{

    public GameObject Balloon;
    public Text text;
    public string name;

    public void EatFood()
    {
        Balloon.SetActive(true);
        text.text = "";
    }
}

Класс WhichAnimal:

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

namespace Farm {
public class WhichAnimal : MonoBehaviour {

    public Pig pig;

     public void Start() {
         pig = GetComponent<Pig>().EatFood();
     }

     public void GiveFood() {
        pig.EatFood();
     }
}

Ответы [ 2 ]

0 голосов
/ 04 июня 2018

Я думаю, что проблема в:

public void Start() {
     pig = GetComponent<Pig>().EatFood();
}

GetComponent<Pig>() попытается найти компонент (класс, производный от monobehaviour) Pig, который присоединен к тому же gameObject, что и скрипт, которыйзвонит GetComponent.Это означает, что для того, чтобы это работало, вам нужно Pig и WhichAnimal для одного и того же gameObject.

Итак, первое решение - получить экземпляр Pig при создании экземпляра gameObject с помощью этого сценария.

Другое решение, используйте Object.FindObjectOfType<Pig>(), чтобы найти экземпляр Pig или FindObjectsOfType<Pig>(), чтобы иметь массив Pig, если существует более одного ^^.

Но используйтеэто с осторожностью, а не каждый кадр, только один раз.Это может быть ресурсоемким.

0 голосов
/ 04 июня 2018

Эта строка:

 pig = GetComponent<Pig>().EatFood();

неверно.GetComponent () заменяет ссылку на pig (которую вы установили в инспекторе) на ноль (если у вас нет компонента в том же gameObject), но EatFood возвращает void, а не pig, так что строка не должна даже компилироваться

Если Свинья свинья - это уже существующая ссылка, вы можете пропустить эту строку и просто вызвать EatFood () для свиньи.

Вам нужно следить за тем, чтобы свинья была заранее приготовленной., он должен иметь ссылку на baloon, иначе Baloon.SetActive () может вернуть ноль.Я думаю, что вы можете вызвать его на объекте, который уже существует (сериализуется инспектором), а не на сборном

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