Get it on Google Play


Wm뮤 :: 'Unity' 카테고리의 글 목록 (15 Page)

블로그 이미지
가끔 그림그리거나 3D모델링하거나
취미로 로봇만드는
전자과 게임프로그래머 (퇴사함)
2022.3.22f1 주로 사용
모카쨩
@Ahzkwid

Recent Comment

Archive


2021. 3. 1. 00:19 Unity

https://wmmu.tistory.com/entry/%EC%9C%A0%EB%8B%88%ED%8B%B0-%EC%95%A0%EB%93%9C%EB%AA%B9-2023

 

유니티 애드몹 2023

https://wmmu.tistory.com/entry/FireBase-%EC%95%A0%EB%93%9C%EB%AA%B9 유니티 애드몹 2021 얘내들은 툭하면 API를 바꾼다. 개빡칠노릇 설명서 developers.google.com/admob/unity/quick-start?hl=ko 해당링크에서 들어가보면 이런걸

wmmu.tistory.com

2023판

21판은 API 30까지만 지원된다

 

 

 

 

얘내들은 툭하면 API를 바꾼다. 개빡칠노릇

 

 

설명서

developers.google.com/admob/unity/quick-start?hl=ko

 

해당링크에서 들어가보면 이런걸 다운받아서 쓰라고 한다

 

 

 

 

github.com/googleads/googleads-mobile-unity/releases/tag/v5.4.0

 

Release Google Mobile Ads Unity Plugin v5.4.0 · googleads/googleads-mobile-unity

Release Notes: Add support for iOS14 with Google's SKAdNetwork identifiers automatically included in Info.plist. Added the RewardedInterstitialAd format. This feature is currently in private beta....

github.com

여기서 유니티 패키지를 다운받아서 푼다

 

유니티 버전은 2019.4.1f1이랑 2019.4.31f1사용했다

 

 

 

 

 

그리고 리졸브를 한다

 

누르고 생기는 스크립트오브젝트에 애드몹 코드를 입력한다

없으면 하단의 샘플코드를 넣는다

ca-app-pub-3940256099942544~3347511713

키가 이상하면 강종당하니 조심하자

 

 

apps.admob.com/

애드몹 코드는 애드몹사이트에서 여기에 숨겨져있다

 ~가 들어간 코드여야 한다

 

 

 

전면광고방법

developers.google.com/admob/unity/interstitial?hl=ko

 

 

 

using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using GoogleMobileAds.Api;
public class AdMobLoader : MonoBehaviour
{
#if UNITY_ANDROID
    string adUnitId = "ca-app-pub-3940256099942544/1033173712";
#elif UNITY_IOS
        string adUnitId = "ca-app-pub-3940256099942544/4411468910";
#else
        string adUnitId = "unexpected_platform";
#endif

    public void Start()
    {
        // Initialize the Google Mobile Ads SDK.
        MobileAds.Initialize(initStatus => { });

        RequestInterstitial();


    }

    public void Update()
    {
    }


    private InterstitialAd interstitial;

    private void RequestInterstitial()
    {
        // Initialize an InterstitialAd.
        interstitial = new InterstitialAd(adUnitId);
        // Create an empty ad request.
        AdRequest request = new AdRequest.Builder().Build();
        interstitial.OnAdLoaded += HandleOnAdLoaded;
        // Load the interstitial with the request.
        interstitial.LoadAd(request);

        // Called when an ad request has successfully loaded.
    }

    public float timer = 5f; //5초뒤 광고표시
    public void HandleOnAdLoaded(object sender, System.EventArgs args)
    {
        MonoBehaviour.print("HandleAdLoaded event received");

        //로드끝나면 timer만큼 지난뒤 광고표시
        Invoke(nameof(ShowInterstitial), timer);
    }
    void ShowInterstitial()
    {
        Debug.Log("광고가 표시됨");
        if (interstitial.IsLoaded())
        {
            interstitial.Show();
        }
    }

    private void InterstitialDestroy()
    {
        interstitial.Destroy();
    }
}

기본 샘플코드를 이용하여 만들어봤다

print같은 이상한 코드가 있지만 귀찮으니 안 고쳤다

 

코드위치는 여기고 /가 들어간 코드여야 한다

 

 

 

 

'Unity' 카테고리의 다른 글

유니티 동영상 촬영, 스크린샷 캡쳐  (0) 2021.03.18
유니티 카드보드 VR 사용법  (0) 2021.02.28
VRM 파일 만들기  (0) 2021.02.25
posted by 모카쨩
2021. 2. 28. 18:10 Unity

'Unity' 카테고리의 다른 글

