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