Unity WebGL의 Build and 실행 런의 확장

WebGL 빌딩을 만들 때마다 고생이 많네요.


유닛에서 웹글 작업하면 Build and Run만 하고 싶은 런!!그런 생각이 듭니다.
구글을 사용하면 크롬을 확장하는 등 다양한 방법이 있지만 유니티 에디터에서는 완결된 기사를 보지 못했다.Unity Editor로 조사 제작을 끝내고 싶어서요.Windows UnityEditor(20.1f1)에서 작업을 확인합니다.
WebGLRunStop.cs
using System;
using System.Diagnostics;
using System.Threading;
using UnityEditor;
using UnityEngine;

public class WebGLRunStop
{

    private static Process process;
    
    [MenuItem("WebGL/Run")]
    static void Run()
    {
        if (process != null) return;
        var unityEditorDirectory = AppDomain.CurrentDomain.BaseDirectory;
        var buildTool = unityEditorDirectory + "/Data/PlaybackEngines/WebGLSupport/BuildTools/";
        var pythonHome = $"{buildTool}Emscripten_Win/python/2.7.5.3_64bit/";
        var python = $"{pythonHome}python.exe".Replace("/", "\\");
        var emrun = $"{buildTool}Emscripten/emrun.py".Replace("/", "\\");

	var rootDirectory = $"{WebGLビルドをしたindex.htmlが存在するディレクトリ}".Replace("/", "\\");
                
        Environment.SetEnvironmentVariable("PYTHON_HOME", pythonHome, EnvironmentVariableTarget.Process);
        Environment.SetEnvironmentVariable("PATH", $"{pythonHome}", EnvironmentVariableTarget.Process);
        Environment.SetEnvironmentVariable("DYLD_LIBRARY_PATH", $"{pythonHome}/Lib;", EnvironmentVariableTarget.Process);
        Environment.SetEnvironmentVariable("PYTHONPATH", $"{pythonHome}/Dlls;{pythonHome}/Lib;{pythonHome}/Lib/site-packages;", EnvironmentVariableTarget.Process);

        ThreadPool.QueueUserWorkItem(_ =>
        {
            process = new Process
            {
                StartInfo =
                {
                    FileName = $"\"{python}\"",
                    Arguments = $"\"{emrun}\" --port=5000 \"{rootDirectory}index.html\" getParameter=hogehoge",
                    UseShellExecute = false,
                    CreateNoWindow = true
                }
            };
            process.Exited += (sender, e) =>
            {
                process.Dispose();
                process = null;
            };
            process.Start();
        });
    }

    [MenuItem("WebGL/Stop")]
    static void Stop()
    {
        var hasExited = process?.HasExited ?? false;
        if (hasExited) return;
        process.CloseMainWindow();
        process.Dispose();
        process = null;
    }
}
전문입니다.
조금만 정리하면 UnityのWebGLビルドツールの中にPythonでWebServerを立てる環境があったので乗っかりました 느낌이 든다.
조금 나누어 설명하다.
// 現在実行しているexeの場所(Editorで実行しているのでUnity.exeの場所)
var unityEditorDirectory = AppDomain.CurrentDomain.BaseDirectory;
// WebGLのビルドをサポートしているとあるディレクトリ
var buildTool = unityEditorDirectory + "/Data/PlaybackEngines/WebGLSupport/BuildTools/";
// Pythonの実行環境
var pythonHome = $"{buildTool}Emscripten_Win/python/2.7.5.3_64bit/";
var python = $"{pythonHome}python.exe".Replace("/", "\\");
var emrun = $"{buildTool}Emscripten/emrun.py".Replace("/", "\\");

var rootDirectory = $"{WebGLビルドをしたindex.htmlが存在するディレクトリ}".Replace("/", "\\");

// PCのPython環境を見に行かないようにWebGLビルド用のPython環境を構築
Environment.SetEnvironmentVariable("PYTHON_HOME", pythonHome, EnvironmentVariableTarget.Process);
Environment.SetEnvironmentVariable("PATH", $"{pythonHome}", EnvironmentVariableTarget.Process);
Environment.SetEnvironmentVariable("DYLD_LIBRARY_PATH", $"{pythonHome}/Lib;", EnvironmentVariableTarget.Process);
Environment.SetEnvironmentVariable("PYTHONPATH", $"{pythonHome}/Dlls;{pythonHome}/Lib;{pythonHome}/Lib/site-packages;", EnvironmentVariableTarget.Process);
먼저 상기 코드부터 시작합니다.댓글을 조금 달았다.대체로 평론과 같다.
나는 여기서 특별히 강조해야 할 것은 파이톤의 환경이라고 생각한다.파이톤은 환경 변수에 의존해 dll 등을 찾기 때문에 의도적인 사람을 대상으로 한다.솔직히 여기 있는 코드는 이전에 Unity 내부에 파이톤의 실행 환경을 구축할 때 실행된 코드로 기본적으로 복제된 것이기 때문에 최소한의 코드가 아니라고 생각하기 때문에 삭제하고 싶으면 반드시 삭제해 주십시오.이전에 구축한 이야기→
Unity의StreamingAssets에서 파이썬 환경을 구축해 봤습니다.
// メインスレッドで実行するとUnityを操作できなくなるので別スレッドでProcess起動する
ThreadPool.QueueUserWorkItem(_ =>
{
    process = new Process
    {
	StartInfo =
	{
	    FileName = $"\"{python}\"",
	    // emrunの引数は.pyを見て追記が必要であれば追記
	    // index.htmlの後にGETパラメータの形にするとちゃんとURLに組み込まれる
	    Arguments = $"\"{emrun}\" --port=5000 \"{rootDirectory}index.html\" getParameter=hogehoge",
	    UseShellExecute = false,
	    CreateNoWindow = true
	}
    };
    process.Exited += (sender, e) =>
    {
	process.Dispose();
	process = null;
    };
    process.Start();
});
실제 Process를 시작하는 코드는 다음과 같습니다.이것과 Stopess 부분은 특별히 쓸 곳이 없어서 생략합니다.

총결산


자기 환경에서만 해봤기 때문에 생각지도 못한 행동이 있을 수도 있다.만약 무슨 문제가 있으면 저에게 알려주세요. 제가 반영할 테니 현지 환경에서 치료하세요.
이번 확장이 있으면 매번 하지 않아도 Build and Run 포트를 지정할 수 있어 편리할 것 같습니다.

좋은 웹페이지 즐겨찾기