유니티 애드몹 2021  (2) 2021.03.01
VRM 파일 만들기  (0) 2021.02.25
에셋스토어 업로드 2021  (0) 2021.02.22
posted by 모카쨩
2021. 2. 25. 02:01 Unity

 

 

 

 

vrm.dev/en/how_to_make_vrm/

설명은 이걸 읽어보면서 한다

 

github.com/vrm-c/UniVRM

여기서 읽어보면

 

 

 

 

 

여기서 다운받을수 있다고 한다

github.com/vrm-c/UniVRM/releases

 

Releases · vrm-c/UniVRM

Unity package that can import and export VRM format - vrm-c/UniVRM

github.com

 

 

저걸 잘 찾아서 누른다. 아래에 잘보면 있다

 

 

유니티에 살살 말아준다

유니티 버전은 해당 홈페이지에 써있으니 참고하자

 

 

 

 

 

먼저 매터리얼 설정을 해주어야 한다

 

먼저 전부 Standard, Unlit, MToon셋중 하나로 바꿔야 쓸수있다

 

 

그럼 이렇게 이상하게 밝아진다

 

 

 

에미션을 꺼준다

 

언릿느낌내고싶으면 Shade Color도 끈다

 

 

정상화된모습

 

 

 

캐릭터 프리팹을 만들어서 누르고 해당메뉴를 선택한다

 

 

다 입력하고 익스포트한다. 옵션은 하단 참조

 

a person who can perform with this avatar =공연가능(스트리머 사용같은거인듯)
Violent acts using this avatar =폭력행위
sexuality acts using this avatar = 성적사용
for commercial use =상업적사용

 

 

맞게 입력해준다

 

라이센스 유형은

Redistribution Prohibited =재배포 금지

 

 

 

 

저장했으면 올려라 (필수는 아님)

hub.vroid.com/

 

VRoid Hub

VRoid Hub is a platform where users can post their 3D characters and share them with other users. With VRoid Hub, users can post their own 3D models to make their characters come alive thanks to a vast range of animations available on the character's profi

hub.vroid.com

 

 

결과물은 이런느낌이다 (픽시브에 로그인 해야만 3D로 보인다)

hub.vroid.com/en/characters/2187411622167215549

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

-추가

저장할때 에셋폴더에 저장하면 이렇게 BlendShapes 폴더와 파일이 생기는데

BlendShape를 눌러주자

 

 

Select BlendShapeClip를 보면서 맞춰준다

 

쉐이프키규약은 다음과 같다

vrm.dev/docs/univrm/blendshape/univrm_blendshape/

 

MMD쉐이프키 대응은 다음과 같다. 

VRM A I U E O Blink Joy Angry
MMD(EN) Ah There Cormorant Huh Your Blink Where anger
MMD(JP) まばたき にこ 怒り
VRM Sorrow Fun LookUp LookDown LookLeft LookRight Blink_L Blink_R
MMD(EN) Tears Wa - - - - Wink Wink right
MMD(JP) なみだ - - - - ウインク ウインク右

요새 일본어 쉐이프키도 많이 쓰길래 일본어도 올림

ワ(Wa)가 없으면 あ(Ah)로 해도 된다

 

 

전부 끝나면 VRM 프리팹을 눌러서

 

 

눈위치를 설정해준다

씬뷰에서 보면서 맞춰주자

 

 

 

VRM프리팹을 선택후 다시 익스포트 한다

 

 

 

 

 

 

 

 

 

태그 : VRM 파일 변환

'Unity' 카테고리의 다른 글

유니티 카드보드 VR 사용법  (0) 2021.02.28
에셋스토어 업로드 2021  (0) 2021.02.22
캐릭터 포즈 망가졌을때  (0) 2021.02.06
posted by 모카쨩
2021. 2. 22. 00:23 Unity

 

 

 

https://wmmu.tistory.com/entry/%EC%97%90%EC%85%8B%EC%8A%A4%ED%86%A0%EC%96%B4-%EC%97%85%EB%A1%9C%EB%93%9C-2023

 

에셋스토어 업로드 2023

https://wmmu.tistory.com/entry/%EC%97%90%EC%85%8B%EC%8A%A4%ED%86%A0%EC%96%B4 에셋스토어 업로드 가이드라인 unity3d.com/asset-store/sell-assets/submission-guidelines 설명서 unity3d.com/asset-store/sell-assets 눌러 그러면 여기로 이동

wmmu.tistory.com

 

이건 구버전이다

위 링크의 2023판 참조

 

 

 

 

 

 

 

 

 

 

가이드라인

unity3d.com/asset-store/sell-assets/submission-guidelines

 

설명서

unity3d.com/asset-store/sell-assets

눌러

 

