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

카테고리

분류 전체보기 (2794)
Unity3D (852)
Script (91)
Extensions (16)
Effect (3)
NGUI (81)
UGUI (9)
Physics (2)
Shader (37)
Math (1)
Design Pattern (2)
Xml (1)
Tips (201)
Link (23)
World (1)
AssetBundle (25)
Mecanim (2)
Plugins (78)
Trouble Shooting (70)
Encrypt (7)
LightMap (4)
Shadow (4)
Editor (12)
Crash Report (3)
Utility (9)
UnityVS (2)
Facebook SDK (2)
iTween (3)
Font (13)
Ad (14)
Photon (2)
IAP (1)
Google (8)
Android (51)
iOS (44)
Programming (478)
Server (33)
Unreal (4)
Gamebryo (56)
Tip & Tech (185)
협업 (11)
3DS Max (3)
Game (12)
Utility (68)
Etc (98)
Link (32)
Portfolio (19)
Subject (90)
iOS,OSX (55)
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

Unity 2021.3.44f1

Unity 6000.0.22f1

----

 

유니티 Device Simulator에 iPhone 14 이상이 없어서 찾아보니 만들어 놓은게 있어서 폴더 파일 위치나 이름들만 정리해서 UnityPackage 형태로 Export 해서 올려 둠.

 

폴더명이나 위치, 파일명 등은 Unity6에서 추가 설치되는 Device Simulator의 Package에 있는 걸 참조해서 수정했다.

아래 스크린샷 참조

 

 

아래 파일을 Import만 하면 그대로 잘 적용 된다.

(Unity6에서도 Import해서 잘 되는 것 확인함.)

 

[iPhone 14 & 15 시뮬레이터 정의 파일]

com.unity.device-simulator-Apple-iPhone-14-and-15-models.unitypackage
3.19MB

 

 

 

[참조] https://github.com/henryprescott/com.unity.device-simulator-Apple-iPhone-14-and-15-models?tab=readme-ov-file

 

GitHub - henryprescott/com.unity.device-simulator-Apple-iPhone-14-and-15-models: A simple .device (Device Info Asset) JSON file

A simple .device (Device Info Asset) JSON file with settings for iPhone 14 and 15 devices. Safe Area adjusted to the standard style of Unity devices. - henryprescott/com.unity.device-simulator-App...

github.com

 

[참조] https://gist.github.com/mrcarriere/049596740fb52907edf68712d2818df0

 

iPhone 14 Pro & Pro Max Device Definitions

iPhone 14 Pro & Pro Max Device Definitions. GitHub Gist: instantly share code, notes, and snippets.

gist.github.com

 

반응형
Posted by blueasa
, |

Unity 2021.3.44f1

----

 

Unity Editor의 Scene View에서 Camera의 View Frustum을 볼 수 있게 해주는 스크립트.

View Frustum을 보고 싶은 카메라에 Component로 넣고 실행하면 Scene View에 보인다.

 

using UnityEngine;

public class FrustumViewer : MonoBehaviour
{
// 에디터에서만 작동하도록 define
#if UNITY_EDITOR

    Camera m_Camera = null;
    Vector3[] m_nearCorners = new Vector3[4]; //Approx'd nearplane corners
    Vector3[] m_farCorners = new Vector3[4]; //Approx'd farplane corners
    Plane[] m_camPlanes = null;


    private void OnEnable()
    {
        m_Camera = this.GetComponent<Camera>();
    }

    void Update()
    {
        DrawFrustum(m_Camera);
    }

    void DrawFrustum(Camera _cam)
    {
        if (null == _cam)
            return;

        m_camPlanes = GeometryUtility.CalculateFrustumPlanes(_cam); //get planes from matrix

        Plane temp = m_camPlanes[1]; m_camPlanes[1] = m_camPlanes[2]; m_camPlanes[2] = temp; //swap [1] and [2] so the order is better for the loop
        for (int i = 0; i < 4; i++)
        {
            m_nearCorners[i] = Plane3Intersect(m_camPlanes[4], m_camPlanes[i], m_camPlanes[(i + 1) % 4]); //near corners on the created projection matrix
            m_farCorners[i] = Plane3Intersect(m_camPlanes[5], m_camPlanes[i], m_camPlanes[(i + 1) % 4]); //far corners on the created projection matrix
        }

        for (int i = 0; i < 4; i++)
        {
            Debug.DrawLine(m_nearCorners[i], m_nearCorners[(i + 1) % 4], Color.red, Time.deltaTime, true); //near corners on the created projection matrix
            Debug.DrawLine(m_farCorners[i], m_farCorners[(i + 1) % 4], Color.blue, Time.deltaTime, true); //far corners on the created projection matrix
            Debug.DrawLine(m_nearCorners[i], m_farCorners[i], Color.green, Time.deltaTime, true); //sides of the created projection matrix
        }
    }



