Unity / C#:在其外部单击时关闭 GUI

Unity / C#: Close GUI when when clicking outside of it

如何在单击外部 GUI 菜单时关闭它? 最聪明的方法是什么?

这里是两阶段 GUI 示例的图片:

以及所属代码,您可以随意将其用于您自己的目的:

using UnityEngine;
using System.Data;
using Mono.Data.SqliteClient;
using System.IO;
using System.Collections.Generic;
using System.Collections;
using UnityEngine.EventSystems;

public class menue2 : MonoBehaviour
{
    private Vector2 scrollViewVector = Vector2.zero;
    static int menueWidth = 125;
    static int menueHeight = 25;
    Rect dropDownRect1 = new Rect(0,0,menueWidth,menueHeight);
    Rect dropDownRect2 = new Rect (menueWidth, menueHeight, 170, menueHeight);

    // Menue Level 1
    public static string[] list = {"Navigation","Setup Ordner", "Optionen             Ordner", "Setup Dateien", "Optionen Dateien", "blabla"};

    // Menue Level 2
    public static string[] camSetup = {"Kamera Zoom Min.", "Kamera Zoom Max.",     "Kamera Geschw. Normal", "Kamera Geschw. Schnell"};
    public static string[] setupOrdner = {"Farbe = ","Höhe = ","setupFolder3","setupFolder4","setupFolder5","setupFolder6"};
    public static string[] optionenOrdner =      {"setupFolder1","setupFolder2","setupFolder3","setupFolder4","setupFolder5","set    upFolder6"};
    public static string[] setupDatei =     {"oooooo","ppp","üüüüüüüüü","qqqqqq","nnnnnnn","mmmm"};
    public static string[] optionenDatei = {"wwwww","eeeee","rrrrr","tttt","zzzzzzz","uuuuuu"};
    public static string[] blabla = {"aaaaa","ssssss","gggg","ddddd","jjjjjj","hhhhh"};

    public static string[][] listCollection = {camSetup, setupOrdner,     optionenOrdner, setupDatei, optionenDatei, blabla};

    int indexNumber;
    int indexNumber2;

    int level = 0;
    string lastClicked = null;

    public GameObject other;

    void OnGUI()
    {
        if (GUI.Button (new Rect ((dropDownRect1.x), dropDownRect1.y,     dropDownRect1.width, dropDownRect1.height), "Setup")) {
            if (level == 0) {
                level = 1;
                lastClicked = "Setup";
            } else if (level > 0)
                level = 0;
        }

        if (level >= 1) {
            for (int index = 0; index < list.Length; index++) {
                if (GUI.Button (new Rect (0, (index * 25 +     dropDownRect1.height), dropDownRect1.width, dropDownRect1.height), list     [index])) {
                    indexNumber = index;
                    level = 2;
                    lastClicked = (list [index]);
                }
            }

            if (level == 2 || level == 3) {
                for (int index = 0; index < camSetup.Length; index++) {
                    if (GUI.Button (new Rect (menueWidth, ((indexNumber *     menueHeight) + (index * menueHeight) + menueHeight), menueWidth, menueHeight),     listCollection [indexNumber] [index])) {
                        indexNumber2 = index;
                        level = 3;;
                        lastClicked = (listCollection [indexNumber] [index]);
                    }
                }
            }
        }

        if (Input.GetMouseButtonUp (0)) {
            print (lastClicked);
        }
    }

}

非常感谢您的帮助!

最后我坚持编写 GUI 脚本并找到了一个非常简单的解决方案。

void closeMenue()
{
    Vector2 mousePosition = new Vector2(Input.mousePosition.x, Input.mousePosition.y);
    if (Input.GetMouseButtonDown (0) && mousePosition.x > Screen.width/2 || Input.GetMouseButtonDown (0) && mousePosition.y < Screen.height/2)
    {
        level = 0; // closing everything
    }
}

所以我只是检查光标位置..这里调整为左上角的菜单。 当然,允许的区域可以很容易地更改为个人情况。