그러면 여기로 이동됨

publisher.assetstore.unity3d.com/sales.html

 

 

publisher.assetstore.unity3d.com/create.html

 

만든다

publisher.assetstore.unity3d.com/packages.html

그러면 여기로 가서

 

세이브를 하면 초안이 완성된다

 

 

 

필수는 아니지만 가능하면 이름까지 만들어주자

 

 

 

나가보면 생긴거 확인 가능

 

 

 

assetstore.unity.com/packages/tools/utilities/asset-store-tools-115

Asset Store Tools 추가

 

 

그러면 이렇게 에셋이 생긴다

난 나이트비전 쉐이더를 올릴것

 

 

 

 

 

눌러

 

 

 

Tick the box if your content uses "Package Manager" dependencies

이건 체크 안해도 된다

아마 간접적으로 연결된 에셋들도 엮는거 같은데 그러면 불필요한것까지 같이 올라갈수도있을듯

 

 

1차완료

 

 

다시 메타데이터를 짤때다

Icon Image랑 Card Image는 둘다 아이콘이미지인데 사이즈의 차이

Cover Image는 찍고 들어가면 왼쪽에 뜨는 이미지

셋다 필수고

Social Media Image는 필수는 아닌거 같은데 그래도 넣어주자

다 똑같은 이미지로 해도 된다

 

 

 

스크린샷들을 올리는곳, 많을수록 좋다

커버이미지에 넣었던건 넣지말자

 

 

다끝난줄 알았니? 아니다. 호환목록을 작성해주어야 한다

1. 솔직히 쉐이더인데 리눅스는 기대도 안하고, 나머지는 문제없다

2. 2017까지는 확인했는데 이전버전은 몰라서 패스, 어차피 너무 옛날버전이라서

3. 기존 렌더파이프랑 호환되는지, 스탠다드는 유니티 스탠다드를 말하고,

LW는 모바일, HD는 멀티패스같은 고퀄용, Custom RP는 말그대로 커스텀된거

나는 오버레이 방식이 일반 마테리얼이라서 전부 호환된다

4. 다른 패키지를 받아야만 쓸수있는건지, 나는 그없이니 No했다

 

 

 

 

다했으면 올리삼

무슨 팝업뜨면  그냥 OK하면 된다

 

 

 

 

 

 

'Unity' 카테고리의 다른 글

VRM 파일 만들기  (0) 2021.02.25
캐릭터 포즈 망가졌을때  (0) 2021.02.06
유니티 애니메이터 관련  (0) 2021.02.05
posted by 모카쨩
2021. 2. 21. 19:33 Unity/shader
using UnityEngine;
using UnityEditor;

public class AhzkwidToonInspector : ShaderGUI
{
    public enum _RM
    {
        Opaque, Cutout, Transparent
    }
    public enum _BM
    {
        None, ext, Body, Hair, Cloth
    }
    public enum _CM
    {
        Back, None, Front
    }

