Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/unity3d/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
选择游戏对象并使用GUI.Button(EventTrigger)执行操作_Button_Unity3d_Unityscript_Raycasting - Fatal编程技术网

选择游戏对象并使用GUI.Button(EventTrigger)执行操作

选择游戏对象并使用GUI.Button(EventTrigger)执行操作,button,unity3d,unityscript,raycasting,Button,Unity3d,Unityscript,Raycasting,我目前正在做一个战略游戏,我想使用游戏对象上的GUI.Button来执行动作。我正在使用光线投射和鼠标单击来选择对象,但是当我单击GUI时,按钮将执行另一个操作,按钮将消失。我想用这个按钮打开另一个GUI.Box来显示一些描述 我知道为什么按钮会消失,这是因为我在更新功能中将光线投射到我的按钮点击上,但我如何才能避免这种情况?我也知道我必须使用EventTrigger,但我不熟悉javascript event trigger,我在网上搜索过,但找不到任何有用的javascript 截图:

我目前正在做一个战略游戏,我想使用游戏对象上的GUI.Button来执行动作。我正在使用光线投射和鼠标单击来选择对象,但是当我单击GUI时,按钮将执行另一个操作,按钮将消失。我想用这个按钮打开另一个GUI.Box来显示一些描述

我知道为什么按钮会消失,这是因为我在更新功能中将光线投射到我的按钮点击上,但我如何才能避免这种情况?我也知道我必须使用EventTrigger,但我不熟悉javascript event trigger,我在网上搜索过,但找不到任何有用的javascript

截图:

这是我的剧本:

@HideInInspector
var isCalled:int = 0;
@HideInInspector
var scWidth:int = 0;
@HideInInspector
var scHeight:int = 0;
function Start () {
    scWidth = Screen.width;
    scHeight = Screen.height;        
}

function Update () {
    if (Input.GetMouseButtonDown(0)) {
        var ray : Ray = Camera.main.ScreenPointToRay (Input.mousePosition);
        var hit : RaycastHit;
        if (Physics.Raycast (ray, hit)) {
            if (hit.collider.tag == "House") {
                isCalled = 1;
            } else{
                isCalled = 0;
            }
        }
    }
}

function OnGUI(){
    if(isCalled==1)
        GUI.Button(Rect(scWidth/2,(scHeight/2)+(scHeight/4),120,120), name);
    }
}

如果我没弄错的话,问题是当你点击按钮时,光线投射会在点击按钮之前被激活,你选择了不同的对象或者根本没有对象,按钮消失或者重新出现,但是对于另一个对象,你需要做的是检查你是否点击了GUI,如果是的话,不要投射选择对象的光线投射。这是你要怎么做的

var selectedUI : GameObject = EventSystem.current.currentSelectedGameObject;
if (Input.GetMouseButtonDown(0) && selectedUI) {
       var ray : Ray = Camera.main.ScreenPointToRay (Input.mousePosition);
       var hit : RaycastHit;
       if (Physics.Raycast (ray, hit)) {
           if (hit.collider.tag == "House") {
           isCalled = 1;
          } else{
           isCalled = 0;
           }
        }
}

我在C#中工作,所以我可能犯了一些语法错误,但逻辑是正确的。

如果我理解正确,问题是当您单击按钮时,光线投射会在按钮单击之前启动,您选择了不同的对象或根本没有对象,按钮消失或重新出现,但对于另一个对象,您需要做的是检查是否单击了GUI,如果是,则不投影选择对象的光线投射。这是你要怎么做的

var selectedUI : GameObject = EventSystem.current.currentSelectedGameObject;
if (Input.GetMouseButtonDown(0) && selectedUI) {
       var ray : Ray = Camera.main.ScreenPointToRay (Input.mousePosition);
       var hit : RaycastHit;
       if (Physics.Raycast (ray, hit)) {
           if (hit.collider.tag == "House") {
           isCalled = 1;
          } else{
           isCalled = 0;
           }
        }
}

我在C#中工作,所以我可能会犯一些语法错误,但逻辑是正确的。

