'Unity'에 해당되는 글 227건
- 2022.11.24 [링크] [Unity] 안드로이드 플러그인 (Android Plugin JAR, AAR)
- 2022.11.24 [빌드에러/Android] java.lang.UnsupportedOperationException: This feature requires ASM7 (with GoogleMobileAds)
- 2022.11.18 [빌드에러] (Xcode 14): Signing for "GoogleSignIn-GoogleSignIn" requires a development team.
- 2022.11.18 [펌] PostProcessBuild에서 PodFile 수정 방법
- 2022.11.17 [펌] [Xcode] Set 'Always Embed Swift Standard Libraries' in PostProcess
- 2022.11.16 [Tip] Android 12(API 31)에서 멀티윈도우/팝업윈도우 차단하기(꼼수)
- 2022.11.10 [C#] System.Linq.Expressions.Interpreter.LightLambda.MakeRunDelegateCtor
- 2022.11.01 [링크] 유니티 로컬라이징, 태국어 폰트 적용 문제
- 2022.10.28 [펌] Unityで画素密度を固定する解像度設定(FixedDPI)
- 2022.10.24 [링크] [Unity-C#] 특정 국가에서 크래시가 난다면 CultureInfo를 확인하자
[빌드에러/Android] java.lang.UnsupportedOperationException: This feature requires ASM7 (with GoogleMobileAds)
Untiy 2021.3.14f1
GoogleMobileAds 7.3.0
----
Unity 2021로 엔진 업데이트를 하고 빌드해보려는데 에러가 나서 보니 GoogleMobileAds 7.3.0 관련 이슈인 것 같다.
(GoogleMobileAds 7.2.0은 빌드 잘됨)
검색해보니 아래와 같은 해결책이 나온다.
- 간단히 말하면 Unity 2021에서 GoogleMobileAds 7.3.0을 쓰려면 gradle 버전 업데이트 하라고 한다. (아래 내용 따라하라고 함)
- 그래서 난 일단 GoogleMobileAds 7.2.0으로 버전을 내렸다(?)
--------------------------------------------------------------------------------------------------------------------------------
Yo so I found a way to solve this, assuming you are using applovin or charboost , what I did was:
- Delete resolved libraries : Assets> External Dependancy Manager > Android resolver > Delete resolve libs
- in player settings > pulishing settings uncheck all the one under build
- Download gradle 6.9
- Prefrences > external tools > uncheck gradle and browse to the installed gradle
- Assets> External Dependancy Manager > Android resolver > Force resolve
- then player settings > pulishing settings check all the ones you uncheck plus Custom Base Gradle Template
- edit the file Asstes\Plugins\Android\baseProjectTemplate.gradle
- change target api level to 31
- change the line that looks like classpath 'com.android.tools.build:gradle:yourversion' to classpath 'com.android.tools.build:gradle:4.2.0'
Build now it works. the funny thing is that gradle is 6.9 and com.adroid.tools.build:gradle: is 4.2.0 but it works.
[출처] https://www.reddit.com/r/Unity3D/comments/tktc13/i_need_help_asap/
--------------------------------------------------------------------------------------------------------------------------------
Hello. I solved my problem this way.
Download the latest Gradle version here.
https://gradle.org/releases/
Place the unzipped Gradle file in the following location
/Applications/Unity/Hub/Editor/2021.3.12f1/PlaybackEngines/AndroidPlayer/Tools/gradle/
Please note that 2021.3.12f1 is the editor version and should be replaced with your own environment.
Next, open Unity and change the Gradle to be used.
From the top menu, select Unity > Preferences and open External Tools.
Uncheck the box marked "Gradle Installed with Unity (recommended)" and enter the path to the Gradle you just placed.
Now the Gradle used for building has been switched to a different version.
If there are no problems with the version, you should now be able to build Android.
[출처] https://github.com/googleads/googleads-mobile-unity/issues/2390
'Unity3D > Android' 카테고리의 다른 글
[빌드에러] (Xcode 14): Signing for "GoogleSignIn-GoogleSignIn" requires a development team.
Unity2020.3.40f1
Xcode 14.1
Xcode 14로 업데이트 후, iOS 빌드 하면 제목과 같은 에러가 발생한다.
- 관련 에러 위치 찾아가서 Team Id를 선택하면 잘되긴 하는데, 빌드때마다 수동으로 하기는 애매해서 찾아보니 PodFile에 아래 내용을 추가하면 된다고 한다.
post_install do |installer|
installer.pods_project.targets.each do |target|
if target.respond_to?(:product_type) and target.product_type == "com.apple.product-type.bundle"
target.build_configurations.each do |config|
config.build_settings['CODE_SIGN_IDENTITY'] = ""
#prevent resource bundle from reading image nil
config.build_settings.delete('PRODUCT_BUNDLE_IDENTIFIER')
end
end
end
end
[출처] https://github.com/CocoaPods/CocoaPods/issues/11402 : JosephPoplar 댓글
- iOS 빌드해서 PodFile 수작업을 계속할 수는 없는지라 Unity의 Xcode PostProcessBuild에서 자동으로 추가하도록 함.
(Define을 봐서는 Unity2019.3 이상에서만 가능한 것 같다)
#if UNITY_2019_3_OR_NEWER
// FixPodFile 사용법 참조
// https://github.com/googlesamples/unity-jar-resolver/issues/405 : Str4tos 댓글
[PostProcessBuild(45)]//must be between 40 and 50 to ensure that it's not overriden by Podfile generation (40) and that it's added before "pod install" (50)
private static void FixPodFile(BuildTarget buildTarget, string buildPath)
{
/// Stop processing if target is NOT iOS
if (buildTarget != BuildTarget.iOS)
return;
using (StreamWriter sw = File.AppendText(buildPath + "/Podfile"))
{
// [Error 대응] (Xcode 14): Signing for "GoogleSignIn-GoogleSignIn" requires a development team.
// [해결방법 참조] https://github.com/CocoaPods/CocoaPods/issues/11402 : JosephPoplar 댓글
sw.WriteLine("\npost_install do |installer|\n installer.pods_project.targets.each do |target|\n if target.respond_to?(:product_type) and target.product_type == \"com.apple.product-type.bundle\"\n target.build_configurations.each do |config|\n config.build_settings['CODE_SIGN_IDENTITY'] = \"\"\n #prevent resource bundle from reading image nil\n config.build_settings.delete('PRODUCT_BUNDLE_IDENTIFIER')\n end\n end\n end\nend");
/// ex
//sw.WriteLine("\ntarget 'Unity-iPhone' do\nend");
}
}
#endif
[출처] https://github.com/googlesamples/unity-jar-resolver/issues/405 : Str4tos 댓글
'Unity3D > iOS' 카테고리의 다른 글
[Xcode] PostProcessBuild(with FixPodFile) (0) | 2022.12.11 |
---|---|
[펌] UnityEngine.Videoplayer not rendering video on IOS Devices (0) | 2022.11.25 |
[펌] PostProcessBuild에서 PodFile 수정 방법 (0) | 2022.11.18 |
[펌] [Xcode] Set 'Always Embed Swift Standard Libraries' in PostProcess (0) | 2022.11.17 |
[펌] ITMS-90427: Invalid Swift Support (0) | 2022.11.16 |
[펌] PostProcessBuild에서 PodFile 수정 방법
PostProcessBuild에 아래처럼 FixPodFile()을 추가하고,
원하는 내용을 줄바꿈(\n) 포함해서 WriteLine에 string 형태로 추가한다.
#if UNITY_2019_3_OR_NEWER
[PostProcessBuild( 45 )]//must be between 40 and 50 to ensure that it's not overriden by Podfile generation (40) and that it's added before "pod install" (50)
private static void FixPodFile( BuildTarget target, string buildPath )
{
using (StreamWriter sw = File.AppendText( buildPath + "/Podfile" ))
{
sw.WriteLine( "\ntarget 'Unity-iPhone' do\nend" );
}
}
#endif
[출처] https://github.com/googlesamples/unity-jar-resolver/issues/405
'Unity3D > iOS' 카테고리의 다른 글
[펌] UnityEngine.Videoplayer not rendering video on IOS Devices (0) | 2022.11.25 |
---|---|
[빌드에러] (Xcode 14): Signing for "GoogleSignIn-GoogleSignIn" requires a development team. (0) | 2022.11.18 |
[펌] [Xcode] Set 'Always Embed Swift Standard Libraries' in PostProcess (0) | 2022.11.17 |
[펌] ITMS-90427: Invalid Swift Support (0) | 2022.11.16 |
[펌] ERROR ITMS-90206: "Invalid Bundle. (0) | 2022.11.16 |
[펌] [Xcode] Set 'Always Embed Swift Standard Libraries' in PostProcess
ITMS-90427을 처리하기 위해 확인해보니
Unity-iPhone의 Always Embed Swift Standard Libraries를 YES로 하고,
UnityFramework의 Always Embed Swift Standard Libraries를 NO로 하라고 한다.
빌드때마다 수동으로 하기는 그래서 Xcode PostProcessBuild로 처리하기로 함.
using System.IO;
using UnityEditor;
using UnityEditor.Callbacks;
using UnityEditor.iOS.Xcode;
namespace Editor
{
public static class XcodeSwiftVersionPostProcess
{
[PostProcessBuild(999)]
public static void OnPostProcessBuild(BuildTarget buildTarget, string path)
{
if (buildTarget == BuildTarget.iOS)
{
ModifyFrameworks(path);
}
}
private static void ModifyFrameworks(string path)
{
string projPath = PBXProject.GetPBXProjectPath(path);
var project = new PBXProject();
project.ReadFromFile(projPath);
string mainTargetGuid = project.GetUnityMainTargetGuid();
foreach (var targetGuid in new[] { mainTargetGuid, project.GetUnityFrameworkTargetGuid() })
{
project.SetBuildProperty(targetGuid, "ALWAYS_EMBED_SWIFT_STANDARD_LIBRARIES", "NO");
}
project.SetBuildProperty(mainTargetGuid, "ALWAYS_EMBED_SWIFT_STANDARD_LIBRARIES", "YES");
project.WriteToFile(projPath);
}
}
}
[출처] https://forum.unity.com/threads/2019-3-validation-on-upload-to-store-gives-unityframework-framework-contains-disallowed-file.751112/ - unity_Iu70XvRN7XIS4g의 댓글
'Unity3D > iOS' 카테고리의 다른 글
[빌드에러] (Xcode 14): Signing for "GoogleSignIn-GoogleSignIn" requires a development team. (0) | 2022.11.18 |
---|---|
[펌] PostProcessBuild에서 PodFile 수정 방법 (0) | 2022.11.18 |
[펌] ITMS-90427: Invalid Swift Support (0) | 2022.11.16 |
[펌] ERROR ITMS-90206: "Invalid Bundle. (0) | 2022.11.16 |
[링크] [iOS 앱스토어 리젝] 애플 로그인 텍스트 | 애플 로그인 디자인 가이드 (0) | 2022.11.09 |
[Tip] Android 12(API 31)에서 멀티윈도우/팝업윈도우 차단하기(꼼수)
Android 7(API 24) 이상에서 지원하는 멀티 윈도우를 막으려면 AndroidManifest.xml에 android:resizeableActivity="false"만 추가하면 됐는데,
위 방식은 API 30까지만 가능하고 API 31(Android 12)부터는 화면이 크면 경고는 뜨지만 막히지 않는다.
[참조] https://blueasa.tistory.com/2669
[참조2] https://developer.android.com/guide/topics/large-screens/multi-window-support
그래서 약간 꼼수로 아래와 같이 처리했다.
[차단]
멀티윈도우/팝업윈도우로 갈 때 OnApplicationPause가 작동하기 때문에, OnApplicationPause에서 false 일 때(Pause가 풀릴 때) , Screen의 현재 해상도를 체크해서 내가 사용하는 게임 비율이 아니면 차단하게 함.
Ex) 가로모드 게임이면, height가 width보다 크면 차단
[해제]
멀티윈도우/팝업윈도우에서 정상적인 전체화면 게임으로 돌아와도 OnApplicationPause가 Call 되지 않기 때문에 여기서 처리는 불가능한 걸 확인했다.
그래서 [차단] 할 때, InvokeRepeating을 사용해서 주기적으로 체크(Update를 쓰면 평소에도 Call 되기 때문에 Invoke 사용함)해서 해상도가 내가 사용하는 비율이 맞으면 해제하도록 해놓음.
Ex) 가로모드 게임이면, width가 height보다 크먼 해제
대충 아래와같이 구현해 둠..
void OnApplicationPause(bool _bPaused)
{
Debug.LogFormat("[OnApplicationPause] {0}", _bPaused);
// Android에서만 처리하기 위해 Define으로 분기
#if !UNITY_EDITOR && UNITY_ANDROID
OnApplicationPause_Android(_bPaused);
#elif !UNITY_EDITOR && UNITY_IOS
#endif
}
void OnApplicationPause_Android(bool _bPaused)
{
// Pause 할 때는 Pass
if (true == _bPaused)
return;
// [Android12(API31) 멀티윈도우 차단
// Pause 해제 시, 해상도 세로가 가로보다 더 길면 차단(가로모드 게임)
if (Screen.currentResolution.width <= Screen.currentResolution.height)
{
// [Active] UnSupported Resolution Popup
// (화면을 완전히 가리고, 터치가 안되도록 Collider를 넣음)
ActivateUnsupportedResolutionPopup(true);
// 차단 해제 체크용(Update는 항상 돌기 때문에 Invoke로 필요할때만 처리)
InvokeRepeating("UpdateCheckUnSupportedResolution", 0.1f, 0.1f);
}
}
void UpdateCheckUnSupportedResolution()
{
// 해상도가 가로모드 해상도에 맞게 돌아오면 차단 팝업 해제 및 CancelInvoke
if (Screen.currentResolution.height < Screen.currentResolution.width)
{
// [InActive] UnSupported Resolution Popup
SGT.UIMain.ActivateUnSupportedResolutionPopup(false);
CancelInvoke("UpdateCheckUnSupportedResolution");
}
}
'Unity3D > Android' 카테고리의 다른 글
[C#] System.Linq.Expressions.Interpreter.LightLambda.MakeRunDelegateCtor
[에러메시지]
NullReferenceException: Object reference not set to an instance of an object.
at System.Linq.Expressions.Interpreter.LightLambda.MakeRunDelegateCtor (System.Type delegateType) [0x00000] in <00000000000000000000000000000000>:0
at System.Linq.Expressions.Interpreter.LightLambda.GetRunDelegateCtor (System.Type delegateType) [0x00000] in <00000000000000000000000000000000>:0
at System.Linq.Expressions.Interpreter.LightDelegateCreator.CreateDelegate () [0x00000] in <00000000000000000000000000000000>:0
at System.Linq.Expressions.Expression`1[TDelegate].Compile (System.Boolean preferInterpretation) [0x00000] in <00000000000000000000000000000000>:0
at System.Runtime.CompilerServices.CallSite`1[T].MakeUpdateDelegate () [0x00000] in <00000000000000000000000000000000>:0
at System.Runtime.CompilerServices.CallSite`1[T].GetUpdateDelegate (T& addr) [0x00000] in <00000000000000000000000000000000>:0
at System.Runtime.CompilerServices.CallSite`1[T]..ctor (System.Runtime.CompilerServices.CallSiteBinder binder) [0x00000] in <00000000000000000000000000000000>:0
at System.Runtime.CompilerServices.CallSite`1[T].Create (System.Runtime.CompilerServices.CallSiteBinder binder) [0x00000] in <00000000000000000000000000000000>:0
대충 위와같은 에러가 나는데..
유니티에서 dynamic을 쓰면 나는 에러인데..
결론은 유니티는 dynamic을 지원하지 않는다. 쓰지말자.
에디터에서는 잘되길래 될 줄 알았더만, 안드로이드 빌드해보니 위와같은 에러가 난다.
해결책이 별시리 없는듯하다.
[참조] https://gall.dcinside.com/mgallery/board/view/?id=game_dev&no=53076
'Unity3D > Trouble Shooting' 카테고리의 다른 글
[링크] 유니티 로컬라이징, 태국어 폰트 적용 문제
'Unity3D > Tips' 카테고리의 다른 글
[링크] 유니티(Unity) 사운드 최적화 가이드 (0) | 2022.12.20 |
---|---|
[펌] VideoPlayer 끝난건지 확인하기 (0) | 2022.11.25 |
[펌] Unityで画素密度を固定する解像度設定(FixedDPI) (0) | 2022.10.28 |
[Tip] 유니티 최적화 관련 팁(Resolution Scaling) (0) | 2022.10.24 |
[링크] 오디오(Audio Clip) 설정 팁 (0) | 2022.10.13 |
[펌] Unityで画素密度を固定する解像度設定(FixedDPI)
こんにちは。技術部平山です。
今回は小ネタで、サンプルもありません。ビルドの解像度設定についてです。
スクリーンショットにあるように、PlayerSettingsのResolution and Presentation の項に、Resolution Scalingというものがあり、 Resolution Scaling ModeをデフォルトのDisabledからFixed DPIに 設定することができます( Androidマニュアル、 iOSマニュアル )。
これは、画素(ピクセル)の密度が同じになるように、機種によって解像度を自動で変える、という設定です。 上の画像では326dpi(dot per inch。1インチあたりの画素数)になっており、 これはiPhone4あたりからの伝統的な値です。 iPhone6Plusのような上位機種を除けば、だいたいこの密度になっています。
実際どうなるのか?
この設定にしておくと、ディスプレイの画素密度が326dpiの機械では、 元の解像度で描画されます。例えばiPhone8なら1334x750です。
ところが、画面の大きさの割に解像度が高い端末、 例えばiPhone8Plusであれば、元よりも低い解像度になります。 元の解像度は1920x1080ですが、これが1560x878になります。 元の画素密度は406dpiもありこれを326dpiに落とすと、 解像度が縦横それぞれ(326/406)倍されるわけです。
何のために使うの?
「無駄に高い解像度で描画して、フレームレートや電力消費を悪化させるのを防ぐため」です。
高解像度で描画する方が綺麗なのは確かですが、タダではありません。 GPUの処理負荷はかなりの部分が画素数に比例しますから、 1920x1080で描画する負荷は、1560x878で描画する負荷に比べて、 およそ1.5倍になります。 CPU側に余裕があって、フレームレートが画素数で決まっているようなケースでは、 この設定を有効にすることでフレームレートが1.5倍になる可能性がある、ということです。
また、元々60fpsで動いているような場合は、電力消費が改善します。 微々たる差しか感じられないことに無駄に電気を食うよりは、 少し解像度を下げて余力を残した方が良いかもしれません。 スマホの場合、あまり電力消費が大きいと熱のために処理能力が低下し、 フレームレートが落ちてくることもよくあります。 前もって解像度を下げておくことは、これを防ぐ効果もあるのです。
実際の例
実際の例としては、iPhone6Plus(1920x1080)で40FPSしか出なかったアプリが、 この設定を有効にするだけで60FPSに改善した例があります。
また、一部Android機のように、 GPU性能の割に解像度が高い(例えば京セラS2で1280x720、S4で1920x1080) 端末では、 元々フル解像度でゲームを動かすことには無理があり、 解像度を下げることで大きくフレームレートが改善します。 S2の場合、対角5インチのサイズで1280x720で、 1280画素ある長辺の長さは4.345インチです。 1280をこれで割ると、294dpiとなります。
iPhoneの326dpiよりも低いですが、 「そもそもこのゲームって、そんなに解像度高くてうれしいの?」 ということをよく考えてみれば、 製品によっては「もう少し低くてもいいな」という判断にもなるでしょう。
お客さんが選べるように選択肢を用意するのも一つの考えかと思いますが、 ほとんどのお客さんにとって適切な設定をデフォルトにするのもまた重要なことです。 画質とフレームレート、電力消費のバランスを鑑みて、 画素密度(dpi)で設定するのは悪くない選択でしょう。 設定一つで済むので実装コストはほぼゼロです。
製品の性質にもよりますが、200から300くらいを設定するのが良いのかな、 と個人的には思います。Nintendo Switchが235dpiであり(Switch Liteは268dpi) それだけあれば十分な気もします。 もし不安があるのであれば、たくさん売れたiPhoneを基準にして上の例のように326 に設定するのも良いでしょう。それでもPlus系での処理落ちを防げます。 その場合も、Androidでは低スペック機に配慮して下げる方が良い気がします (dpi設定はiOSとAndroidを別に持てないので、ビルド前にスクリプトで変更するのが良いでしょう)。
ダイナミックなフォントは解像度が高いほど綺麗になり、 3Dのポリゴンも解像度が高いほど輪郭が綺麗になりますが、 前もって用意したテクスチャは元解像度以上にはなりません。 解像度が高すぎてもボケて見えるだけで、 それは解像度を落として描くのとほとんど変わらないのです。 しかしフレームレートと電力消費は確実に悪化します。
別の方法
お客さんに解像度設定を委ねる場合には、これを使っての設定はできません。 一律になってしまうからです。 設定を見て、 Screen.SetResolution を起動後に呼ぶことになります。
Screenクラスからはdpiも取れますので、FixedDPIを使うのと同じこともできますが、 解像度変更はその場では終わらず次のフレームまでかかりますし、 解像度に依存した処理があると、解像度が変わった時におかしくなる危険もありますから、 注意しましょう。起動直後のみの反映が安全ですが、すぐに確認できないので利便性は落ちます。 設定画面を作るコストの問題もありますから、 製品の性質やお客さんにとっての価値を考えた上で、 良い選択をしてください。
なお、お客さんに設定して頂けるのであれば、 かなり攻めた設定(768x432まで解像度を下げるなど)ができ、 電気が気になる方(例えば私)や、低性能の機種をお使いの方(例えば私)に とってはうれしいのではないかと思います。 過去参加した製品 では、768x432で20fpsという省エネ設定ができるようにしましたが、 完全に私のためでした。
代表的な機械の画素密度
以下に代表的な機械のDPIを表にしておきます。 「この機械はドット粗いなあ」と思う機械よりは上げたいですが、 「これ以上細かくても差がわからないよ」「そもそもそんな高解像度で素材作ってないよ」 という場合には下げて良いかと思います。 素材の解像度が上がれば容量も増えて、通信料金やスマホのストレージにも 悪影響を与えますから、何事も程々のバランスが良いでしょう。
機種対角インチ解像度DPI
iPhone 5S,SE | 4 | 1136x640 | 326 |
iPhone 6, 6S, 7, 8 | 4.7 | 1334x750 | 326 |
iPhone 6Plus, 6S Plus, 7Plus, 8Plus | 5.5 | 1920x1080 | 406 |
iPhoneX, XS, 11Pro | 5.85 | 2436x1125 | 458 |
iPhoneXS Max, 11ProMax | 6.46 | 2688x1242 | 458 |
iPhoneXR, 11 | 6.06 | 1792x828 | 326 |
古めのiPadの多く | 9.7 | 2048x1536 | 264 |
今のiPad | 10.5 | 2224x1668 | 264 |
対角5インチの16:9機 | 5 | 960x540 | 221 |
対角5インチの16:9機 | 5 | 1280x720 | 295 |
対角5インチの16:9機 | 5 | 1920x1080 | 442 |
対角24インチのFullHDモニタ | 24 | 1920x1080 | 92 |
Retina MacBookPro 13インチ | 13 | 2560x1600 | 232 |
Nintendo Switch | 6.2 | 1280x720 | 238 |
Nintendo Switch Lite | 5.5 | 1280x720 | 268 |
QualitySettingsでの補正
この項目は試していないのですが、たまたま調べたら出てきたので紹介しておきます。
dpi値はQualitySettingsで修正することができるようです。 公式マニュアル にあるように、Resolution Scaling Fixed DPI Factorを設定すれば、 lowやmediumのような設定ごとに、先程設定したdpi値を補正することができるとあります。 0.5を書けば半分になり、例えば326dpiであれば163dpiになって、 解像度が半分になるのでしょう。
機械の性能を見てQualitySettings.SetQualityLevel などを呼んでいる場合には、動的に解像度も変わるのでしょうか? 正常に動くのか、どれくらい処理が止まるのか、といったことはわかりません。
終わりに
今回は小ネタでしたが、下手に最適化で苦労するよりもよほど簡単に効果が上がるので、強くオススメしておきます。
個人的には、多くのゲームのように画面に動きがあるアプリケーションで 300dpiを超えた描画するのは、電池が惜しいと感じます。 もし余力があるのであれば、解像度を上げるよりも、 ライティングなどのピクセルあたりの処理を豪華にする方が、 おそらくは品質も上がるでしょう。
[출처] https://techblog.kayac.com/unity-fixed-dpi
'Unity3D > Tips' 카테고리의 다른 글
[펌] VideoPlayer 끝난건지 확인하기 (0) | 2022.11.25 |
---|---|
[링크] 유니티 로컬라이징, 태국어 폰트 적용 문제 (0) | 2022.11.01 |
[Tip] 유니티 최적화 관련 팁(Resolution Scaling) (0) | 2022.10.24 |
[링크] 오디오(Audio Clip) 설정 팁 (0) | 2022.10.13 |
[펌] 모바일 게임 성능 최적화: 그래픽과 에셋에 관한 전문가 팁 (1) | 2022.10.07 |
[링크] [Unity-C#] 특정 국가에서 크래시가 난다면 CultureInfo를 확인하자
[링크] https://lunchballer.com/archives/1326
[참조] https://mentum.tistory.com/615
[체크해야 될 함수] 더 있을수도..
float.Parse / float.TryParse / float.ToString
double.Parse / double.TryParse / double.ToString
int.Parse / int.TryParse / int.ToString
long.Parse / long.TryParse / long.ToString
BigInteger.Parse / BigInteger.TryParse / BigInteger.ToString
DateTime.Parse / DateTime.ParseExact / DateTime.TryParse / DateTime.TryParseExact / DateTime.ToString
TypeConverter.ConvertFrom / TypeConverter.ConvertTo
Convert.To??? 시리즈(Convert.ToInt16/ToInt32/ToInt64/ToUInt16/ToUInt32/ToUInt64,ToDecimal,ToDouble,ToSByte,ToSingle 등)
.ToLower / .ToUpper
string.Format
[첨언]
Unity 2018에서 Unity 2021로 포팅을 하고 업데이트를 했는데 이상한 에러가 크래시레포트에 많이 수집돼서 확인해보니
위의 링크에 보이는 문제로 보인다.
Unity 2019 부터 바뀐부분이 있어서(참조 링크 보면 됨) int float double BigInteger 등을 Parse 할 때 System.Globalization.CultureInfo.InvariantCulture을 무조건 넣어줘야 될 것 같다.
(CurrnetCulture는 건들면 문제가 생길 것 같아서 그냥 노가다로 다 넣었다.)
P.s. 문화권 문제라 한국에서는 아무리 테스트를 해도 크래시가 안나니 무슨 버그인지 몰라서 한참 헤멤..
[추가]
CultureInfo 관련 이슈가 있는 함수가 더 있어서 추가해 둠.
아래 함수 2개를 문화권 영향받지 않도록 변경했다.
이 두 함수는 함수 자체가 문화권 영향받지 않는 함수가 있어서 편한 것 같다.
TypeConverter.ConvertFrom() → TypeConverter.ConvertFromInvariantString()
TypeConverter.ConvertTo() → TypeConverter.ConvertToInvariantString()
[참고] https://learn.microsoft.com/ko-kr/dotnet/api/system.componentmodel.int32converter?view=net-7.0
[나라별 숫자표기 참고] https://theqoo.net/square/298509638
[숫자표기 참고2] https://docs.oracle.com/cd/E19683-01/816-3980/overview-48/index.html
[Date format by country] https://gist.github.com/mlconnor/1887156