    public override void OnGUI(MaterialEditor materialEditor, MaterialProperty[] properties)
    {
        MaterialProperty _RenderMode
        , _BlendMode

        , _MainTex
        , _ColorTex
        , _Color
        , _EmissionTex
        , _EmissionColor
        , _Hue
        , _Sat
        , _Val
        , _Contrast
        , _outline_width
        , _OutlineTex
        , _OutlineMask
        , _OutlineColor
        , _Metallic
        , _ColorRamp
        , _CullingMode
        , _OutlineSat;

        _RenderMode = FindProperty("_RenderMode", properties);
        _BlendMode = FindProperty("_BlendMode", properties);
        _MainTex = FindProperty("_MainTex", properties);
        _ColorTex = FindProperty("_ColorTex", properties);
		_Color = FindProperty("_Color", properties);
		_EmissionTex = FindProperty("_EmissionTex", properties);
		_EmissionColor = FindProperty("_EmissionColor", properties);
        _Hue = FindProperty("_Hue", properties);
        _Sat = FindProperty("_Sat", properties);
        _Val = FindProperty("_Val", properties);
        _Contrast = FindProperty("_Contrast", properties);
        _outline_width = FindProperty("_outline_width", properties);
        _OutlineTex = FindProperty("_OutlineTex", properties);
        _OutlineMask = FindProperty("_OutlineMask", properties);
        _OutlineColor = FindProperty("_OutlineColor", properties);
        _Metallic = FindProperty("_Metallic", properties);
        _ColorRamp = FindProperty("_ColorRamp", properties);
        _CullingMode = FindProperty("_CullingMode", properties);
        _OutlineSat = FindProperty("_OutlineSat", properties);
        

        // render the default gui

        Material targetMat = materialEditor.target as Material;

		// see if redify is set, and show a checkbox
		EditorGUI.BeginChangeCheck();
        {
            
            EditorGUIUtility.labelWidth = 0f;//컬러위치 
            targetMat.SetInt("_SrcBlend", (int)UnityEngine.Rendering.BlendMode.One);
            targetMat.SetInt("_DstBlend", (int)UnityEngine.Rendering.BlendMode.OneMinusSrcAlpha);
            //targetMat.SetInt("_DstBlend", (int)UnityEngine.Rendering.BlendMode.Zero);
            materialEditor.ShaderProperty(_RenderMode, new GUIContent("Render Mode"));
            //materialEditor.ShaderProperty(_BlendMode, new GUIContent("Blend Mode", "Blend Mode"));
            GUILayout.Label("Main Maps", EditorStyles.boldLabel);
            materialEditor.TexturePropertySingleLine(new GUIContent("Main Texture", "Blend Color Texture"), _MainTex, _BlendMode);
            EditorGUI.indentLevel = 1; //얼마나 오른쪽으로 이동시킬지

            switch ((_BM)_BlendMode.floatValue)
            {
                case _BM.None:
                    break;
                case _BM.ext:
                    materialEditor.TexturePropertySingleLine(new GUIContent("Blend Color", "Blend Color Texture"), _ColorTex, _Color);
                    materialEditor.TexturePropertySingleLine(new GUIContent("Emission Color", "Emission Color Texture"), _EmissionTex, _EmissionColor);
                    break;
                case _BM.Body:
                    break;
                case _BM.Hair:
                    break;
                case _BM.Cloth:
                    break;
                default:
                    break;
            }
            switch ((_BM)_BlendMode.floatValue)
            {
                case _BM.None:
                    break;
                default:
                    materialEditor.ShaderProperty(_Hue, new GUIContent("Hue"));
                    materialEditor.ShaderProperty(_Sat, new GUIContent("Sat"));
                    materialEditor.ShaderProperty(_Val, new GUIContent("Val"));
                    break;
            }
            switch ((_BM)_BlendMode.floatValue)
            {
                case _BM.None:
                    break;
                case _BM.ext:
                    materialEditor.ShaderProperty(_Contrast, new GUIContent("Contrast"));
                    materialEditor.ShaderProperty(_Metallic, new GUIContent("Metallic"));
                    materialEditor.ShaderProperty(_ColorRamp, new GUIContent("ColorRamp"));
                    break;
                case _BM.Body:
                    break;
                case _BM.Hair:
                    break;
                case _BM.Cloth:
                    break;
                default:
                    break;
            }
            EditorGUI.indentLevel = 0;

            EditorGUILayout.Space();
            GUILayout.Label("Outline", EditorStyles.boldLabel);
            materialEditor.ShaderProperty(_outline_width, new GUIContent("Outline Width"));
            if(_outline_width.floatValue>0)
            {
                EditorGUI.indentLevel = 1; //얼마나 오른쪽으로 이동시킬지
                //materialEditor.TexturePropertySingleLine(new GUIContent("Outline Color", "Outline Color Texture"), _OutlineTex, _OutlineColor);
                //materialEditor.TexturePropertySingleLine(new GUIContent("Outline Color", "Outline Color Texture"), _OutlineColor);
                materialEditor.TexturePropertySingleLine(new GUIContent("Outline Mask", "Outline Mask Texture"), _OutlineMask);
                materialEditor.ShaderProperty(_OutlineSat, new GUIContent("Outline Sat"));


                EditorGUI.indentLevel = 0; //얼마나 오른쪽으로 이동시킬지
            }
            switch ((_BM)_BlendMode.floatValue)
            {
                case _BM.None:
                    break;
                case _BM.ext:
                    break;
                case _BM.Body:
                    break;
                case _BM.Hair:
                    break;
                case _BM.Cloth:
                    break;
                default:
                    break;
            }
            switch ((_RM)_RenderMode.floatValue)
            {
                case _RM.Opaque:
                    break;
                case _RM.Cutout:
                    break;
                case _RM.Transparent:
                    break;
                default:
                    break;
            }

            materialEditor.ShaderProperty(_CullingMode,new GUIContent("Culling Mode", "Outline Mask Texture"));
            switch ((_CM)_CullingMode.floatValue)
            {
                case _CM.Back:
                    break;
                case _CM.None:
                    break;
                case _CM.Front:
                    break;
                default:
                    break;
            }
            EditorGUILayout.Space();
            //materialEditor.RenderQueueField();
            //materialEditor.EnableInstancingField();
            //materialEditor.DoubleSidedGIField();
            //base.OnGUI(materialEditor, properties);
        }
	}
}

