Get it on Google Play


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

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

Recent Comment

Archive


2023. 11. 15. 16:11 Unity

 

https://assetstore.unity.com/packages/tools/modeling/mesh-baker-5017

 

Mesh Baker | 모델링 | Unity Asset Store

Get the Mesh Baker package from Ian Deane and speed up your game development process. Find this & other 모델링 options on the Unity Asset Store.

assetstore.unity.com

 

무료판 써도 작동은 한다

 

 

 

 

 

 

합치고 싶은 메쉬 최상단 오브젝트에 컴포넌트 위처럼 넣고 돌린다

결과물

 

 

 

이거 사용할때 주의점이 무조건 드로우콜 낮으면 좋은줄 알고 다 합쳐버리는 사람도 있는데 

PC기준 드로우콜 1000, 모바일 기준 드로우콜 200까지는 성능에 전혀 영향이 없고 버텍스 갯수에 영향받는다

즉 다 합쳐버리면 컬링이 안 되므로 오히려 무거워진다

 

그래서 드로우콜이 너무 뜨지 않는 이상 안 합치는게 좋음

버텍스는 PC기준 3M 이하가 좋다

위 기준은 2020기준이라 추후 기기 스펙에 따라 달라짐

 

실제로 전에 어디서 주워들은건 있어서 드로우콜만 영향받는줄 알고 빡빡 우기는 사람도 있더라, 아는척 하려면 테스팅 한번은 해보고 아는척 하자

 

 

그리고 벽투과 아웃라인 생성할때 (옵치 화물표시같은거) 메쉬가 쪼개져 있으면 서로 간섭하는 문제 있는데 해당현상 해결용으로 쓸수도 있다 

 

 

 

 

 

 

 

 

 

 

 

 

'Texture Bake Result' must be set to add more objects to a combined mesh that already contains objects. Try enabling 'clear buffers after bake'

오류가 뜰경우

 

Clear Buffers After Bake 체크

 

 

 

 

 

 

 

아래는 구버전사용할때 캡쳐해둔거

 

 

 

 

 

 

 

 

 

 

 

 

 

 

'Unity' 카테고리의 다른 글

에셋스토어 업로드 2023  (0) 2023.11.21
unity mmd 관련  (0) 2023.10.01
유니티 애드몹 2023  (0) 2023.09.24
posted by 모카쨩
2023. 10. 14. 12:29 Unity/shader

 

 

Shader "Unlit/AndroidDepth"
{
    Properties
    {
		_DepthTex("_DepthTex", 2D) = "white" {}
    }
    SubShader
    {
        Tags { 
		"RenderType" = "Transparent"
		"Queue" = "Transparent"
        }
        LOD 100
        
        ZWrite Off

        Pass
        {
            CGPROGRAM
            #pragma vertex vert
            #pragma fragment frag
            // make fog work
            #pragma multi_compile_fog

            #include "UnityCG.cginc"

            struct appdata
            {
                float4 vertex : POSITION;
                float2 uv : TEXCOORD0;
            };

            struct v2f
            {
                float2 uv : TEXCOORD0;
                float4 vertex : SV_POSITION;

				float4 screenPos : TEXCOORD1;
            };

            
			sampler2D _DepthTex;
			float4 _DepthTex_ST;

            v2f vert (appdata v)
            {
                v2f o;
                o.vertex = UnityObjectToClipPos(v.vertex);
                o.uv = TRANSFORM_TEX(v.uv, _DepthTex);
				o.screenPos = ComputeScreenPos(o.vertex);//면이 닿는 부분
                return o;
            }

            fixed4 frag (v2f i) : SV_Target
            {



                
				
				float4 screenPos = float4(i.screenPos.xyz, i.screenPos.w);
				float4 screenPosNorm = screenPos / screenPos.w;


				
				screenPosNorm.x*= _ScreenParams.x/ _ScreenParams.y;
				screenPosNorm.x+= 0.5;
				screenPosNorm.x-= _ScreenParams.x/ _ScreenParams.y/2;


				screenPosNorm.y*=_DepthTex_ST.y;
				screenPosNorm.x*=_DepthTex_ST.y;
				
				screenPosNorm.x+=0.5;
				screenPosNorm.x-=_DepthTex_ST.y/2;
				
				
				float depCol= tex2D(_DepthTex, screenPosNorm.xy);
				
				 fixed4 col=0;
				col.a=1;
				col.r=depCol*2;



                return col;
            }
            ENDCG
        }
    }
}

단 처음에 Rect사이즈를 가져와야 한다

이걸

이렇게 넣으면 끝

내가 이걸 왜 만들었냐 하면 안드로이드에선

