Ошибка “Имя ‘result’ не существует в текущем контексте”, Unity

Вопрос или проблема

Я получил ошибку на строке ‘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);
    }
}

Объяснение изменений:

  1. Убрана точка с запятой после foreach. Это было ключевым моментом — точка с запятой завершает оператор, и, следовательно, все, что идет после нее, оказывается вне цикла.

  2. После этого корректного объявления foreach переменная result будет доступна внутри фигурных скобок {} и вы сможете использовать result.gameObject.

Теперь ваш код должен работать правильно и отображать имена всех UI-элементов, по которым произошел клик.

Если вы по-прежнему сталкиваетесь с проблемами после внесения этих изменений, убедитесь, что все необходимые компоненты, такие как GraphicRaycaster и EventSystem, правильно настроены в вашей сцене Unity.

Оцените материал
Добавить комментарий

Капча загружается...