AhzkwidToonShader에 포함된 예제

 


public enum _RM
{
        Default, Overlay
}

public override void OnGUI(MaterialEditor materialEditor, MaterialProperty[] properties)
{

    //쉐이더 프로퍼티들을 불러옴
    MaterialProperty _RenderMode = FindProperty(nameof(_RenderMode), properties);
    MaterialProperty _MainTex = FindProperty(nameof(_MainTex), properties);
    
    
    
    //인스펙터 변경사항이 있는지 체크하는거, 필수는 아님
    EditorGUI.BeginChangeCheck();
    {
        //해당 변수의 값을 읽어옴
        switch ((_RM)_RenderMode.floatValue)
        {
            case _RM.Default:
                //행동1
                break;
            case _RM.Overlay:
                //행동2
                break;
            default:
                break;
        }

        //일반 인스펙터 (참조변수가 앞에 있는게 특징이다)
        materialEditor.ShaderProperty(_RenderRange, "Render Range");
        
        
        //텍스처 인스펙터 (GuIContent를 써서 설명도 같이 넣고 있다. 그냥 문자열로 넣어도 됨)
        materialEditor.TexturePropertySingleLine(new GUIContent("Main Texture", "Default Texture"), _MainTex);

    }
}

 

 

 

 

들여쓰기

EditorGUI.indentLevel = 1; //얼마나 오른쪽으로 이동시킬지
{
    var guiContent=new GUIContent("Main Texture(변수명)", "Default Texture(설명)");
    materialEditor.TexturePropertySingleLine(guiContent, _MainTex);
}
EditorGUI.indentLevel = 0; //얼마나 오른쪽으로 이동시킬지

 

 

 

헤더+들여쓰기

//헤더
GUILayout.Label("헤더", EditorStyles.boldLabel);
{
    //들여쓰기
    EditorGUI.indentLevel = 1; //얼마나 오른쪽으로 이동시킬지
    {
        materialEditor.ShaderProperty(_Value1, "인스펙터1");
        materialEditor.ShaderProperty(_Value2, "인스펙터2");
        materialEditor.ShaderProperty(_Value3, "인스펙터3");
        materialEditor.ShaderProperty(_Value4, "인스펙터4");
    }
    EditorGUI.indentLevel = 0;
}

 

 

렌더큐옵션

EditorGUILayout.Space();
EditorGUILayout.Space();
materialEditor.RenderQueueField();

 

 

어스밴스 옵션

EditorGUILayout.Space();
EditorGUILayout.Space();
GUILayout.Label("Advanced Oprions", EditorStyles.boldLabel);
{
    materialEditor.EnableInstancingField();
    materialEditor.DoubleSidedGIField();
}

 

 

 

 

 

쉐이더 코드에 다음과같이 넣어줘야 작동한다

FallBack은 필수는 아니고 쉐이더 미싱일때 작동하는거

SubShader
{
		FallBack "Diffuse" //기본마테리얼
		CustomEditor "AhzkwidToonInspector" //커스텀인스펙터
}

'Unity > shader' 카테고리의 다른 글

모션블러 종류  (1) 2021.03.02
스텐실  (0) 2021.01.20
자주쓰는 유니티 쉐이더 코드모음  (0) 2020.11.04
posted by 모카쨩
2021. 2. 6. 00:18 Unity

 

T포즈나 기본포즈 넣고나서 프리뷰 키고나서 끄고 컨트롤 제트

 

 

 

 

 

 

 

근데 기본포즈 애니메이션이 없으면 이 툴의 PoseCopyTool을 이용해 기본포즈로 리셋하자

https://ahzkwid.booth.pm/items/4716458

 

AvatarPoseCopyTool - Wmup - BOOTH

- 内容 - Unityポーズコピーツールです。 ポーズが壊れたときやコピーするときに使用します。 ヒューマノイドのみ可能です。 商業的利用が可能 このファイルを使用することで起こる問題と

ahzkwid.booth.pm

 

 

 

 

'Unity' 카테고리의 다른 글

에셋스토어 업로드 2021  (0) 2021.02.22
유니티 애니메이터 관련  (0) 2021.02.05
안드로이드 빌드관련 (구글플레이 관련)  (0) 2021.02.03
posted by 모카쨩
2021. 2. 5. 13:53 Unity

끄면 애니메이션 전환(트랜지션)이 즉시 이루어진다

 

 

다음 트랜지션에 의해 해당 트랜지션이 강종될수있다

 

 

 

OR트랜지션

 

 

--------------------------------------------------------------------------

 

 

아무런 조건없는데 무한루프돌때

 

 