정확히는 안드로이드의 OpenGLES3에서 _CameraDepthTexture를 가져올때 문제가 발생하기 때문

그리고 만약 멀티플랫폼을 지원해야 한다면 아래와같은 분기처리를 해줘야 한다

 #if UNITY_IOS || UNITY_STANDALONE
 //기존코드
#else
//커스텀 뎁스
#endif

그리고 당연히 카메라설정도 반영해야 하는데 난 FOV만 바꿔서 FOV만 설정함

using UnityEngine;

public class CameraCopy : MonoBehaviour
{
    void Update()
    {
        var camMain = Camera.main;
        var camThis = GetComponent<Camera>();
        camThis.fieldOfView = camMain.fieldOfView;
    }
}

뎁스 카메라에 이걸 넣어줌

 

결과물

근데 빌드하고 보니 뎁스 카메라도 안 되더라

찌발

 

 

왠지 렌더텍스처를 동적으로 생성하면 될거같기도 한데

이러면 생성할때마다 마테리얼에 하나하나 할당해줄거 생각하니 끔찍해서

결국 분기처리해서 안드로이드쓸때만 작동 안 하게 함

(어차피 아이폰은 된다고)

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

유니티 쉐이더 오류 모음  (0) 2023.12.18
PerlinNoise HLSL  (0) 2023.04.25
스크린 오버레이 샘플  (0) 2023.01.20
posted by 모카쨩
2023. 9. 24. 06:35 Unity

 

 

 

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 해당링크에서 들어가보면 이런걸 다운받아서 쓰라고 한다 github.com/googleads/googleads-mobile-unity/releases/tag/v5

wmmu.tistory.com

 

 

진짜 미쿠친구들인가?

또또또 API 바꿨다

기능차이도 없던데 대체 왜 바꾼거임?

일단 대략적인건 위 링크이고

이번엔 기존에 있던 플러그인을 업뎃하는 작업만 해서

신규프로젝트에서 작업하면 뭔가 새로운 창이 뜰지도 모른다

 

 

 

설명서

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

 

해당링크에서 플러그인 다운로드 링크 누르면 뭐 가입하라고 궁시렁 대는데

https://github.com/googleads/googleads-mobile-unity/releases/tag/v8.5.2

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

 

 

저기엔 안 써있는데 2020.3.48f1이 아니면 오류폭탄이 날아온다

버전이 낮아도 안되고 높아도 안 된다

2021.1.10f1까지는 작동은 되더라

2019.4.31f1은 미지원이다

 

 

 

일단 업뎃과정에서 플러그인 싹 지우고 넣었기 때문에 세팅이 날아가서 다시 설정해줌

그래도 이번엔 뭐 이상한 창 안떠서 다행이네

 

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

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

ca-app-pub-3940256099942544~1033173712

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

 

 

 

https://apps.admob.com/

애드몹 코드는 애드몹사이트에서

 

여기에 숨겨져있다 ~가 들어간 코드여야 한다

 

전면광고방법

https://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 interstitialAd;

    private void RequestInterstitial()
    {
        // create our request used to load the ad.
        var adRequest = new AdRequest();

        // send the request to load the ad.
        InterstitialAd.Load(adUnitId, adRequest,
            (InterstitialAd ad, LoadAdError error) =>
            {
                // if error is not null, the load request failed.
                if (error != null || ad == null)
                {
                    Debug.LogError("interstitial ad failed to load an ad " +
                                   "with error : " + error);
                    return;
                }

                Debug.Log("Interstitial ad loaded with response : "
                          + ad.GetResponseInfo());

                interstitialAd = ad;

                //로드끝나면 5초뒤 광고표시
                Invoke(nameof(ShowInterstitial), timer);
            });
    }
    public float timer = 5f;
    void ShowInterstitial()
    {
        Debug.Log("광고가 표시됨");
        //if (interstitialAd.CanShowAd())
        {
            interstitialAd.Show();
        }
    }

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

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

이번에 개많이 바뀌어서 개고생함

이러고 또 나중에 바뀌겠지 ㅡㅡ

 

 

 

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

 

 

 

필수적인 작업은 다 끝났다

이제 부가작업

이거 넣어줘야 에디터에서 안드로이드모드로 재생해도 오류가 안 뜬다

 

 

 

 

 

 

 

 

 

'Unity' 카테고리의 다른 글

