#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
быть наверху с другими переменными, но оставить их пустыми, а затем снова определить их в функции. Спасибо за помощь!