목차

반응형

문제가 발생하게된 배경은 이러하다

에셋번들을 부르면 분류해서 클래스에 맞춰서 List에 넣어준다.

이후 특정 기능 작동시 해당 에셋번들 Destroy, List에서 지워준뒤 다른 에셋번들도 List에 넣어줌(교체 비슷)

하지만 분명히 말끔하게 에셋번들을 지우고난뒤 해당 List에 접근하려니까

MissingReferenceException: The object of type 'Transform' has been destroyed but you are still trying to access it.

에러가 뜨는것이다

오류 자체는 말그대로 이미 Destroy(gameObject)를 호출한 게임오브젝트의 Transform에 접근하려고 할때 생기는 문제다.

하지만 난 분명 저 오브젝트를 말끔히 삭제해서 절대 저 오브젝트를 호출할리가 없는데!

저 에러가 나는것이다. !@$!%#!!!#!@

분명 없는데 말이죠

그래서 계속 오류 찾아보다가 원인을 찾았다.

나같은경우는 알고보니 List에 에셋번들을 넣을때 중복해서 두번넣었는데 값을 잘못넣어서 삭제할때 필터링이 안돼서 계속 남아있던 것이다.

두번넣는것을 한번 넣는것으로 고치니까 말끔히 해결.


결국 내문제였음. 그래도 해결해서 기모띠하다

반응형
반응형
button.GetComponent<Button>().onClick.AddListener(() =>
{
PartController.PanelOn();
WheelController.categoryPanelsOff();

})

코드는 위와 같아.

버튼을 클릭하면 패널이 하나 켜지고 기존에 켜져있던 패널이 꺼져야한다.

하지만 버튼을 눌러보면 아무 일도 일어나지않는다 (에러도 안나오고)



테스트삼아서 로그를 띄워보지만

button.GetComponent<Button>().onClick.AddListener(() =>
{
Debug.Log("test");
PartController.PanelOn();
WheelController.categoryPanelsOff();

})

심지어 로그자체도 먹지않는다.

클릭리스너가 아예 안먹는것같은느낌?



이것저것 뒤져도 딱히 안나왔다.

하지만 이상한것은

button.GetComponent<Button>().onClick.AddListener(() =>
{
PartController.PanelOff();
categoryPanelsOn();
wheelCategoryPanels.Find(item => item.panel.name == categoryName).listOn();
wheelCategoryPanelsParent.GetComponent<ScrollRect>().content =
wheelCategoryPanels.Find(item => item.panel.name == categoryName).recttransform;
})

위의 코드는 먹는다.

조금더 설명을 하자면 위의 코드를 포함하고있는 오브젝트는 정적으로 생성되고 PartController라는 외부변수 또한 정적으로 지정되어있었다.


button.GetComponent<Button>().onClick.AddListener(() =>
{
Debug.Log("test");
PartController.PanelOn();
WheelController.categoryPanelsOff();

})

하지만 위의 코드를 포함하고 있는 오브젝트는 동적으로 생성되고 그에따라 PartController라는 외부 변수도 물론 똑같은 정적 객체를 불러오지만 동적으로 할당이 된다.


차이점은 해당 코드를 포함하고 있는 오브젝트가 동적으로 생성되느냐 정적으로 생성되느냐 인것같다.

내가 직접 여러가지 테스트를 해봤는데 해결법을 찾았다.

외부변수를 사용했을때 제대로 작동이 안하는 오브젝트에서 해당 외부변수를 static으로 선언하는 것이다.

즉 PartController라는 변수를 static으로 지정한뒤 오브젝트가 생성될때 동적으로 스태틱할당을 해주면 잘 작동한다.

반응형
반응형

유니티에서 네트워크 특히 작업할때 코루틴이 거의 100%쓰인다.

문제상황은

메인 스크립트

A클래스.이미지다운로드 - 이미지 다운로드후 앱에 반영


이런식으로 있을때 메인스크립트에서 단순히 A클래스의 코루틴을 호출하면 

StartCorutine(A클래스.이미지다운로드()); 정말 이해가 안되게도 NullReferenceException 오류를 뿜는다.

별다른 오류와 지시사항이 있는것도 아니고 그냥 해당 함수를 못찾는것처럼 에러가 나온다.

여러가지 방법을 뒤지다가 아래처럼 처리를 하면 된다는 것을 알았다.


A클래스.StartCoroutine(A클래스.이미지다운로드());

차이점은 메인스크립트에서 StartCorutine 앞에 호출하고자 하는 코루틴을 포함하는 클래스를 적어줘야한다는 것이다.

물론 해당 클래스의 인스턴스가 존재해야한다.


위 사항이 몰랐는데 알아두면 개꿀이다

반응형
반응형

CommandInvokationFailure: Gradle build failed. 

C:/Program Files (x86)/Java/jdk1.7.0_55\bin\java.exe -classpath "C:\Program Files\Unity\Editor\Data\PlaybackEngines\AndroidPlayer\Tools\gradle\lib\gradle-launcher-4.0.1.jar" org.gradle.launcher.GradleMain "-Dorg.gradle.jvmargs=-Xmx1024m" "assembleRelease"


stderr[


FAILURE: Build failed with an exception.


* Where:

Build file 'C:\Users\����ȯ\Desktop\tttt\Temp\gradleOut\build.gradle' line: 20


* What went wrong:

A problem occurred evaluating root project 'gradleOut'.

> java.lang.UnsupportedClassVersionError: com/android/build/gradle/AppPlugin : Unsupported major.minor version 52.0


* Try:

Run with --stacktrace option to get the stack trace. Run with --info or --debug option to get more log output.


BUILD FAILED in 15s

]

stdout[

Starting a Gradle Daemon (subsequent builds will be faster)

]

exit code: 1

UnityEditor.Android.Command.WaitForProgramToRun (UnityEditor.Utils.Program p, UnityEditor.Android.WaitingForProcessToExit waitingForProcessToExit, System.String errorMsg)

UnityEditor.Android.Command.Run (System.Diagnostics.ProcessStartInfo psi, UnityEditor.Android.WaitingForProcessToExit waitingForProcessToExit, System.String errorMsg)

UnityEditor.Android.AndroidJavaTools.RunJava (System.String args, System.String workingdir, System.Action`1 progress, System.String error)

UnityEditor.Android.GradleWrapper.Run (System.String workingdir, System.String task, System.Action`1 progress)

Rethrow as GradleInvokationException: Gradle build failed

UnityEditor.Android.GradleWrapper.Run (System.String workingdir, System.String task, System.Action`1 progress)

UnityEditor.Android.PostProcessor.Tasks.BuildGradleProject.Execute (UnityEditor.Android.PostProcessor.PostProcessorContext context)

UnityEditor.Android.PostProcessor.PostProcessRunner.RunAllTasks (UnityEditor.Android.PostProcessor.PostProcessorContext context)

UnityEngine.GUIUtility:ProcessEvent(Int32, IntPtr)


이거 아마 Build System Gradle로 되어있을텐데

Gradle은 안드로이드 네이티브에서 임포트해서 쓰는 용도로 쓰임

빌드해서 바로 쓸꺼면 Internal로 바꿔서 하삼


반응형