Get it on Google Play


Wm뮤 :: Wm뮤

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

Recent Comment

Archive


'전체 글'에 해당되는 글 1012건

  1. 2021.02.11 DLL 생성 예제
  2. 2021.02.06 캐릭터 포즈 망가졌을때
  3. 2021.02.05 유니티 애니메이터 관련
  4. 2021.02.03 안드로이드 빌드관련
2021. 2. 11. 20:16 윈도우폼

깔아라

 

 

 

 

초 심플하게 8을 리턴하는 함수이다. 뭔가 이것저것 빠져있는데 왜 뺐는지 기억이 안난다. 잘 작동한다

#include <windows.h>
#include "stdafx.h"

extern "C" __declspec(dllexport) int m_test8()//완성판
{
	return 8;
};

눌러라

 

 

dll은 프로젝트폴더의 Debug폴더에 있다. 디버그가 싫으면 릴리즈로 하면 릴리즈 폴더에 생긴다

dll만 쓸거면 dll만 뽑으면 됨

 

 

불러오기 위해 C#폴더에 넣을건데 C#은 경로가 조금 다르다 

프로젝트 폴더/프로젝트이름 폴더/bin/Debug 폴더에 넣는다

프로젝트 폴더가 두개있는게 이상하지만 얘내가 그렇게 만든거니까 그러려니 하자

 

 

불러올때

using System;
using System.Windows.Forms;

namespace Dll_Import_Test
{
    static class Program
    {
        /// <summary>
        /// 해당 응용 프로그램의 주 진입점입니다.
        /// </summary>
        [System.Runtime.InteropServices.DllImport("user32.dll")] //키보드 상태
        public static extern int GetKeyboardState(byte[] pbKeyState);


        [System.Runtime.InteropServices.DllImport("Dll_Export_Test.dll")]
        public static extern int m_test8();


        [System.Runtime.InteropServices.DllImport("Dll_Export_Test.dll")]
        public static extern void m_test38(int[] _array);
        
        [STAThread]
        static void Main()
        {
            
            if (m_test8() == 8)
            {
                MessageBox.Show("m_test8() == 8");
            }
            else
            {
                MessageBox.Show("m_test8() 읽기 에러");
            }

            Application.EnableVisualStyles();
            Application.SetCompatibleTextRenderingDefault(false);
            Application.Run(new Form1());

        }
    }
}

동일 DLL에서 여러 함수를 불러오는 예제와 윈도우즈에 포함된 DLL을 불러오는 예제로 되어있다

 

 

 

 

 

38버전은 dll에서 배열로드버전이다

// Dll_Export_Test.cpp: 콘솔 응용 프로그램의 진입점을 정의합니다.
//
#include <windows.h>
#include "stdafx.h"

//extern은 내보낸다는 소리
//"C"은 C언어 규약으로 작성이랬던가 확실하지 않음, 이거 안넣으면 읽기실패
//__declspec(dllexport)은 dll로 내보내겠다는 뜻
//__stdcall 이건 호출방식인데 일반적으로 C#에선 __stdcall을씀(c++ 기본값은 __cdecl)
extern "C" __declspec(dllexport) void __stdcall m_test38(int _array[])//완성판
{
	for (int i = 0; i < 8; i++)
	{
		_array[i] = i;
	}
	return;
};

 

40버전은 길이를 입력받아서 처리하는거, 가능하면 자동화하고 싶었지만

C++의 배열시스템이 너무 후진적이라 이따구로 함

배열포인터에는 길이정보가 없다고 하니까 더 많은걸 바라지 말아라.

extern "C" __declspec(dllexport) void __stdcall m_test40(int _array[],int _length)
{
	for (int i = 0; i < _length; i++)
	{
		_array[i] = i;
	}
	return;
};

불러올떄

using System;
using System.Windows.Forms;

namespace Dll_Import_Test
{
    static class Program
    {
        /// <summary>
        /// 해당 응용 프로그램의 주 진입점입니다.
        /// </summary>
        [System.Runtime.InteropServices.DllImport("Dll_Export_Test.dll")]
        public static extern void m_test40(int[] _array,int _length);
        
        [STAThread]
        static void Main()
        {
            
            var _array = new int[16];
            m_test40(_array, _array.Length);
            MessageBox.Show($"m_test40(): [{string.Join(", ", _array)}]");
            
            

            Application.EnableVisualStyles();
            Application.SetCompatibleTextRenderingDefault(false);
            Application.Run(new Form1());

        }
    }
}

 

결과

 

 

 

여기까진 맛보기고 이제 다중 DLL 참조가 있다

'윈도우폼' 카테고리의 다른 글

잘 안 쓰는 윈폼코드 모음  (0) 2021.07.19
윈폼 키보드마우스  (0) 2021.01.17
c# 멀티스레드 기본소스  (0) 2020.11.23
posted by 모카쨩
2021. 2. 6. 00:18 Unity

 

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

 

 

 

 

 

 

 

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

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

 

AhzkwidAvatarTools - Wmup - BOOTH

- 内容 - avatar merge, shapekey copy, pose copy アバター作業をするときに使うツールです アップデートや動作の保証はしません ぼくがアバターを作るときに使うために作りました で、作りたいとき

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

뜨면서 안 되는데

걍 오류난거니 빠른 리셋이 답이다

 

 

 

 

 

 

 

 

 

 

 

'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로 익스포트해서 올린다이다

'Unity' 카테고리의 다른 글

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

  • total
  • today
  • yesterday

Recent Post

저사양 유저용 블로그 진입