--------------------------------------------------------------------------

update보다 조금 늦게 호출

 

 

 

--------------------------------------------------------------------------

Sync예제

표정등을 혼합할때 사용한다

 

--------------------------------------------------------------------------

파라미터로 애니메이션 속도 조정

이동속도같은걸 맞출때 좋음

 

 

 

--------------------------------------------------------------------------

체크를 해제하면 애니메이션을 리셋후 적용시키지 않고 현재상태에서 덧씌운다

 

 

 

코드들

 

 

 

애니메이션 변경시 호출

using UnityEngine;

public class ChangeStateChecker : StateMachineBehaviour
{
    override public void OnStateEnter(Animator animator, AnimatorStateInfo stateInfo, int layerIndex)
    {
        Debug.Log("On State Enter");
    }

    override public void OnStateExit(Animator animator, AnimatorStateInfo stateInfo, int layerIndex)
    {
        Debug.Log("On State Exit");
    }

    override public void OnStateUpdate(Animator animator, AnimatorStateInfo stateInfo, int layerIndex)
    {
        Debug.Log("On State Update");
    }

    override public void OnStateMove(Animator animator, AnimatorStateInfo stateInfo, int layerIndex)
    {
        Debug.Log("On State Move");
    }

    override public void OnStateIK(Animator animator, AnimatorStateInfo stateInfo, int layerIndex)
    {
        Debug.Log("On State IK");
    }
}

 

애니메이션 정지 (신형)//아마도

한번도 쓸일이 없었다

Animator animator;
AnimationState animationState;
animator.StopPlayback(); //정지(아마도)

 

 

애니메이터 조작 세가지

가급적 파라미터 조작만 쓰자

GetComponent<Animator>().Play("StateName"); //State이동(실행)

animator.Play("StateName",-1,0); //재생취소후 재생

characterSpine.GetComponent<Animator>().SetBool("ParameterName", boolValue); //파라미터 bool 설정

 

 

 

애니메이션 재생 (구형)

Animation animation;
AnimationClip animationClip;
animation.Play(animationClip.name);

 

특정시간부터 재생

var animator = coordinator.animator;
var layer = animator.GetLayerIndex("Base Layer");
var animatorStateInfo = animator.GetCurrentAnimatorStateInfo(layer);
var time = 1.2f;
var normalizedTime = time / animatorStateInfo.length;
animator.Play(animatorStateInfo.shortNameHash, layer, normalizedTime);

 

 


적용예제

void JumpAnimation(float jumpTime)
{
    var layer = animator.GetLayerIndex("Base Layer");
    var animatorStateInfo = animator.GetCurrentAnimatorStateInfo(layer);
    animator.Play(animatorStateInfo.shortNameHash, layer, jumpTime / animatorStateInfo.length);
}

 

 

애니메이터 현재 재생시간


var layer = animator.GetLayerIndex("Base Layer");
var animatorStateInfo = animator.GetCurrentAnimatorStateInfo(layer);
float time = animatorStateInfo.length * animatorStateInfo.normalizedTime;//(애니메이션 길이) * (0~1시간)

 

 

애니메이터 구간 점프

void Update()
{

    var layer = animator.GetLayerIndex("Base Layer");
    var animatorStateInfo = animator.GetCurrentAnimatorStateInfo(layer);
    float time = animatorStateInfo.length * animatorStateInfo.normalizedTime;//(애니메이션 길이) * (0~1시간)

    float jumpStartTime = 5;
    float jumpEndTime = 10;
    if ((time > jumpStartTime) && (time < jumpEndTime))
    {
        animator.Play(animatorStateInfo.shortNameHash, layer, jumpEndTime / animatorStateInfo.length);
    }
}

 

 

 

현재 트랜지션이 지정값과 맞는지 불러옴

animator.GetCurrentAnimatorStateInfo(layerIndex:0).IsName("스테이트이름")

 

 

레이어 혼합강도 설정

var weight = 1f;
var lerpSpeed = 1f;
var layer = animator.GetLayerIndex("Base Layer") ;
animator.SetLayerWeight(layer, Mathf.Lerp(animator.GetLayerWeight(layer), weight, lerpSpeed));

 

 

 

애니메이터 보호장치, 근데 이딴거 쓰지말고 아래 이미지를 써라

public class AnimationStateProtector : MonoBehaviour
{
    Animator animator;

    int lastState = 0;
    int enableCount = 0;


    void Start()
    {
        animator = GetComponent<Animator>();
    }
    void Update()
    {
         var animatorStateInfo =  animator.GetCurrentAnimatorStateInfo(0);
        lastState = animatorStateInfo.shortNameHash;
    }
    void OnEnable()
    {
        if (enableCount!=0)
        {
            animator.Play(lastState);
        }
        enableCount++;
    }
}

 

