Вопрос или проблема
Я получил ошибку на строке ‘GameObject ui_element = result.gameObject;’
Имя ‘result’ не существует в текущем контексте.
Вот код:
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using UnityEngine.EventSystems;
using UnityEngine.InputSystem;
using UnityEngine.UI;
public class CubeMapChangeColor : MonoBehaviour
{
public GameObject ui_canvas;
GraphicRaycaster ui_raycaster;
PointerEventData click_data;
List<RaycastResult> click_results;
void Start()
{
ui_raycaster = ui_canvas.GetComponent<GraphicRaycaster>();
click_data = new PointerEventData(EventSystem.current);
click_results = new List<RaycastResult>();
}
void Update()
{
if(Mouse.current.leftButton.wasReleasedThisFrame)
{
GetUiElementsClicked();
}
}
void GetUiElementsClicked()
{
click_data.position = Mouse.current.position.ReadValue();
click_results.Clear();
ui_raycaster.Raycast(click_data, click_results);
foreach(RaycastResult result in click_results);
{
GameObject ui_element = result.gameObject;
Debug.Log(ui_element.name);
}
}
}
Я пробую этот код, который я получил с YouTube, но почему-то он не работает на моем ПК.
Я не знаю, в чем дело.
Ответ или решение
Ошибка "The name ‘result’ does not exist in the current context" возникает в вашей программе из-за неправильного использования конструкции foreach
. В вашем коде вы неправильно расставили точки с запятой, из-за чего компилятор не может распознать переменную result
в теле цикла.
Вот исправленная версия метода GetUiElementsClicked
, где была убрана лишняя точка с запятой после выражения foreach
:
void GetUiElementsClicked()
{
click_data.position = Mouse.current.position.ReadValue();
click_results.Clear();
ui_raycaster.Raycast(click_data, click_results);
// Убираем точку с запятой после foreach
foreach (RaycastResult result in click_results)
{
GameObject ui_element = result.gameObject;
Debug.Log(ui_element.name);
}
}
Объяснение изменений:
-
Убрана точка с запятой после
foreach
. Это было ключевым моментом — точка с запятой завершает оператор, и, следовательно, все, что идет после нее, оказывается вне цикла. -
После этого корректного объявления
foreach
переменнаяresult
будет доступна внутри фигурных скобок{}
и вы сможете использоватьresult.gameObject
.
Теперь ваш код должен работать правильно и отображать имена всех UI-элементов, по которым произошел клик.
Если вы по-прежнему сталкиваетесь с проблемами после внесения этих изменений, убедитесь, что все необходимые компоненты, такие как GraphicRaycaster
и EventSystem
, правильно настроены в вашей сцене Unity.