    Vector3 Plane3Intersect(Plane p1, Plane p2, Plane p3)
    { 
        //get the intersection point of 3 planes
        return ((-p1.distance * Vector3.Cross(p2.normal, p3.normal)) +
                (-p2.distance * Vector3.Cross(p3.normal, p1.normal)) +
                (-p3.distance * Vector3.Cross(p1.normal, p2.normal))) /
                (Vector3.Dot(p1.normal, Vector3.Cross(p2.normal, p3.normal)));
    }

#endif
}

 

 

[참조] https://grrava.blogspot.com/2014/04/render-view-frustrum-of-camera-in-unity.html

 

Render the view frustum of a camera in Unity

When you select a camera in the Unity editor, gray lines indicate where the view frustum is. When it's deselected the lines are obviously no...

grrava.blogspot.com

 

반응형
Posted by blueasa
, |

Unity 2021.3.42f1

----

 

언젠가부터 에디터의 GameView에서 Resolution을 비율이 아닌 해상도를 선택(예:1920x1080 Landscape)하면 Scale 때문에 한화면에 다 보이지 않는 현상이 발생함.

그래서 Scale을 최소치로 내리는데, 문제는 Play를 실행하면 최소치로 내려놓은 Scale 값이 초기화되면서 화면이 다시 커진다.

그래서 Play 이후에 다시 Scale 값을 내리는 불편함이 생기는데..

원인 및 해결을 위해 찾다보니 아래 [참조]와 같은 내용이 있다.

 

[참조] https://discussions.unity.com/t/game-view-scale-wont-go-lower-than-1-3x-in-16-9-display-mode/922853/18

 

[참조] 글을 보면 GameView를 껐다 다시 키라고 하는데, 해보니 정말로 잘 된다.

그리고, Window 해상도 및 배율 관련 이야기도 나온다.

 

글 내용들과 해결책으로 유추해 봤을 때 현재 상태를 가정해보면 아래와 같을 거라 생각한다.

 

[가정] GameView의 Scale 관련 저장되는 값은 GameView가 최초 켜질 때 결정되고 로컬에 저장된다.

[가정] 에디터가 켜지는 건 GameView 켜지는 것과 무관한다.(위의 가정에서의 초기값 갱신이 안됨)

 

   [예상 플로우]

1) (최초 Unity가 켜지면서) 최초 GameView가 켜지고 초기값이 저장됨.

2) 모니터의 해상도나 배율이 변경됨.

3) Unity Editor를 새로 켜도 GameView가 새로 켜지는 건 아니라서 해상도/배율 관련 저장값이 갱신 안됨.

4) GameView에서 Resolution 값으로 해상도를 셋팅(예:1920x1080 Landscape)하고 Scale값을 최소로 내려서 화면에 Fit 되게 한 후에 Play 버튼을 눌러서 실행해도 Scale 값이 원래 값으로 되돌려짐.

----

5) GameView를 껐다가 새로 켬.

6) GameView Scale 값이 달라진 걸 볼 수 있음(초기값 재저장 된 듯)

 

 

  [결론]

Play 버튼을 눌렀을 때, GameView Scale 값이 설정한대로 고정안되고 변경된다면,

GameView를 껐다가 새로 키자.(Editor 껐다 키는거 아님)

반응형
Posted by blueasa
, |

Unity 2021.3.42f1

----

 

[참고]

[링크] https://blueasa.tistory.com/2853

 

위 링크의 내용을 한 번 해보고,

안되면 아래 스크립트를 사용해 보자.

----

 

에디터의 GameView에서 Resolution을 비율이 아닌 해상도를 선택(예:1920x1080 Landscape)하면 Scale 때문에 한화면에 다 보이지 않는다.

그래서 Scale을 최소치로 내리는데, 문제는 Play를 실행하면 최소치로 내려놓은 Scale 값이 초기화되면서 화면이 다시 커진다.

그래서 Play 이후에 다시 Scale 값을 내리는 불편함이 생기는데, 찾아보니 같은 불편을 느끼는 사람이 많은 것 같다.

아래와 같은 스크립트를 만들어놨길래 써보니 꽤 마음에 든다.

 

아래 스크립트를 Editor 폴더에 넣어주기만 하면 된다.

using System;
using System.Reflection;
using UnityEditor;
using UnityEngine;
using Object = UnityEngine.Object;