디버그모드에서 켜면 보인다. 위와 동일한 기능임

 

 

 

 

 

 

애니메이터 스테이트 변동 체크

void OnEnable()
{
    StartCoroutine(CharacterAnimatorStateChengedChecker());
}

[System.Serializable]
public class AnimatorStateInfoEvent : UnityEngine.Events.UnityEvent<AnimatorStateInfo> { }


public AnimatorStateInfoEvent OnAnimatorStateChengedEvent;
public IEnumerator AnimatorStateChengedChecker()
{
    while (true)
    {
        var fullPathHashPrevious = GetComponent<Animator>().GetCurrentAnimatorStateInfo(layerIndex:0).fullPathHash;
        yield return new WaitUntil(() => GetComponent<Animator>().GetCurrentAnimatorStateInfo(layerIndex: 0).fullPathHash != fullPathHashPrevious);

        OnAnimatorStateChengedEvent.Invoke(GetComponent<Animator>().GetCurrentAnimatorStateInfo(layerIndex: 0));
    }
}

 

 

 

 

 

부위 가져오기

var transform=Animator.GetBoneTransform(HumanBodyBones.Hips);

 

 

 

 

BlendTree를 읽어서 인스펙터에 업데이트


    public List<Emote> emotes;
    public Animator animator;
    [System.Serializable]
    public class Emote
    {
        //public Animation animation;
        public AnimationClip animation;
        public Sprite icon;
        public float threshold;
    }
    public AnimationClip[] EmoteAnimations
    {
        get
        {
            return emotes.ConvertAll(x=>x.animation).ToArray();  
        }
    }
#if UNITY_EDITOR
    public UnityEditor.Animations.AnimatorController animatorController;
    [ContextMenu("ImportFromBlendTree")]
    public void ImportFromBlendTree()
    {
        var layerIndex = 0;
        var stateName = "Emote";
        {
            //var animatorController = animator.runtimeAnimatorController as UnityEditor.Animations.AnimatorController;
            var layer = animatorController.layers[layerIndex];
            var states = layer.stateMachine.states;
            var state = System.Array.Find(states, x => x.state.name == stateName);
            //var blendTrees = System.Array.ConvertAll(states, state => state.state.motion as UnityEditor.Animations.BlendTree);
            //blendTrees = System.Array.FindAll(blendTrees, blendTree => blendTree != null);
            var blendTree = state.state.motion as UnityEditor.Animations.BlendTree;
            var motions = System.Array.ConvertAll(blendTree.children, children => children.motion);

            for (int i = 0; i < motions.Length; i++)
            {
                var motion= motions[i];
                var animation = motion as AnimationClip;
                var emoteIndex = emotes.FindIndex(x => x.animation == animation);
                if (emoteIndex == -1)
                {
                    var emote = new Emote();
                    emote.animation = animation;
                    emoteIndex = emotes.Count;
                    emotes.Add(emote);
                }
                emotes[emoteIndex].threshold = (float)i/motions.Length;
            }
        }
        UnityEditor.EditorUtility.SetDirty(this);
    }
#endif

 

 

 

 

 

 

 

 

 

 

 

 

 

 

--------------------------------------------------------------------------

창 위치가 우주로 날아가서 개빡칠때

NullReferenceException: Object reference not set to an instance of an object
UnityEditor.Graphs.AnimationStateMachine.Graph.GenerateConnectionKey

뜨면서 안 되는데

Animator윈도우를 껐다 키면 고쳐진다 

 

 

 

 

 

 

 

 

 

 

 

'Unity' 카테고리의 다른 글

캐릭터 포즈 망가졌을때  (0) 2021.02.06
안드로이드 빌드관련 (구글플레이 관련)  (0) 2021.02.03
디버그방법모음  (0) 2021.02.02
posted by 모카쨩
2021. 2. 3. 10:28 Unity

Minimum API Level

 

api 29 설치방법

 

프로젝트 세팅에서 타겟api를 29로 놓고 빌드하면 이런창이 뜬다

눌러야 하는데 관리자 모드로 안하면 아래같은 창이 뜬다

 

 

Required API level 29

Unable to install additional SDK Platform

 

 

관리자모드로 들어가야 하는데 그냥 키면 안되고

작업관리자에서 유니티를 전부꺼야만 꺼야지 관리자모드가 켜진다

 

 

이후 관리자모드로 진입한다

 

 

잘된다

 

다음과 같이 수동으로 안드로이드 스튜디오랑 연동하는 방법도 있다

