从线程更改场景

时间:2018-05-16 06:42:04

标签: c# unity3d

我正在开发一个包含3个场景的unity3d项目。

我在这个项目中有一个用C#编写的非常基本的Web服务器。

此C#类作为第一个场景的组件附加。

第一个场景是我们在应用程序运行时看到的场景。

以下是我想要做的事情:我想在用户调用特定网址时更改场景。

我在我的http服务器中使用此代码:

    SceneManager.LoadScene ("scene name");

我遇到了错误,因为只应在主线程上调用LoadScene。 所以我做了一些更改,以便将场景名称放在一个变量中。

然后,我从此变量值调用Update()方法中的LoadScene。 我不知道这是不是一件好事。

我没有错误,但场景在游戏中没有变化。

由于

**编辑**

这是我的源代码:

此第一个类与任何场景(组件)无关:

public class ServeurWeb
{
    private Scene1 main;

    public ServeurWeb (Scene1 main)
    {
        this.main = main;
        var newThread = new Thread(thread_serveur_web);
        newThread.Start();
    }

    private void thread_serveur_web()
    {
        var listener = new HttpListener();

        listener.Prefixes.Add("http://*:8084/");

        listener.Start();

        while (true)
        {
            try
            {
                var context = listener.GetContext();
                ThreadPool.QueueUserWorkItem(o => HandleRequest(context));
            }
            catch (Exception)
            {

            }
        }
    }

    private void HandleRequest(object state)
    {
        try
        {
            var context = (HttpListenerContext)state;

            if (context.Request.Url.AbsolutePath=="/scene1")
            {
                main.load_scene("scene1");
            }

            if (context.Request.Url.AbsolutePath=="/scene2")
            {
                main.load_scene("scene2");
            }
            if (context.Request.Url.AbsolutePath=="/scene3")
            {
                main.load_scene("scene3");
            }

            context.Response.StatusCode = 200;
            var buffer = System.Text.Encoding.UTF8.GetBytes("Hello!");
            context.Response.ContentLength64 = buffer.Length;
            var output = context.Response.OutputStream;
            output.Write(buffer, 0, buffer.Length);
            output.Close();
        }
        catch (Exception)
        {

        }
    }
}

在游戏对象中,第二个类作为组件附加到scene1:

using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using UnityEngine.SceneManagement;

public class Scene1 : MonoBehaviour {
    private ServeurWeb serveur;

    private string scene_active = "ecran_noir";

    public void load_scene(string scene)
    {
        this.scene_active = scene;
    }

    void Start () {
        serveur = new ServeurWeb (this);
    }

    void Update () {
        if (SceneManager.GetActiveScene ().name != scene_active) {
            SceneManager.LoadScene (scene_active);
        }
    }
}

当我运行项目时,我看到Scene1。 如果我在浏览器中调用http://localhost:8084/scene2,我可以看到scene2。 但是,接下来,如果我调用任何网址,我可以在我的浏览器中看到响应(线程处于活动状态),但是场景2停留在屏幕上

谢谢

0 个答案:

没有答案