[InitializeOnLoad]
public static class FixResolutionScale
{
    static FixResolutionScale()
    {
        EditorApplication.playModeStateChanged += OnPlayStateChanged;
        SetGameViewScale();
    }

    private static void OnPlayStateChanged(PlayModeStateChange playModeStateChange)
    {
        SetGameViewScale();
    }

    private static void SetGameViewScale()
    {
        Type gameViewType = GetGameViewType();
        EditorWindow gameViewWindow = GetGameViewWindow(gameViewType);

        if (gameViewWindow == null)
        {
            Debug.LogError("GameView is null!");
            return;
        }

        var defScaleField = gameViewType.GetField("m_defaultScale", System.Reflection.BindingFlags.Instance | System.Reflection.BindingFlags.NonPublic);

        //whatever scale you want when you click on play
        float defaultScale = 0.1f;

        var areaField = gameViewType.GetField("m_ZoomArea", System.Reflection.BindingFlags.Instance | System.Reflection.BindingFlags.NonPublic);
        var areaObj = areaField.GetValue(gameViewWindow);

        var scaleField = areaObj.GetType().GetField("m_Scale", System.Reflection.BindingFlags.Instance | System.Reflection.BindingFlags.NonPublic);
        scaleField.SetValue(areaObj, new Vector2(defaultScale, defaultScale));
    }

    private static Type GetGameViewType()
    {
        Assembly unityEditorAssembly = typeof(EditorWindow).Assembly;
        Type gameViewType = unityEditorAssembly.GetType("UnityEditor.GameView");
        return gameViewType;
    }

    private static EditorWindow GetGameViewWindow(Type gameViewType)
    {
        Object[] obj = Resources.FindObjectsOfTypeAll(gameViewType);
        if (obj.Length > 0)
        {
            return obj[0] as EditorWindow;
        }
        return null;
    }
}

 

 

 

[출처] https://discussions.unity.com/t/game-view-scale-on-compilation-play/217998

 

반응형
Posted by blueasa
, |
I used the post in the 'EDIT 2' to come up with a decent solution. I don't know if it will work 100% of the time and I would love for someone to correct me if I have chosen a poor solution. This should allow me to run code before the build starts, and if the build fails or succeeds without changing the unity build pipeline.
class CustomBuildPipeline : MonoBehaviour, IPreprocessBuildWithReport, IPostprocessBuildWithReport
{
    public int callbackOrder => 0;

    // CALLED BEFORE THE BUILD
    public void OnPreprocessBuild(BuildReport report)
    {
        // Start listening for errors when build starts
        Application.logMessageReceived += OnBuildError;
    }

    // CALLED DURING BUILD TO CHECK FOR ERRORS
    private void OnBuildError(string condition, string stacktrace, LogType type)
    {
        if (type == LogType.Error)
        {
            // FAILED TO BUILD, STOP LISTENING FOR ERRORS
            Application.logMessageReceived -= OnBuildError;
        }
    }

    // CALLED AFTER THE BUILD
    public void OnPostprocessBuild(BuildReport report)
    {
        // IF BUILD FINISHED AND SUCCEEDED, STOP LOOKING FOR ERRORS
        Application.logMessageReceived -= OnBuildError;
    }
}

 

[출처] https://stackoverflow.com/questions/58840114/unity-editor-detect-when-build-fails

반응형
Posted by blueasa
, |

Unity 2021.3.16f1

Burst 1.6.6

----

 

유니티에서 필요한 에셋을 추가(Magica Cloth)하니 Package Manager에서 Burst도 추가를 요구한다.

추가하고 빌드하니 아래와 같은 폴더를 자동생성하고 있다.

 

[폴더명 예시] BuildName_BurstDebugInformation_DoNotShipDeleter

 

그래서 이전에 했던방식과 같이 OnPostprocessBuild에서 빌드 후 삭제하기로 함

 

using System.IO;
using UnityEditor;
using UnityEditor.Build;
using UnityEditor.Build.Reporting;

/// <summary>
/// Burst 관련 빌드 후 생성되는 백업 폴더 삭제
/// </summary>
public sealed class BurstDebugInformation_DoNotShipDeleter : IPostprocessBuildWithReport
{
    public int callbackOrder => 0;
    // 확정된 폴더명은 readonly 변수로 만듬
    private readonly string m_strBurstDebugInformation_DoNotShip = "BurstDebugInformation_DoNotShip";