unity mmd 관련  (0) 2023.10.01
유니티 캐릭터 추적 마커  (0) 2023.09.21
유니티 APK 용량  (0) 2023.09.08
posted by 모카쨩
2023. 9. 21. 03:08 Unity

 


    public GameObject playerIcon;
     List<GameObject> playerIcons = new List<GameObject>();
    void Start()
    {
        playerIcon.SetActive(false);
    }
    void LateUpdate()
    {
        var gameSystem = GetComponent<GameSystem>();
        {
            //아군 식별 마커
            var characters = GameSystem.GetInGameCharacters(gameSystem.team);
            for (int i = playerIcons.Count; i < characters.Length; i++)
            {
                var instant = Instantiate(playerIcon, playerIcon.transform.parent);
                playerIcons.Add(instant);
            }
            for (int i = characters.Length; i < playerIcons.Count; i++)
            {
                playerIcons[i].SetActive(false);
            }
            var cam = Camera.main;
            for (int i = 0; i < characters.Length; i++)
            {
                var markerPosition = characters[i].transform.position + Vector3.up * 1f;
                if ((Vector3.Distance(markerPosition, cam.transform.position) > 10)
                    && (Quaternion.Angle(cam.transform.rotation, Quaternion.LookRotation(markerPosition - cam.transform.position)) < 90))
                {
                    var screenPoint = RectTransformUtility.WorldToScreenPoint(cam, markerPosition);
                    playerIcons[i].SetActive(true);
                    playerIcons[i].GetComponent<RectTransform>().position = screenPoint;
                }
                else
                {
                    playerIcons[i].SetActive(false);
                }
            }
        }
    }

 

웨이포인트 같은거 표시할때도 씀

'Unity' 카테고리의 다른 글

유니티 애드몹 2023  (0) 2023.09.24
유니티 APK 용량  (0) 2023.09.08
유니티 킬로그  (0) 2023.08.28
posted by 모카쨩
2023. 9. 9. 19:09 Unity/C#

 

 

 

생각보다 쓸일이 많더라

한 점에서 Path까지의 최단지점

맨 위에건 AI가 짜주었다

    Vector3 ClosestPoint(Vector3 a, Vector3 b, Vector3 position)
    {
        Vector3 ab = b - a;
        Vector3 ap = position - a;
        float t = Vector3.Dot(ap, ab) / Vector3.Dot(ab, ab);
        t = Mathf.Clamp01(t);
        return a + ab * t;
    }
    Vector3 ClosestPoint(Vector3 position, List<Vector3> path)
    {
        var closestIndex = ClosestIndex(position, path);
        var point = ClosestPoint(path[closestIndex], path[closestIndex + 1], position);

        return point;
    }
    int ClosestIndex(Vector3 position, List<Vector3> path)
    {
        float minDistance = float.MaxValue;
        int closestIndex = 0;

        for (int i = 0; i < path.Count - 1; i++)
        {
            var point = ClosestPoint(path[i], path[i + 1], position);
            var distance = Vector3.Distance(point, position);

            if (distance < minDistance)
            {
                minDistance = distance;
                closestIndex = i;
            }
        }

        return closestIndex;
    }
    float ClosestLenth(Vector3 position, List<Vector3> path)
    {
        var closestIndex = ClosestIndex(position, path);
        var closestLenth = 0f;

        for (int i = 0; i < closestIndex; i++)
        {
            closestLenth += Vector3.Distance(path[i], path[i + 1]);
        }
        if (path.Count > 1)
        {
            var closestPoint = ClosestPoint(path[closestIndex], path[closestIndex + 1], position);
            closestLenth += Vector3.Distance(path[closestIndex], closestPoint);
        }

        return closestLenth;
    }

 

 

 

총 길이

    float TotalLength(List<Vector3> path)
    {
        float totalLength = 0;
        for (int i = 0; i < path.Count - 1; i++)
        {
            totalLength += Vector3.Distance(path[i], path[i + 1]);
        }
        return totalLength;
    }

 

 

Progress 변환

위에 두개가 있어야 쓸수 있다

