我正在开发一个包含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停留在屏幕上
谢谢