[Unity] Unity가 Headless 모드로 시작되었는지 확인하는 방법[UNET]

6139 단어 UnetUnity

개시하다


UNET를 전용 서버로 구축할 때는Headless 모드로 실행/구축하는 것이 좋을 것 같지만 한번 시도해 보면 호출NetworkManager.StartServer()의 단추를 누르지 못함→전용 서버로 시작할 수 없음(원래 UI가 표시되지 않는 모드임)을 알아차릴 수 없다.
운행시간에 헤드리스 모드 여부를 알지 못한 API는 자체 판단이 필요한 것으로 조사됐다.

이른바 Headless 모드


인용Unity 독립 유저의 명령행 매개 변수(공식 수첩).
게임이 표시되지 않고 사용자의 입력을 받지 않습니다.이것은 인터넷 게임에서 서버 운행이 가장 편리하다.

Headless 모드로 시작


구축된 응용 프로그램이 시작될 때 명령행 인자 '-batchmode' 를 입력하면Headless 모드에 들어갑니다.
Mac는 $ open (アプリ名).app --args -batchmode에서 부팅됩니다.

Headless 모드로 구성


"Build Settings"에서 Target Platform을 "Linux"로 설정한 후 "Development Build"검사를 취소하고 "Headless Mode"확인란에서 선택하여 구성합니다.

정부 수첩의 압출
Target Platform을 "Linux"로 설정하지 않으면 원래 확인란이 표시되지 않으며, "Development Build"에 확인란이 있으면 "Headless Mode"확인란에서 선택할 수 없습니다.

편집기 API에서 빌드 옵션의 Headless 모드를 True 으로 설정합니다.


APIEditorUserBuildSettings.enableHeadlessMode가 있습니다.Unity CloudBuild를 사용할 때 이 API를 사용하는 것 같습니다.
참조: How to enable headless mode on Unity Could Build?

확인 방법


두 가지 유형이 있는 것 같아요.
2019/9/13 보충
문서의 경우 Unity 2018.2부터는 일괄 처리 모드인지 판단하는 API가 추가된 것 같은데 그걸로 하는 게 좋을 것 같아요.
Application.isBatchMode(공식 문서)
추기는 여기까지다

SystemInfo.graphicsDeviceType으로 판단하기


인용자 Detect Headless Mode in Unity
using UnityEngine.Rendering;

// detect headless mode (which has graphicsDeviceType Null)
bool IsHeadless() {
    return SystemInfo.graphicsDeviceType == GraphicsDeviceType.Null;
}

SystemInfo.graphicsDeviceID로 판단


인용자 Determine if Unity is running in batch mode/headless mode
Checking SystemInfo.graphicsDeviceID == 0 works.
나는'헤헤~'하고 싶어서 iOS로 구축했다true(^o^)\Windows라면 제대로 작동합니까?나는 이 방법을 추천하지 않는다.

Mac의 독립판은 다른 방법이 필요합니다


"그랬구나~"라고 생각하며 맥의 독립된 아론-batchmode에 지었는데, 왠지 상술한 수치가 변하지 않았기 때문에 단순히 명령선 파라미터로 판단하는 것이 좋다(참고: Read Command Line Arguments.
return System.Environment.GetCommandLineArgs().Any(arg => arg == "-batchmode");
그나저나 -batchmode 시동을 걸어봐SystemInfo의 값을 모두 조사해 봤어요SystemInfo.graphicsMultiThreadedtruefalse였어요.하지만 이 값으로 판단하기에는 좀...

총결산


다음 코드로 판단하는 것이 좋습니다.
public bool isHeadlessMode
{
    if (Application.isMobilePlatform)
    {
        return false;
    }
#if UNITY_STANDALONE_OSX
    return System.Environment.GetCommandLineArgs().Any(arg => arg == "-batchmode");
#else
    return SystemInfo.graphicsDeviceType == GraphicsDeviceType.Null;
#endif
}

연관성

  • UNET용 Network Behaviour 클래스의 콜백 및 컨텍스트 플래그 트랩
  • UNET를 버리고 Photon을 사용하는 이유.
  • 좋은 웹페이지 즐겨찾기