나중에 생각해봤는데 ProgressToPosition보다 lerp라고 쓰는게 나을듯


    float GetProgress(Vector3 a, Vector3 b, Vector3 position)
    {
        var ab = b - a;
        var ap = position - a;
        var progress = Vector3.Dot(ap, ab) / Vector3.Dot(ab, ab);
        return Mathf.Clamp01(progress);
    }
    float GetProgress(Vector3 position, List<Vector3> path)
    {
        var progress = ClosestLenth(position, path) / TotalLength(path);
        return Mathf.Clamp01(progress);
    }
    Vector3 ProgressToPosition(Vector3 a, Vector3 b,float progress)
    {
        return a+ (b - a) * Mathf.Clamp01(progress);
        //rotation = Quaternion.LookRotation(ab); //이정돈 외부에서 처리하라고
    }
    (Vector3 position, Quaternion rotation) ProgressToPosition(float progress,List<Vector3> path)
    {
        progress = Mathf.Clamp01(progress);
        float totalLength = TotalLength(path);
        float currentLength = progress * totalLength;
        float accumulatedLength = 0;

        for (int i = 0; i < path.Count - 1; i++)
        {
            float segmentLength = Vector3.Distance(path[i], path[i + 1]);
            if (accumulatedLength + segmentLength > currentLength)
            {
                float t = (currentLength - accumulatedLength) / segmentLength;
                var position = Vector3.Lerp(path[i], path[i + 1], t);
                var rotation = transform.rotation;
                if (path.Count >= 2)
                {
                    rotation = Quaternion.LookRotation(path[i + 1] - path[i]);
                }
                return (position, rotation);
            }
            accumulatedLength += segmentLength;
        }
        {
            var position = path[path.Count - 1];
            var rotation = transform.rotation;
            if (path.Count >= 2)
            {
                rotation = Quaternion.LookRotation(path[path.Count - 1] - path[path.Count - 2]);
            }
            return (position, rotation);
        }
    }

'Unity > C#' 카테고리의 다른 글

자주 쓰는 DateTime 코드 모음  (0) 2023.12.19
csv 사용법  (0) 2022.03.06
Windows DLL경로  (0) 2022.02.12
posted by 모카쨩
2023. 9. 8. 14:55 Unity

 

빌드 했는데 용량이 45MB나 나옴 (뭐?)

그래서 뭐가 원인인지 알아보기로 했다

 

 

누르고

Build Report를 검색해서 제일 밑에거를 본다

빌드할때마다 아래에 생기는듯

 

 

암튼 해서 보면 텍스처가 제일 큰 원인인데

뭔 쓰지도 않는 좀버니니 뭐니 하는게 돌아다닌다

찾아가서 줘패주고 빌드 하니 용량이 35MB까지 줄었다

더 찾아내서 줘패면 20MB까지 가능할듯

 

'Unity' 카테고리의 다른 글

유니티 캐릭터 추적 마커  (0) 2023.09.21
유니티 킬로그  (0) 2023.08.28
유니티 플랫폼 훅  (0) 2023.08.23
posted by 모카쨩
2023. 8. 28. 04:34 Unity

 

 

KillPeed 라고도 한다

어려운건 아닌데 ㅈㄴ 귀찮다

계층구조는 이렇고

컴포넌트는 하단처럼 심어주자

 

사용된 코드는 이 두개

using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using UnityEngine.UI;

public class KillPeed : MonoBehaviour
{
    public KillPeedSlot killPeedSlotPrefab;
    List<KillPeedSlot> killPeedSlots= new List<KillPeedSlot>();
    public float displayTime = 5; //5초후삭제
    public Color enemyColor=Color.red;
    public Color allyColor = Color.blue;
    // Start is called before the first frame update
    void Start()
    {
        killPeedSlotPrefab.gameObject.SetActive(false);
    }
    public void Add(string source, string target,Sprite icon, Color sourceColor, Color targetColor, bool critical = false, bool highlight=false)
    {
        killPeedSlots = killPeedSlots.FindAll(x => x != null);//시간경과로 지워진건 제외
        if (killPeedSlots.Count>=3)//3칸 넘으면 오래된거 삭제
        {
            Destroy(killPeedSlots[0].gameObject);
        }

        var instant = Instantiate(killPeedSlotPrefab, killPeedSlotPrefab.transform.parent);
        instant.source.color = sourceColor;
        instant.target.color = targetColor;
        instant.source.text = source;
        instant.target.text = target;
        instant.icon.sprite = icon;
        instant.critical.SetActive(critical);
        instant.gameObject.SetActive(true);
        if (highlight)
        {
            instant.Highlight();
        }
        Destroy(instant.gameObject, displayTime); 
        killPeedSlots.Add(instant);
    }
}
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using UnityEngine.UI;

public class KillPeedSlot : MonoBehaviour
{
    public Text source;
    public GameObject critical;
    public Image icon;
    public Text target;
    void Update()
    {
        GetComponent<ContentSizeFitter>().enabled = false;
        GetComponent<ContentSizeFitter>().enabled = true;
    }
    public void Highlight()
    {
        var color = GetComponent<Image>().color;
        color.r = 1f- color.r;
        color.g = 1f - color.g;
        color.b = 1f - color.b;
        GetComponent<Image>().color = color;
        icon.color = Color.black;
    }
}

 

'Unity' 카테고리의 다른 글

유니티 APK 용량  (0) 2023.09.08
유니티 플랫폼 훅  (0) 2023.08.23
유니티 웨이포인트식 자율주행  (0) 2023.08.19
posted by 모카쨩

저사양 유저용 블로그 진입