블로그 이미지
Every unexpected event is a path to learning for you.

카테고리

분류 전체보기 (2731)
Unity3D (814)
Programming (474)
Server (33)
Unreal (4)
Gamebryo (56)
Tip & Tech (228)
협업 (57)
3DS Max (3)
Game (12)
Utility (136)
Etc (96)
Link (32)
Portfolio (19)
Subject (90)
iOS,OSX (51)
Android (14)
Linux (5)
잉여 프로젝트 (2)
게임이야기 (3)
Memories (20)
Interest (38)
Thinking (38)
한글 (30)
PaperCraft (5)
Animation (408)
Wallpaper (2)
재테크 (18)
Exercise (3)
나만의 맛집 (3)
냥이 (10)
육아 (16)
Total
Today
Yesterday
03-28 00:02

AppIconChangerUnity
https://github.com/kyubuns/AppIconChangerUnity

Change the app icon dynamically in Unity
Support for new icon formats in Xcode13
-> This means that A/B Test on AppStore is also supported.


- iOS only, require iOS 10.3 or later



## Instructions
- Import by PackageManager `https://github.com/kyubuns/AppIconChangerUnity.git?path=Assets/AppIconChanger`
- (Optional) You can import a demo scene on PackageManager.




## Quickstart

- Create `AppIconChanger > AlternateIcon` from the context menu




- Set the name and icon





- The following methods are available




## Tips


### What is the best size for the app icon?

When the Type of `AlternateIcon` is set to Auto Generate, the icon will be automatically resized at build time, so there is nothing to worry about. (The maximum size is 1024px.)
If you want to control it in detail, you can change the Type to Manual.





## Requirements
- Unity 2020.3 or higher.
- Xcode 13 or higher.



## License
MIT License (see LICENSE)

 

 

[출처] https://forum.unity.com/threads/appiconchangerunity-change-the-app-icon-dynamically-in-unity-ios-only.1245787/

 

AppIconChangerUnity - Change the app icon dynamically in Unity (iOS only)

AppIconChangerUnity https://github.com/kyubuns/AppIconChangerUnity Change the app icon dynamically in Unity Support for new icon formats in Xcode13 ->...

forum.unity.com

 

반응형
Posted by blueasa
, |

[링크] https://firefighting-seismic.tistory.com/99

 

윈도우 10 SSD 프리징 현상 100% 해결 방법

본문에서 다룰 사례는 주로 AMD 최신 라이젠 메인보드, AMD 초기 라이젠 메인보드(B350, X370)와 특정 브랜드 M.2 NVMe SSD, SATA SSD에서 발생하는 이슈다. 대표적 발현 증상으로는 크롬 브라우저 이용 중

firefighting-seismic.tistory.com

 

반응형
Posted by blueasa
, |
using UnityEngine;

public class OcclusionCulling2D : MonoBehaviour
{
    [System.Serializable] public class ObjectSettings
    {
        [HideInInspector] public string title;
        public GameObject theGameObject;

        public Vector2 size = Vector2.one;
        public Vector2 offset = Vector2.zero;
        public bool multiplySizeByTransformScale = true;

        public Vector2 sized { get; set; }
        public Vector2 center { get; set; }
        public Vector2 TopRight { get; set; }
        public Vector2 TopLeft { get; set; }
        public Vector2 BottomLeft { get; set; }
        public Vector2 BottomRight { get; set; }
        public float right { get; set; }
        public float left { get; set; }
        public float top { get; set; }
        public float bottom { get; set; }

        public Color DrawColor = Color.white;
        public bool showBorders = true;
    }

    public ObjectSettings[] objectSettings = new ObjectSettings[1];

    private Camera camera;
    private float cameraHalfWidth;

    public float updateRateInSeconds = 0.1f;

    private float timer;

    void Awake(){ 
        camera = GetComponent<Camera>();
        cameraHalfWidth = camera.orthographicSize * ((float)Screen.width / (float)Screen.height);

        foreach(ObjectSettings o in objectSettings){
           o.sized = o.size * (o.multiplySizeByTransformScale ? new Vector2(Mathf.Abs(o.theGameObject.transform.localScale.x), Mathf.Abs(o.theGameObject.transform.localScale.y)) : Vector2.one);
            o.center = (Vector2)o.theGameObject.transform.position + o.offset;

            o.TopRight = new Vector2(o.center.x + o.sized.x, o.center.y + o.sized.y);
            o.TopLeft = new Vector2(o.center.x - o.sized.x, o.center.y + o.sized.y);
            o.BottomLeft = new Vector2(o.center.x - o.sized.x, o.center.y - o.sized.y);
            o.BottomRight = new Vector2(o.center.x + o.sized.x, o.center.y - o.sized.y);

            o.right = o.center.x + o.sized.x;
            o.left = o.center.x - o.sized.x;
            o.top = o.center.y + o.sized.y;
            o.bottom = o.center.y - o.sized.y;
        }
    }

