2016-06-19 37 views
1

我目前使用Unity并使用C#语言。在Unity3D项目中添加C#中的延迟

到目前为止,我需要做一些事情(在最小的情况下,加载另一个场景)。

我的问题是,如何使这个事情发生几秒钟后,我把光标放在该区域?

这是我现在的代码。

if (_newGameButton.Contains (Event.current.mousePosition)) { 
       Application.LoadLevel (1); 
       Destroy (this); 
      } 

我想在_newGameButton激活时添加延迟。现在,当我将光标移到_newGameButton上时,它会立即加载场景1。我尝试了很多方法,例如使用Invoke和WaitForSeconds。没有用。如果错误是我如何使用它,那么正确的方式如何?非常感谢你的帮助。

编辑:这个问题已解答,我在Activate and Deactivate Invoke function有另一个问题。

+0

Mikurin在Unity中创建计时器,只需使用** Invoke **即可。好简单。 – Fattie

回答

2

为了使计时器和拖延统一,简单地使用调用

void Start() 
{ 
Debug.Log("hello from Start."); 
Invoke("Test", 3f); 
} 

private void Test() 
{ 
Debug.Log("hello from 'Test'"); 
} 

而且非常方便的是InvokeRepeating

Invoke("Test", 5f, 0.5f); 

就是这么简单。

在你的情况

if (_newGameButton.Contains (Event.current.mousePosition)) 
    { 
    Invoke("YourSceneName"); 
    } 

private void ChangeScenes() 
{ 
UnityEngine.SceneManagement.SceneManager.LoadScene("ScreenMain"); 
} 

必须使用场景名称。不要忘记,你必须把场景拖到你的场景列表中。查看“构建设置”“构建场景”。


这不是真的你如何在统一加载场景,这些天。他们改变了语法。如果要加载异步

AsyncOperation ao; 
ao = UnityEngine.SceneManagement.SceneManager.LoadSceneAsync("SceneName"); 
while (!ao.isDone) 
    { 
    Debug.Log("loading " +ao.progress.ToString("f2")); 
    yield return null; 
    } 

如果您对现场装载有任何疑问,请分别将它们作为新的问题,它更是这样......

UnityEngine.SceneManagement.SceneManager.LoadScene("ScreenMain"); 

。请注意,你几乎肯定不应该这样做“Destroy(this);”。

+0

我使用Unity 5.1.1,SceneManagement不起作用。 而且使用Invoke也不起作用。我的if就是onGUI函数。 ChangeScenes函数必须在onGUI函数之后还是之前? – Mikuriin

+0

嗨,你是说这不起作用:'UnityEngine.SceneManagement.SceneManager .LoadScene(“ScreenMain”);'@Mikuriin – Fattie

+0

是的。但实际上并不重要。问题是_newGameButton是一个矩形而不是一个按钮,我用来加载场景的函数在onGUI函数中,我混淆了我应该在哪里放置ChangeScenes函数。在onGUI函数之后或之前。 – Mikuriin

1

好生病帮助你理解更大的东西,然后暂停,因为它似乎你正试图在OnClick事件上创建,现在它的使用方式不同。

你真的想要做的就是创建SceneLoader脚本它可以是一个非常普遍的脚本,如下面

using UnityEngine; 
using UnityEngine.UI; 
public class UIController : MonoBehaviour { 

public int numOfSceneToLoad; // number of the scene from the build settings 

    public void LoadSceneNumber(numOfSceneToLoad){ 
    UnityEngine.SceneManagement.SceneManager.LoadScene(numOfSceneToLoad); 
    } 

} 

,然后要将此脚本附加到你的主UI帆布/ Holderplace ,去你的按钮,在检查员的底部,你会看到onClick(), 点击+符号,然后进行如下设置,将附加了该脚本的对象拖放到“运行时”在那个小的onClick()窗口中滚动,然后滚动并找到我们刚刚创建的这个特定的函数,并且在那里你可以修改numOfSceneToLoad的值到你想要加载的场景,并且你有一个Dynamic scr ipt加载你想要的任何场景。

在这个笔记上,虐待你的一些相当惊人的toturials由团结,将教你如何做一个适当的用户界面在unity5。

http://unity3d.com/learn/tutorials/topics/user-interface-ui/ui-button

+0

这是一个很好的解释。 – Fattie

0

从你的描述,它看起来对我来说,你的_newGameButton设置默认为无效,而你是想活跃和用户数的延迟之后棘手。

对于您可以创建一个脚本,并保持它的_newGameButton参考,像这样:

public GameObject _newGameButton; 

,并在事件说GameOver,实现这样的:

void GameOver() 
{ 
    Invoke("EnableNewGameButtonAfterDelay", 5f); 
} 


void EnableNewGameButtonAfterDelay() 
{ 
    _newGameButton.SetActive(true); 
    // now this game object is active and user can click on it. 
} 

在这例如,我证明游戏已经结束,并且在5秒延迟后用户将新游戏按钮设置为启用。 [此代码不是可执行形式,只是给你一个想法]

希望这有助于!

+0

_newGameButton是一个矩形而不是一个按钮。案例是我使用Asset Store中的Kinect和Kinect MS-SDK,我不知道如何使用Kinect单击,所以我使用矩形来代替发生事件。然后,如果光标移动到矩形,它会立即发生。所以它不能使用_newGameButton.SetActive – Mikuriin