UnassignedReferenceException: The variable {variable} of {script} has not been assigned.
You probably need to assign the {variable} variable of the {script} script in the inspector.
 
 

MonoBehaviour에 SerializeField로 정의된 변수에 아무 오브젝트도 설정하지 않은 (None) 상태일 때 해당 변수를 참조하면 발생하게 된다.

 

사실 기본적인 내용이라 보기 어려운 에러인데,

문제는 유니티가 C# 최신버전을 적극적으로 지원하게 되면서 발생했다.

 

[Unity3d C# Compiler 관련 문서]

 

Null 조건 연산자나 Null 병합(결합) 할당 연산자를 유니티에서도 사용할 수 있게 되었다.

 

public class Foo : MonoBehaviour {
  [SerializeFIeld]
  GameObject _MemberFoo;

  public void MethodFoo() {
    // UnassignedReferenceException !
    _MemberFoo?.SetActive(false);  
  }
}
 

코드만 봤을 땐 문제될 게 없어보이지만, UnassignedReferenceException은 할당되지 않은 SerializeFIeld를 접근하기만 해도 발생하는 유니티 시스템 에러이기 때문에 해당 오류가 발생한다.

 

반응형

 

| 현상

라이브러리내의 로그 파일이 백엔드 프로세스에서 사용중으로 IO Exception이 발생하며 유니티 에디터가 실행 불가능한 상태가 되는 현상

 

 

| 해결방법

해당 프로세스를 종료한 뒤, 유니티 에디터 재실행

 

반응형

[C#] Warning 숨기기 에 이어서 Unity3d 환경에서 Warning을 숨길 수 있는 방법을 알아보자.

C# 포스팅에선 Warning disable을 기준으로 전처리에 대한 내용을 정리했다면, Unity3d에선 커스텀 스크립팅 심볼까지 추가적으로 알아보자.

 

| RSP 파일을 통한 설정

// 커스텀 Define Symbol 정의
-define:FOO_BAR

// Warning Disable
-nowarn:1234
 

우선 전처리 지시문을 작성한 뒤

csc.rsp 파일을 <ProjectPath>/Assets 폴더 하위 위치시키면 된다.

 

※smcs.rsp, mcs.rsp 파일을 지원 중단 예정

 

 

| 에디터를 통한 설정

File > Build Settings > Player Settings > Player > Script Compilation / Additional Compiler Arguments

 

  • 커스텀 Define Symbol의 경우 Scripting Define Symbols 섹션에 `+` 버튼을 클릭 후 내용을 입력
  • 추가적인 컴파일 인수는 Additional Compiler Arguments 섹션에서 `+` 버튼을 클릭 후에 지정
  • 커스텀 스크립팅 심볼 - Unity 매뉴얼

 

| 스크립트를 통한 설정

 

위 3가지 API를 사용해서 스크립팅 심볼을 정의할 수 있다.

다만, PlayerSettings.SetScriptingDefineSymbolsForGroup 의 경우 주의 사항이 몇 가지 있다.

 

  • 해당 메서드는 즉시 적용되지 않고, 스크립트를 다시 컴파일 하지 않음
  • 배치 모드에서 헤드리스로 실행되기 때문에 editor loop(스크립팅 심볼이 다시 컴파일 되는)가 발생하지 않음

따라서 즉시 적용하려면 csc.rsp 파일을 비동기적 상황에선 API를 이용해야 한다.

 

| 관련

 

반응형

| 개요

 

커스텀 설정 창의 예시

SettingsProvider클래스와 Attribute를 사용해서 Project Settings 혹은 Preferences 창을 커스터마이즈하는 법을 소개하고자 한다.

 

| 설정파일 추가

[FilePath("UserSettings/CustomSettings.asset",
          FilePathAttribute.Location.ProjectFolder)]
public sealed class CustomSettings: ScriptableSingleton<CustomSettings>
{
    // 설정 값 정의
    public string customSettingsValue = null;

    // 저장 함수 추가 (인자는 설정파일의 텍스트 저장 여부)
    public void Save() => Save(true);

    // 비활성화 되었을 때, 설정이 저장되도록
    void OnDisable() => Save();
}
 

| SettingsProvider를 재정의할 클래스 정의

 

sealed class CustomSettingsProvider : SettingsProvider
{
    public CustomSettingsProvider ()
      : base("Project/Custom Settings", SettingsScope.Project) {}

    public override void OnGUI(string search)
    {
        var settings = CustomSettings.instance;

        // Properties...
        var customSettingsValue = settings.customSettingsValue;

        EditorGUI.BeginChangeCheck();

        customSettingsValue = EditorGUILayout.TextField("Custom Settings", customSettingsValue);

        // 값이 변경되었을 경우 설정 값을 저장
        if (EditorGUI.EndChangeCheck())
        {
            settings.customSettingsValue = customSettingsValue;
            settings.Save();
        }
    }

    [SettingsProvider]
    public static SettingsProvider CreateCustomSettingsProvider()
      => new CustomSettingsProvider();
}
 
환경 설정에 커스텀 설정을 추가한 모습

| 키워드 설정

public CustomSettingsProvider ()
      : base("Project/Custom Settings", SettingsScope.Project) 
{
    keywords = new HashSet<string>( new []{ "CustomSetting" });
}
 

위와 같이 keywords를 설정해주면 검색창에서 해당 키워드로 리스트업할 수 있다.

 

| 커스텀 설정 바로가기

    void OnGUI()
    {
        if (GUILayout.Button("Open my custom preference"))
        {
            SettingsService.OpenUserPreferences("Preferences/MyCustomPref");
        }

        if (GUILayout.Button("Open my custom project settings"))
        {
            SettingsService.OpenProjectSettings("Project/MyCustomSettings");
        }
    }
 

 

 

| 마치며

SettingsProvider 클래스와 Attribute, ScriptableSingleton을 활용해서 간단히 설정창을 커스텀하는 방법을 알아보았다.

 

SettingsProvider를 상속한 추가 클래스 정의 없이, 아래의 Action 멤버변수를 지정하면 위 예제와 같이 설정 상세 UI를 커스터마이즈할 수 있다.

 

  • IMGUI: guiHandler
  • UI Toolkit: activeHandler

 

| 참고

 

 

반응형

Unity3d il2cpp 빌드 중 clang++와 같은 ndk 관련 툴 사용 중 위와 같은 에러가 발생

| 현상

stdout:
Building libil2cpp.so with AndroidToolChain
    Output directory: /Users/{UserName}/.jenkins/workspace/ANDROID_BUILD/Temp/StagingArea/assets/bin/Data/Native/armeabi-v7a
    Cache directory: /Users/{UserName}/.jenkins/workspace/ANDROID_BUILD/Library/il2cpp_android_armeabi-v7a/il2cpp_cache
ObjectFiles: 998 of which compiled: 371
    Time Compile: 74211 milliseconds Il2CppTypeDefinitions.cpp
    Time Compile: 68481 milliseconds Il2CppMethodPointerTable.cpp
    Time Compile: 55285 milliseconds Il2CppAttributes.cpp
    Time Compile: 41421 milliseconds Il2CppMetadataUsage.cpp
    Time Compile: 26292 milliseconds Il2CppInvokerTable.cpp
    Time Compile: 17629 milliseconds Il2CppGenericMethodPointerTable.cpp
    Time Compile: 12918 milliseconds Il2CppGenericClassTable.cpp
    Time Compile: 10404 milliseconds Bulk_Assembly-CSharp_26.cpp
    Time Compile: 9629 milliseconds Bulk_Assembly-CSharp_49.cpp
    Time Compile: 9063 milliseconds Bulk_Assembly-CSharp_144.cpp
Total compilation time: 98643 milliseconds.
il2cpp.exe didn't catch exception: Unity.IL2CPP.Building.BuilderFailedException: /Users/{UserName}/Library/Android/sdk/ndk/android-ndk-r16b/toolchains/llvm/prebuilt/darwin-x86_64/bin/clang++ @"/var/folders/wp/pskqw4ns3cn27r6k10158xkc0000gn/T/tmpWedXj6.tmp" -o "/Users/{UserName}/.jenkins/workspace/ANDROID_BUILD/Library/il2cpp_android_armeabi-v7a/il2cpp_cache/linkresult_6F0877EF66902EFEC137A171BB702A20/libil2cpp.so" -shared -Wl,-soname,libil2cpp.so -Wl,--no-undefined -Wl,-z,noexecstack -Wl,--gc-sections -Wl,--build-id --sysroot "/Users/{UserName}/Library/Android/sdk/ndk/android-ndk-r16b/platforms/android-16/arch-arm" -gcc-toolchain "/Users/{UserName}/Library/Android/sdk/ndk/android-ndk-r16b/toolchains/arm-linux-androideabi-4.9/prebuilt/darwin-x86_64" -target armv7-none-linux-androideabi -Wl,--wrap,sigaction -L "/Users/{UserName}/Library/Android/sdk/ndk/android-ndk-r16b/sources/cxx-stl/gnu-libstdc++/4.9/libs/armeabi-v7a" -lgnustl_static -llog -rdynamic -fuse-ld=gold
 
clang++: error: unable to execute command: Killed: 9
clang++: error: linker command failed due to signal (use -v to see invocation)
 
 
   at Unity.IL2CPP.Building.CppProgramBuilder.PostprocessObjectFiles(HashSet`1 objectFiles, CppToolChainContext toolChainContext)
   at Unity.IL2CPP.Building.CppProgramBuilder.Build(IBuildStatistics& statistics)
   at il2cpp.Program.DoRun(String[] args)
   at il2cpp.Program.Run(String[] args)
   at il2cpp.Program.Main(String[] args)
stderr:
 
Unhandled Exception: Unity.IL2CPP.Building.BuilderFailedException: /Users/{UserName}/Library/Android/sdk/ndk/android-ndk-r16b/toolchains/llvm/prebuilt/darwin-x86_64/bin/clang++ @"/var/folders/wp/pskqw4ns3cn27r6k10158xkc0000gn/T/tmpWedXj6.tmp" -o "/Users/{UserName}/.jenkins/workspace/ANDROID_BUILD/Library/il2cpp_android_armeabi-v7a/il2cpp_cache/linkresult_6F0877EF66902EFEC137A171BB702A20/libil2cpp.so" -shared -Wl,-soname,libil2cpp.so -Wl,--no-undefined -Wl,-z,noexecstack -Wl,--gc-sections -Wl,--build-id --sysroot "/Users/{UserName}/Library/Android/sdk/ndk/android-ndk-r16b/platforms/android-16/arch-arm" -gcc-toolchain "/Users/{UserName}/Library/Android/sdk/ndk/android-ndk-r16b/toolchains/arm-linux-androideabi-4.9/prebuilt/darwin-x86_64" -target armv7-none-linux-androideabi -Wl,--wrap,sigaction -L "/Users/{UserName}/Library/Android/sdk/ndk/android-ndk-r16b/sources/cxx-stl/gnu-libstdc++/4.9/libs/armeabi-v7a" -lgnustl_static -llog -rdynamic -fuse-ld=gold
 
clang++: error: unable to execute command: Killed: 9
 

| 원인

macOS Catalina 업데이트 이후 보안이 강화되어 확인되지 않은 개발자의 앱을 열려는 경우, 경고 팝업이 발생.

 

| 해결방법

차단된 앱을 허용하기 위해선 시스템 환경 설정 > 보안 및 개인 정보 보호 > 일반 > 확인 없이 허용 버튼을 눌러서 차단을 해제하는 방법도 있지만

NDK에서 새로운 앱을 사용할때마다 차단을 하나하나 해줘야하는 번거로움이 있습니다.

보안엔 안좋을 수 있지만, 터미널을 통해서 다운로드한 앱을 모두 허용해주도록 합니다.

 

sudo spctl --master-disable
 

해당 명령어를 터미널에서 입력 후 적용을 위해서 재부팅 필요.

 

 

 

반응형

| 문제

빌드에서 아래와 같은 에러와 함께 어드레서블 어셋 로드에 실패하는 경우

 

E/Unity: System.MissingMethodException: Default constructor not found for type UnityEngine.ResourceManagement.AsyncOperations.ProviderOperation`1[[UnityEngine.AddressableAssets.Initialization.ResourceManagerRuntimeData, Unity.Addressables, Version=0.0.0.0, Culture=neutral, PublicKeyToken=null]]

 

| 해결방법

<linker>
    <assembly fullname="Unity.ResourceManager, Version=0.0.0.0, Culture=neutral, PublicKeyToken=null" preserve="all">
        <type fullname="UnityEngine.ResourceManagement.ResourceProviders.LegacyResourcesProvider" preserve="all" />
        <type fullname="UnityEngine.ResourceManagement.ResourceProviders.AssetBundleProvider" preserve="all" />
        <type fullname="UnityEngine.ResourceManagement.ResourceProviders.BundledAssetProvider" preserve="all" />
        <type fullname="UnityEngine.ResourceManagement.ResourceProviders.InstanceProvider" preserve="all" />
        <type fullname="UnityEngine.ResourceManagement.AsyncOperations" preserve="all" />
    </assembly>
    <assembly fullname="Unity.Addressables, Version=0.0.0.0, Culture=neutral, PublicKeyToken=null" preserve="all">
        <type fullname="UnityEngine.AddressableAssets.Addressables" preserve="all" />
    </assembly>
	<assembly fullname="UnityEngine">
		<type fullname="UnityEngine.Rigidbody" preserve="all"/>
	</assembly>
</linker>

 

Assets폴더 하위에 link.xml 파일을 생성 위와같이, 어드레서블 내에 정의된 타입들을 정의

 

 

반응형

+ Recent posts