    public void OnPostprocessBuild(BuildReport report)
    {
        var summary = report.summary;
        var platform = summary.platform;

        if (platform != BuildTarget.StandaloneWindows 
            && platform != BuildTarget.StandaloneWindows64
            && platform != BuildTarget.Android  // Android 플랫폼에서도 작동하도록 추가
            && platform != BuildTarget.iOS)     // iOS 플랫폼에서도 작동하도록 추가
        {
            return;
        }

        if (summary.options.HasFlag(BuildOptions.Development))
        {
            return;
        }

        var outputPath = summary.outputPath;
        var outputDirectoryPath = Path.GetDirectoryName(outputPath);

        // 빌드 폴더 이름이 FileName을 따라가서 FileName을 폴더명으로 쓰도록 수정
        var outputFileName = Path.GetFileNameWithoutExtension(outputPath);
        //var productName = PlayerSettings.productName;

        var backUpThisFolderPath = $"{outputDirectoryPath}/{outputFileName}_{m_strBurstDebugInformation_DoNotShip}";

        if (!Directory.Exists(backUpThisFolderPath))
        {
            return;
        }

        Directory.Delete(backUpThisFolderPath, true);
    }
}

 

[참조] https://forum.unity.com/threads/burstdebuginformation_donotship-in-builds.1172273/

 

BurstDebugInformation_DoNotShip in builds

After a fairly recent update to Burst, I'm not seeing a folder named this in my builds: Gravia_BurstDebugInformation_DoNotShip A couple of questions:...

forum.unity.com

 

반응형
Posted by blueasa
, |

[사용엔진] Unity 2021.3.9f1

 

Unity 2021을 설치하고 Android 빌드를 하니 빌드 파일 위치에 'BuildFileName_BackUpThisFolder_ButDontShipItWithYourGame'라는 폴더가 생긴다.

 

난 프로젝트 메인 위치에 빌드 파일 생성하게 하다보니 'BuildFileName_BackUpThisFolder_ButDontShipItWithYourGame' 폴더가 git이 인식하는 위치에 생성되는데다

BuildFileName을 계속 넘버링하면서 만들다보니 위의 폴더도 계속 생성된다.

 

  [문제점]

1. 폴더가 파일명에 맞게 계속 생성돼서 계속 많아진다.(SSD/HDD 용량이슈 등)

2. 생성되는 폴더 위치가 git 관리 영역이라 git에 생성된 파일로 보여서 문제가 생긴다.(파일 갯수도 많음)

 

그래서 유니티에 생성 안하게 하는 옵션이 없나하고 검색해 봤지만 별시리 없는 것 같고..

계속 검색하다보니 PostprocessBuild로 해당 폴더를 삭제 해버리는 방식을 사용하는 포스팅을 보고 적용해서 잘되는 것을 확인하고 올려 둔다.

 

[해결방법]

- 아래 Script를 Editor 폴더에 넣자~

 

using System.IO;
using UnityEditor;
using UnityEditor.Build;
using UnityEditor.Build.Reporting;

public sealed class WindowsIL2CPPBuildBackUpThisFolderDeleter : IPostprocessBuildWithReport
{
    public int callbackOrder => 0;
    // 확정된 폴더명은 readonly 변수로 만듬
    private readonly string m_strBackUpThisFolder_ButDontShipItWithYourGame = "BackUpThisFolder_ButDontShipItWithYourGame";

    public void OnPostprocessBuild(BuildReport report)
    {
        var summary = report.summary;
        var platform = summary.platform;

        if (platform != BuildTarget.StandaloneWindows 
            && platform != BuildTarget.StandaloneWindows64
            && platform != BuildTarget.Android  // Android 플랫폼에서도 작동하도록 추가
            && platform != BuildTarget.iOS)     // iOS 플랫폼에서도 작동하도록 추가
        {
            return;
        }

        if (summary.options.HasFlag(BuildOptions.Development))
        {
            return;
        }

        var outputPath = summary.outputPath;
        var outputDirectoryPath = Path.GetDirectoryName(outputPath);
        
        // 빌드 폴더 이름이 FileName을 따라가서 FileName을 폴더명으로 쓰도록 수정
        var outputFileName = Path.GetFileNameWithoutExtension(outputPath);
        //var productName = PlayerSettings.productName;

        var backUpThisFolderPath = $"{outputDirectoryPath}/{outputFileName}_{m_strBackUpThisFolder_ButDontShipItWithYourGame}";

        if (!Directory.Exists(backUpThisFolderPath))
        {
            return;
        }

        Directory.Delete(backUpThisFolderPath, true);
    }
}

 

아래 참조한 포스팅의 스크립트는 Windows에서 Android 플랫폼 빌드를 했을때 처리가 안되고,

