Что делает ‘Попытка вызвать метод: (имя файла).(Имя функции) не может быть названо «означает в единстве»?

#c# #unity3d

Вопрос:

Я пытаюсь создать игру в unity, где это просто простая фермерская игра, так как это мой первый проект. Функция invoke не имеет параметров, так что это не может быть проблемой. вот код:

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

public class PlantAndHarvest : MonoBehaviour
{
    //Variables here
    public float reach, germinationTime;
    public GameObject mainCamera, turnip;
    private GameObject item;
    public Text txt;
    RaycastHit hit;
    RaycastHit onFarmLand;
    public LayerMask layerMask, farmLand;

    // Voids here
    void Plant()
    {
        if (Physics.SphereCast(transform.position, 0.48f, Vector3.down, out onFarmLand, 1.5f, farmLand))
        {
            txt.text = "Click Left Ctrl to plant the turnip";
            if (Input.GetKeyDown(KeyCode.LeftControl))
            {
                Vector3 pos = new Vector3(transform.position.x, 0, transform.position.z);
                void SpawnTurnip()
                {
                    Instantiate(turnip, new Vector3(pos.x, 0, pos.z), Quaternion.identity);
                }
                Invoke("SpawnTurnip", germinationTime);
 

Вы можете видеть, что в этом и заключается ошибка.

             }
        }
    }
    void Harvest()
    {
        if (Physics.Raycast(transform.position, mainCamera.transform.forward, out hit, reach, layerMask))
        {
            txt.text = "Click Left Ctrl To Grab The Object";
            if (Input.GetAxis("Fire1") == 1)
            {
                Destroy(hit.transform.gameObject);
            }
        }
        else
        {
            txt.text = "";
        }
    }
    // Start is called before the first frame update
    void Start()
    {
        
    }

    // Update is called once per frame
    void Update()
    {
        Plant();
        Harvest();
    }
}
 

Любая помощь будет очень признательна!

Комментарии:

1. Вероятно, потому, что он вложен в растение

Ответ №1:

Скорее всего, проблема в том, что, поскольку SpawnTurnip определяется как вложенная функция, MonoBehavior.Invoke не удается ее найти. Invoke это не магия; он просто использует отражение для поиска в текущем классе соответствующего имени метода. Поскольку метод на самом деле представлен в классе — вы не могли сделать PlantAndHarvest pah = new PlantAndHarvest(); pah.SpawnTurnip(); ни того, ни другого — Invoke не можете его найти.

Было бы неплохо передать ссылку на SpawnTurnip — она находится в области действия, поэтому вы могли бы использовать ее как delegate — например Action st = SpawnTurnip; , а затем перейти st к чему — то-но по какой-то причине Invoke не принимает делегатов (несмотря на то, что они значительно быстрее, чем поиск функции по имени). Возможно, в Unity есть лучший способ сделать это.

Вы также можете попытаться выяснить полное имя SpawnTurnip функции, возможно, сохранив его в переменной, а затем проверив поля. На самом деле я не уверен, как получить полное имя делегата, и даже не гарантируется, что Invoke он примет полное имя.

Комментарии:

1. У меня не может быть SpawnTurnip ничего, кроме вложенной функции, потому что я использую переменную , определенную в функции, которая есть pos , так что у вас есть какие-либо идеи, чтобы ее можно было pos определить без того, чтобы она уже была определена как позиция игроков?

2. Неважно, я просто понял, что мог бы pos быть наверху с другими переменными, но оставить их пустыми, а затем снова определить их в функции. Спасибо за помощь!