    void OnDrawGizmosSelected()
    {
        foreach(ObjectSettings o in objectSettings)
        {
            if(o.theGameObject)
            {
                o.title = o.theGameObject.name;

                if(o.showBorders)
                {
                    o.TopRight = new Vector2(o.center.x + o.sized.x, o.center.y + o.sized.y);
                    o.TopLeft = new Vector2(o.center.x - o.sized.x, o.center.y + o.sized.y);
                    o.BottomLeft = new Vector2(o.center.x - o.sized.x, o.center.y - o.sized.y);
                    o.BottomRight = new Vector2(o.center.x + o.sized.x, o.center.y - o.sized.y);
                    Gizmos.color = o.DrawColor;
                    Gizmos.DrawLine(o.TopRight, o.TopLeft);
                    Gizmos.DrawLine(o.TopLeft, o.BottomLeft);
                    Gizmos.DrawLine(o.BottomLeft, o.BottomRight);
                    Gizmos.DrawLine(o.BottomRight, o.TopRight);
                }
            }
        }
    }
    
    void FixedUpdate()
    {
        timer += Time.deltaTime;
        if(timer > updateRateInSeconds) timer = 0;
        else return;

        float cameraRight = camera.transform.position.x + cameraHalfWidth;
        float cameraLeft = camera.transform.position.x - cameraHalfWidth;
        float cameraTop = camera.transform.position.y + camera.orthographicSize;
        float cameraBottom = camera.transform.position.y - camera.orthographicSize;

        foreach(ObjectSettings o in objectSettings)
        {
            if(o.theGameObject)
            {
                bool IsObjectVisibleInCastingCamera = o.right > cameraLeft & o.left < cameraRight & // check horizontal
                                                      o.top > cameraBottom & o.bottom < cameraTop; // check vertical
                o.theGameObject.SetActive(IsObjectVisibleInCastingCamera);
            }
        }
    }
}

[출처] https://www.youtube.com/watch?v=hbBDqdoHUpE

반응형
Posted by blueasa
, |

Unity 2021.3.36f1

Xcode 15.3

----

 

[결론] 

Privacy Manifest 관련 대응 버전은 Unity 2023.2.13, 2022.3.21, 2021.3.36 이라고 한다.(메이저 버전별 해당 버전이후로 업데이트 필요)

위에 적힌 버전 이상 설치 돼 있으면, iOS 빌드를 할 때 알아서 PrivacyInfo.xcprivacy를 생성해 준다고 한다.

Unity 2021.3.36f1으로 iOS 빌드했는데, PrivacyInfo.xcprivacy도 추가돼있고, 내용도 제대로 들어있는 걸 확인했다.(필요한 거 확인해서 알아서 넣어준다고 어디선가 적힌걸 본 것 같은데..)

Unity 2021.3.36f1으로 iOS 빌드하면 PrivacyInfo.xcprivacy가 자동 생성된다.

 

쉽게 해결하려면 엔진 버전업 하자.

 

SDK 등 Third Party 플러그인들은 해당 Third Party에서 업데이트 대응해줘야 되는거니 내가 뭔가 할 건 없는 것 같다.

 

P.s. 

수동으로 작업하려면 PolicyInfo.xcprivacy 파일을 생성해서 수정하고, ../Assets/Plugins 폴더에 파일을 넣어두면 된다는데..

버전업하면 자동으로 처리되는데 굳이 수작업 할 일이 있을까 싶다.

 

[참조] https://forum.unity.com/threads/apple-privacy-manifest-updates-for-unity-engine.1529026/

 

Official - Apple privacy manifest updates for Unity Engine

Introduction At WWDC 2023 Apple announced a number of additions to its privacy program, including the introduction of Privacy Manifests. Since then,...

forum.unity.com

 

----

[링크1] [Unity] Apple Privacy Manifest 대응

 

[Unity] Apple Privacy Manifest 대응

안녕하세요. Apple이 공개한 Privacy Manifest를 반드시 포함해야 하는 SDK 목록 중에 UnityFramework가 있었고 이번에 Unity에서 공식적인 입장과 가이드를 공개했어요. https://forum.unity.com/threads/apple-privacy-man

phillip5094.tistory.com

 

[링크2] 개인정보 보호 매니페스트 및 서명을 필요로 하는 SDK

 

개인정보 보호 매니페스트 및 서명을 필요로 하는 SDK

안녕하세요. 이전에 Privacy manifest에 대해서 공부했는데요. [WWDC23] Get started with privacy manifests 안녕하세요. 이번엔 WWDC23 'Get started with privacy manifests' 세션을 보고 내용 정리해 볼게요. #개요 앱 사용

phillip5094.tistory.com

 

 

[참조] 【Xcode/iOS】Privacy Manifests에 대응하는 방법! PrivacyInfo.xcprivacy란?

 

Webエンジニア学習部屋

駆け出しwebエンジニアのあめの学習記録webサイトです。WordPressなどのCMSを使わずに自分でHTMLファイルやphpファイルを作成しサーバーにアップしています。プログラミングで悩んだポイントや

appdev-room.com

 

 

 

 

반응형
Posted by blueasa
, |

Unity 2021.3.33f1

Xcode 15.3

----

 

[빌드 에러 로그]

----