근데 이렇게 깔면 이런 오류가 뜸, 고치는법도 있다는데 거기까진 안해봄

 

 

SDK Tools version 0.0 < 26.1.1

 

 

 

근데 이 방법은 29쓰다가 34를 쓰는식으로 중간에 버전을 건너뛰면 

32는 설치가 불가한다던지 하는 소소한 문제가 있다.

중간버전 설치방법

더보기

도중에 32, 33을 건너뛰어서 34만 설치되어있다

34폴더를 지우고 32부터 설치한다

아니면 꼭 지울필요는 없고 폴더를 잠깐 옮겨두면 됨
폴더를 이동시키는건 시간이 오래걸리니까 잠깐 휴지통에 보내뒀다가 설치후 부활시키자

 

 

 

 

구식방법

 

---------------------------------------------------------------------------------------------------------------------

 

 

이 버전은 Google Play 64비트 요구사항을 준수하지 않습니다.
다음 APK 또는 App Bundle은 64비트 기기를 지원하지만, 32비트 네이티브 코드만 포함합니다. [1]
앱에 64비트 및 32비트 네이티브 코드를 포함하세요. Android App Bundle 게시 형식을 사용하여 각 기기 아키텍처가 자동으로 필요한 네이티브 코드만 수신하도록 하세요. 그래야 앱의 전체 크기를 줄일 수 있습니다.

 

프로젝트 세팅의 Player-> OtherSettings에서 ARM64비트를 켠다 

 

 

 

 

---------------------------------------------------------------------------------------------------------------------

 

이미 버전 코드가 1인 APK 또는 Android App Bundle이 있으므로 다른 버전 코드를 사용해야 합니다.

 

 

 

 

옛날 스마트폰 그래픽지원

 

 

 

 

---------------------------------------------------------------------------------------------------------------------

warring google play games was not configured game services will not work correctly

해라

 

 

 

---------------------------------------------------------------------------------------------------------------------

앱이 TV를 지원하는 APK로 게시됩니다. 즉, 기본 활동의 인텐트 필터 중 하나에 <category android:name="android.intent.category.LEANBACK_LAUNCHER"/>가 있습니다. 대신 App Bundle로 게시되어야 합니다.

 

 

얼핏보면 저 Android TV를 해제해야할거같다

 

정답은 AAB로 익스포트해서 올린다이다

 

 

 

 

 

 

 

 


---------------------------------------------------------------------------------------------------------------------

 

 

이 앱은 Android 14 이상을 타겟팅하며
현재 Play 결제 라이브러리 버전이 Android 14를 지원하지 않습니다.
최신 Android 버전을 타겟팅하려면 PBL 버전을 5.2.1 또는 6.0.1 이상으로 업데이트하세요.

 

 

 

난 In App Purchasing 지워서 해결함

업데이트 하는거도 방법인데 이 앱은 저거 쓸일이 없었다

 

그런데 이거 이렇게 해결하니 아래문제가 생겼다

 

조치 필요: 지원되는 버전의 Google Play 결제 라이브러리로 이전하세요
휴대용 선풍기
휴대용 선풍기
2024년 5월 29일 01:36
Play 결제 라이브러리의 수명 주기 및 관련된 지원 중단 일정이 변경됩니다. 현재 이전 버전의 라이브러리를 사용 중이시므로 앞으로 지켜야 할 새로운 주요 일정을 알려드립니다.

2024년 8월 31일까지 모든 신규 앱과 기존 앱 업데이트에서 결제 라이브러리 버전 6 이상을 사용해야 합니다. 앱을 업데이트하기 위해 시간이 더 필요한 경우 2024년 11월 1일까지 기한 연장을 요청할 수 있습니다.

여기에서 지원 중단에 대해 자세히 알아보세요.

앱 게시 및 업데이트가 중단되지 않도록 해당 날짜 전에 업데이트하세요. 위에 언급된 날짜부터 Play Console에서 Play 결제 라이브러리 6보다 낮은 버전을 사용하는 앱은 게시 및 업데이트가 차단됩니다.

다음 단계: 최신 버전의 Play 결제 라이브러리로 이전하는 방법에 대한 자세한 내용은 개발자 웹사이트에서 확인할 수 있습니다.

 

 

아니 합격이라며...

근데 다시 깔려고 해도 패키지 매니저의 IAP 버전한계가 있다

 

그래서 걍 2020.3.48f1에서 2022.3.22f1으로 이전하기로 함

 

'Unity' 카테고리의 다른 글

유니티 애니메이터 관련  (0) 2021.02.05
디버그방법모음  (0) 2021.02.02
유니티 UI  (0) 2021.01.30
posted by 모카쨩

저사양 유저용 블로그 진입