BuildFileName을 제대로 찾지 못해서 스크립트 내용 중 일부를 수정해서 제대로 삭제하는 것까지 확인함.

 

[추가 처리]

혹시 몰라서 git에 잘못 올라가지 않도록, git ignore list에 아래와 같이 추가 해놓음.

[git ignore list 추가] *_BackUpThisFolder_ButDontShipItWithYourGame/

 

 

[참조] https://baba-s.hatenablog.com/entry/2022/02/08/090000

 

【Unity】Windows IL2CPP ビルドした時に生成される XXXX_BackUpThisFolder_ButDontShipItWithYourGame を自動で削

ソースコード using System.IO; using UnityEditor; using UnityEditor.Build; using UnityEditor.Build.Reporting; public sealed class WindowsIL2CPPBuildBackUpThisFolderDeleter : IPostprocessBuildWithReport { public int callbackOrder => 0; public void OnPo

baba-s.hatenablog.com

 

반응형
Posted by blueasa
, |

[요약]

Scene View 껐다 다시 키자.

 

 

[링크] https://ssscool.tistory.com/498

 

유니티 씬뷰에서 UI, 오브젝트 모두 선택이 안될 때 ( Unity Can't select object in scene view )

유니티 씬뷰에서 UI, 오브젝트 등 모두 선택이 되지 않을 때 ( Unity Can't select object in scene view ) 유니티 에디터 버전을 2019.4 LTS 에서 2020.3 LTS로 버전업을 했다. 2019.4 버전대의 고질병인 JDK, SD..

ssscool.tistory.com

 

반응형
Posted by blueasa
, |

개인적인 학습 목적으로 번역된 강좌글입니다. 

 

제 블로그로 링크가 되어 있는것은, 이쪽으로 번역글을 옮기는 과정이 번거롭고

비효율적이기 때문에 그렇고, 결코 블로그 홍보를 목적으로 하지 않습니다.

 

다른 곳에 퍼가신다면 일본어 원문 링크를 꼭 표기하여 주시기 바랍니다.

 

유니티 에디터에서 기본 제공되는 에디터 UI에서 더 나아가 직접 커스터마이즈하고

툴을 만들기 위해 필요한 정보들을 담고 있습니다.

 

원문

http://anchan828.github.io/editor-manual/web/index.htmlViewer

 

1장 에디터 확장에서 사용하는 폴더Viewer

2장 표준에서 사용할 수 있는 에디터 확장기능Viewer

3장 데이터 저장Viewer

4장 ScriptableObjectViewer

5장 SerializedObject에 대해서Viewer

6장 EditorGUIViewer

7장 EditorWindowViewer

8장 MenuItemViewer

9장 CustomEditorViewer

10장 PropertyDrawerViewer

11장 ProjectWindowUtilViewer

12장 Undo에 대해서Viewer

13장 다양한 이벤트의 콜백Viewer

14장 ReorderbleListViewer

15장 ScriptTemplatesViewer

16장 Gizmo(기즈모)Viewer

17장 Handle(핸들)Viewer

18장 HierarchySortViewer

19장 GUI를 직접 만들기Viewer

20장 OverwriterViewer

21장 파티클을 제어하기Viewer

22장 SpriteAnimationPreview(스프라이트 목록의 표시)Viewer

23장 SpriteAnimationPreviwe(스프라이트 애니메이션)Viewer

24장 씬 Asset에 스크립트를 AttachViewer

25장 시간을 제어하는 TimeControlViewer

26장 AssetDatabaseViewer

27장 HideFlagsViewer

28장 AssetPostprocessorViewer(완)



[출처] http://lab.gamecodi.com/board/zboard.php?id=GAMECODILAB_Lecture&page=1&sn1=&divpage=1&sn=off&ss=on&sc=on&select_arrange=hit&desc=asc&no=477

반응형
Posted by blueasa
, |


[Free Asset] https://assetstore.unity.com/packages/tools/utilities/keystore-helper-58627


using UnityEngine;
using UnityEditor;
using System.IO;
 
[InitializeOnLoad]
public class PreloadSigningAlias
{
 
    static PreloadSigningAlias ()
    {
        PlayerSettings.Android.keystorePass = "KEYSTORE_PASS";
        PlayerSettings.Android.keyaliasName = "ALIAS_NAME";
        PlayerSettings.Android.keyaliasPass = "ALIAS_PASSWORD";
    }
 
}



[출처] https://forum.unity.com/threads/android-keystore-passwords-not-saved-between-sessions.235213/

반응형
Posted by blueasa
, |