[Error] Type specifier missing, defaults to 'int'; ISO C99 and later do not support implicit int
[Warning] Incompatible pointer to integer conversion passing 'void *' to parameter of type 'int'
----
BOOL __swizzled_didReceiveRemoteNotification(id self, SEL _cmd, UIApplication* application, NSDictionary* userInfo,void (^UIBackgroundFetchResult)(void) ) {
    NSLog(@"swizzled didReceiveRemoteNotification");
    
    [[AppsFlyerLib shared] handlePushNotification:userInfo];
    
    if(__original_didReceiveRemoteNotification_Imp){
        return ((BOOL(*)(id, SEL, UIApplication*, NSDictionary*, (UIBackgroundFetchResult)))__original_didReceiveRemoteNotification_Imp)(self, _cmd, application, userInfo, nil);
    }
    return YES;
}

----

 

[2024-03-13] Xcode 15.3이 나와서 업데이트 하고 iOS 빌드 하니 위와 같은 에러가 난다.

에러 위치는 AppsFlyer 인데..

검색(아래 링크 참조)해보니 Xcode 15.3 업데이트 하고나서 같은 에러를 겪고 있는 것 같다.

AppsFlyer에서 대응해줘야 될 것 같은데, 링크에서 임시방편으로 수정하는 방법을 알려주고 있다.

일단 빌드를 할 수 없으니 Xcode 15.2로 다운그레이드 했다.

 

[결론]

Xcode 15.3을 쓰려면 두가지 방법중 하나를 고르자.

1. [임시방편] 당장 써야겠다면, 해당 에러 위치를 아래 내용을 참조해서 수정하자.

    1.1. AppsFlyer+AppController.m 파일 위치

          1.1.1. 수동 설치 했으면 : ..\Assets\AppsFlyer\Plugins\iOS\AppsFlyer+AppController.m

          1.1.2. Package로 설치했으면 : /Library/PackageCache/appsflyer-unity-plugin@xxxxxxxxxx/AppsFlyer+AppController.m

    1.2. AppsFlyer+AppController.m line:144 위치의 return 하는 소스를 아래와 같이 수정하자.

          -> return ((BOOL(*)(id, SEL, UIApplication*, NSDictionary*, int(UIBackgroundFetchResult)))__original_didReceiveRemoteNotification_Imp)(self, _cmd, application, userInfo, nil);

[참조] https://github.com/AppsFlyerSDK/appsflyer-unity-plugin/issues/263

 

[추가]

Xcode 15.3부터 C99 이상 강제하는 것 같다.

AppsFlyer 현재 버전이 C89인지.. C99 지원을 안하는 것 같은데..

결국 AppsFlyer가 C99 대응 업데이트를 해줘야 Xcode 15.3에서 정상적으로 빌드가 되지 싶다.

 

 

[참조] https://github.com/AppsFlyerSDK/appsflyer-unity-plugin/issues/263

 

Cannot build with xCode 15.3 · Issue #263 · AppsFlyerSDK/appsflyer-unity-plugin

Hello! I just updated xCode to 15.3 and there seems to be an ISO C99 issue with the AppsFlyer+AppController.mfile. The attached image is a screenshot from xCode 15.2 where the issue Type specifier ...

github.com

 

 

반응형
Posted by blueasa
, |

[링크] https://es1015.tistory.com/391

 

[Mac] Xcode 빠르게 설치하기 (AppStore 다운로드 실패 해결)

Mac에서 Xcode를 설치하는 가장 기본적인 방법은 AppStore를 통해서 다운로드하는 방법이다. 하지만 이 방법은 시간도 엄청 오래 걸리고, 도중에 멈추거나 실패하는 경우가 많다. 가령 아래와 같이 Ap

es1015.tistory.com

 

 

 

반응형
Posted by blueasa
, |

How do I get a Dictionary key by value in C#?

Dictionary<string, string> types = new Dictionary<string, string>()
{
    {"1", "one"},
    {"2", "two"},
    {"3", "three"}
};

 

 

[Answer]

Values do not necessarily have to be unique, so you have to do a lookup. You can do something like this:

var myKey = types.FirstOrDefault(x => x.Value == "one").Key;

If values are unique and are inserted less frequently than read, then create an inverse dictionary where values are keys and keys are values.

 

 

[출처] https://stackoverflow.com/questions/2444033/get-dictionary-key-by-value

 

Get dictionary key by value

How do I get a Dictionary key by value in C#? Dictionary<string, string> types = new Dictionary<string, string>() { {"1", "one"}, {"2", "two&q...

stackoverflow.com

 

[참조] https://miuna3.tistory.com/81

 

C# 사전 Dictionary의 Value 값으로 Key 찾기

Dictionary Dic = new Dictionary() { {"1", "Mon"}, {"2", "Tue"}, {"3", "Thu"} };사전이 위와같이 있다고 가정하자. 현재 Dic 의 키 "1" 은 값 "Mon"을 가지고있다. "Mon"으로 키 "1"을 찾고자 할 때에는 아래와 같이 사용하

miuna3.tistory.com

 

반응형
Posted by blueasa
, |