我认为最简单的方法是创建一个不可见但有碰撞器的游戏对象(输入拦截器)。将其放置在摄影机和标高对象之间,然后将其禁用。当您使用Raycast选择一个游戏对象时,您可以启用该输入拦截器游戏对象,并将其放置在所选游戏对象和GUI的区域周围。如果光线投射与输入拦截器发生碰撞,则必须忽略选择。当你取消选择游戏对象,然后你停用输入拦截器 您还应保持游戏的当前状态,例如:

enum State
{
    NothingSelected = 0,
    GameobjectSelected,
    BigMenuOpen
}
State currentState;

因此,根据状态,您可以定义鼠标单击时的行为。比如如果全屏菜单打开,那么光线投射就不会发射。

我认为最简单的方法是创建一个不可见但有碰撞器的游戏对象(输入拦截器)。将其放置在摄影机和标高对象之间,然后将其禁用。当您使用Raycast选择一个游戏对象时,您可以启用该输入拦截器游戏对象,并将其放置在所选游戏对象和GUI的区域周围。如果光线投射与输入拦截器发生碰撞,则必须忽略选择。当你取消选择游戏对象,然后你停用输入拦截器 您还应保持游戏的当前状态,例如:

enum State
{
    NothingSelected = 0,
    GameobjectSelected,
    BigMenuOpen
}
State currentState;

因此,根据状态,您可以定义鼠标单击时的行为。例如,如果全屏菜单打开,则raycast不会启动。

当鼠标位于GUI元素上时,使用传统GUI系统可以避免raycast。使用工具提示控制是否可以投射光线=)

类似这样的事情(我也不与我们合作,因此我是否需要一些工作):

如果在显示“弹出”窗口/面板时需要避免光线投射,但不需要工具提示,也可以使用MouseOverGUI管理器

它只是一个静态或单例,其中包含一个布尔值,当鼠标位于不希望使用(Event.current.mousePosition)投射光线的某个矩形上时,您将该布尔值设置为true;当鼠标超出该矩形时,将该布尔值设置为false

使用此布尔值(带或不带工具提示变量)可允许光线投射:

if(!MouseManager.MouseOverGUI) {
    // raycast logic
}

请注意,在每个OnGUI循环中创建rect将很难捕获它并控制MouseOverGUI。另外,对于性能来说,这是一种不好的做法,因为OnGUI每帧运行不止一次,所以我建议您只创建一次矩形(仅在需要时重新计算),并将其传递给GUI元素;)

在使用遗留GUI系统时,有一个很好的技巧可以避免鼠标悬停在GUI元素上时的光线投射。使用工具提示控制是否可以投射光线=)

类似这样的事情(我也不与我们合作,因此我是否需要一些工作):

如果在显示“弹出”窗口/面板时需要避免光线投射,但不需要工具提示,也可以使用MouseOverGUI管理器

它只是一个静态或单例,其中包含一个布尔值,当鼠标位于不希望使用(Event.current.mousePosition)投射光线的某个矩形上时,您将该布尔值设置为true;当鼠标超出该矩形时,将该布尔值设置为false

使用此布尔值(带或不带工具提示变量)可允许光线投射:

if(!MouseManager.MouseOverGUI) {
    // raycast logic
}

请注意,在每个OnGUI循环中创建rect将很难捕获它并控制MouseOverGUI。另外,对于性能来说,这是一种不好的做法,因为OnGUI每帧运行不止一次,所以我建议您只创建一次矩形(仅在需要时重新计算),并将其传递给GUI元素;)

你能不能再解释一下,你想达到什么目的?你想点击按钮,隐藏它,然后显示另一个GUI元素吗?是的,就像著名的游戏《部落冲突》。例如,当您单击“升级”按钮时,会打开另一个页面,其中包含说明。由于这是在更新功能中,光线投射会不断检查与提供的标记的冲突,这就是为什么当我同时单击按钮时,光线投射会从相机拍摄到按钮,并且由于按钮没有任何标记,因此它不会检测到任何内容,也不会显示任何内容。因此,不要使用光线投射来检测按钮单击。您通常可以使用
if(GUI.Button(…){//do stuff when Button is click}
raycast在那里查找被单击的对象,例如,中间的球体是house。假设立方体是hospital等等。因此,首先我需要检查选择了哪个对象