Get it on Google Play


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

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

Recent Comment

Archive


'Unity'에 해당되는 글 184건

  1. 2021.02.02 디버그방법모음
  2. 2021.01.30 유니티 UI
  3. 2021.01.27 유니티 카메라
  4. 2021.01.24 코드 모음 사이트
  5. 2021.01.20 스텐실
  6. 2021.01.18 수학 Math
  7. 2021.01.17 화면관련
  8. 2021.01.15 c# 기본 문법
2021. 2. 2. 11:21 Unity

 

 

 

디버그빌드모드에서만 작동하는 코드

if (Debug.isDebugBuild)
{
//작동할 코드
}

 

V3

#if UNITY_EDITOR
        if (UnityEditor.EditorUserBuildSettings.development)
#else
        if (UnityEngine.Debug.isDebugBuild)
#endif
{
//작동할 코드
}

 

 

 

 

 

 

 

 

 

 

 

디버그모드에서만 작동


#if UNITY_EDITOR
    bool IsInspectorInDebugMode()
    {
        var inspectorType = typeof(Editor).Assembly.GetType("UnityEditor.InspectorWindow");
        if (inspectorType != null)
        {
            var window = EditorWindow.GetWindow(inspectorType);
            var isDebugMode = inspectorType.GetProperty("mode", System.Reflection.BindingFlags.NonPublic | System.Reflection.BindingFlags.Instance);
            if (isDebugMode != null)
            {
                return (int)isDebugMode.GetValue(window) == 1; // 1: Debug 모드, 0: Normal 모드
            }
        }
        return false;
    }
#endif


권장되는 방법은 아님

 

 

 

 

 

 

 

 

 

 

 

FPS체크

(디버그빌드모드에서만 동작하게 해놨다)

using UnityEngine;

public class FpsViewer : MonoBehaviour
{
    float fps = 60;
    private void OnGUI()
    {
#if UNITY_EDITOR
        if (UnityEditor.EditorUserBuildSettings.development)
#else
        if (UnityEngine.Debug.isDebugBuild)
#endif
        {
            fps = Mathf.Lerp(fps, (1 / Time.deltaTime), 0.05f);
            GUI.Box(new Rect(100, 0, 200, 24), "FPS: " + (int)fps);
        }
    }
}

 

 

Debug함수들

Debug.LogError("에러문구");
Debug.LogWarning("주의문구");

//일시중지버튼. 반드시 꼭 짚고 넘어가야 하는 에러일때 사용(Editor에서만 작동)
Debug.Break();

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

중단점 사용법

 

 

 

값볼수있다

 

 

어떤 함수가 실행됐는지 확인

var methodName = System.Reflection.MethodBase.GetCurrentMethod().Name;
Debug.Log("{methodName}실행됨");

 

 

 

 

 

 

'Unity' 카테고리의 다른 글

안드로이드 빌드관련 (구글플레이 관련)  (0) 2021.02.03
유니티 UI  (0) 2021.01.30
유니티 카메라  (0) 2021.01.27
posted by 모카쨩
2021. 1. 30. 03:48 Unity

 

 

 

월드캔버스 사용시

'Unity' 카테고리의 다른 글

디버그방법모음  (0) 2021.02.02
유니티 카메라  (0) 2021.01.27
유니티 그림자  (0) 2020.12.30
posted by 모카쨩
2021. 1. 27. 01:18 Unity

 

 

 

 


가로 고정 모드


 

 

 

 

Allow HDR

꺼져있으면 쉐이더로 변형된 색상은 반영되어지지 않음

 

 

 

 

 

 

 

MSAA는 꼭 끄자

별 체감도 안되는데 존나 무거워 진다

 

 

 

 

 

'Unity' 카테고리의 다른 글

유니티 UI  (0) 2021.01.30
유니티 그림자  (0) 2020.12.30
유니티 에러코드 애니메이터  (0) 2020.12.30
posted by 모카쨩
2021. 1. 24. 21:42 Unity/C#

www.delftstack.com/ko/howto/csharp/how-to-read-a-csv-file-and-store-its-values-into-an-array-in-csharp/

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

유니티 에디터 윈도우  (0) 2021.04.12
수학 Math  (0) 2021.01.18
화면관련  (0) 2021.01.17
posted by 모카쨩
2021. 1. 20. 09:17 Unity/shader

지우개

Shader "ahzkwid/Stencil/Invisible" {
    Properties {
        _MainTex ("MainTex", 2D) = "white" {}
        _Color ("Main Color", Color) = (1,1,1,1)
        _Stencil_Ref ("Stencil ID", int) = 3
        //_Cutoff("Cutout offset", Range(0, 1)) = 0.001
    }
    SubShader {
        Tags { 
        "RenderType"="Opaque" 
        "Queue"="Transparent"
        }
        
        //ColorMask RGB
        //Cull back
        //ZWrite off
        //ZTest Always
        Cull back
        ZWrite off
        //AlphaTest Greater [_Cutoff]
        //ZTest Always
        Stencil {
                //Ref 3
                Ref [_Stencil_Ref]
                Comp Always
                Pass Replace
        }
        Pass{
        	blend srcalpha oneminussrcalpha
            
	        SetTexture [_MainTex] 
	        {
	        	//Combine texture
	        	//Combine texture lerp(texture) constant
                //Combine texture* primary DOUBLE, texture* constant
                Combine texture* primary
	        }
	        SetTexture [_MainTex] 
	        {
	        	ConstantColor [_Color]
                Combine previous* constant
	        }
        }

    } 
}

 

 

지워질 대상

Shader "ahzkwid/Stencil/InvisibleTarget" {
    Properties {
        _MainTex ("MainTex", 2D) = "white" {}
        _Color ("Main Color", Color) = (1,1,1,1)
        _Stencil_Ref ("Stencil ID", int) = 3
        //_Stencil_Comp ("Stencil Comp", int) = 6
        //_Stencil_Pass ("Stencil OP", int) = 2
    }
    SubShader {
        Tags { 
        "RenderType"="Transparent" 
        "Queue"="Transparent"
        }

        //ColorMask RGB
        //Cull back
        //ZWrite off
        //ZTest Always
        Cull back
        ZWrite off
        //ZTest Always
        Stencil {
                //Ref 3
                Ref [_Stencil_Ref]
                Comp NotEqual
                Pass Replace
                //Comp [_Stencil_Comp]
                //Pass [_Stencil_Pass]
        }
        Pass{
        	blend srcalpha oneminussrcalpha
            
	        SetTexture [_MainTex] 
	        {
	        	//Combine texture
	        	//Combine texture lerp(texture) constant
                //Combine texture* primary DOUBLE, texture* constant
                Combine texture* primary
	        }
	        SetTexture [_MainTex] 
	        {
	        	ConstantColor [_Color]
                Combine previous* constant
	        }
        }

    } 
}

 

 

컷아웃 지우개

Shader "ahzkwid/Stencil/InvisibleCutout" {
    Properties {
        _MainTex ("MainTex", 2D) = "white" {}
        _Color ("Main Color", Color) = (1,1,1,1)
        _Stencil_Ref ("Stencil ID", int) = 3
        //_Cutoff("Cutout offset", Range(0, 1)) = 0.001
        //_Stencil_Comp ("Stencil Comp", int) = 0
        //_Stencil_Pass ("Stencil OP", int) = 2
    }
    SubShader {
        
Tags { "Queue" = "AlphaTest"
//"RenderType" = "TransparentCutout"
 "RenderType" = "Transparent" 
"IgnoreProjector" = "True" }
        //ColorMask RGB
        //Cull back
        //ZWrite off
        //ZTest Always
        Cull back
        ZWrite off
        //AlphaTest Greater [_Cutoff]
        AlphaTest Greater 0.001
        //ZTest Always
        Stencil {
                //Ref 3
                Ref [_Stencil_Ref]
                Comp Always
                Pass Replace
                //Comp [_Stencil_Comp]
                //Pass [_Stencil_Pass]
        }
        Pass{
        	blend srcalpha oneminussrcalpha

	        SetTexture [_MainTex] 
	        {
	        	//Combine texture
	        	//Combine texture lerp(texture) constant
                //Combine texture* primary DOUBLE, texture* constant
                Combine texture* primary
	        }
	        SetTexture [_MainTex] 
	        {
	        	ConstantColor [_Color]
                Combine previous* constant
	        }
        }

    } 
}

 

 

일반적으로는 컷아웃 지우개만 만들어서 아래걸 쓰면 된다

 

 

 

 

 

 

 

 

 

안쪽에 있는건 안보이게 하고 싶을때

 

원본

 

 

결과

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

마스크와 마스크 타겟

 

 

마스크

Always

Less

 

 

 

마스크 타겟

iD만 동일하면 된다

Equal

Keep

 

 

위 지우개로 마스크도 지울수 있다

아래는 예시 사진

빨강이 마스크고

파랑이 ID 4짜리 지우개

흰색이 마스크 타겟

 

 

 

Comp

0-Always

1-Never

2-Less

3-Equal

4-LEqual

5-Greater

6-NotEqual

7-GEqual

 

OP

0-Keep

1-Zero

2-Replace

3-IncrSat

4-DecrSat

5-Invert

6-IncrWrap

7-DecrWrap

posted by 모카쨩
2021. 1. 18. 16:35 Unity/C#

 

Xⁿ=Y 일때

n을 구하려면 log(Y) / log(X)                //로그
X를 구할려면 Sqrt(Y,n)                       //루트,제곱근, 여러개이면 거듭제곱근
Y를 구할려면 Pow(X,n) 혹은 Sqr(X,n)     //제곱,여러개이면 거듭제곱    

이상한 방법들

X를 구할때 보통을 sqrt를 써야하지만 인자를 1개만 받는 함수밖에 없을경우에
Pow(Y,1/n) //혹은 Sqr
이렇게 Pow를 써서 sqrt를 구할수도 있다
즉 Sqrt(x) = pow(x,1/2) 이다

 

Sqr계열

32의 5제곱근을 구할때

Sqr(32,1/5) //1은 고정숫자임

계산기 버전

 

 

 

 

log계열

 

//1024가 2의 몇승인지 구한다

Mathf.Log(1024,2)

다른버전

Mathf.Log(1024)/Mathf.Log(2)

계산기 버전

 

쓸모는 없지만

log(32)/5 = log(2)

이다

참고로 32는 2의 5제곱이다 즉

x^y=z일때

log(z)/y = log(x)

 

 

 

 

 

 

//npot를 최적의 2pot사이즈로 변경

wid=Mathf.Pow(2, Mathf.Round(Mathf.Log(texture.width, 2))));
hei=Mathf.Pow(2, Mathf.Round(Mathf.Log(texture.height, 2))));

/*
결과:
256->256
230->256
140->128
1031->1024
*/

 

 

 

 

원점에서의 거리

var len = sqrt(x*x + y*y);

 

 

x1,y1에서 x2,y2까지의 거리

 

 

 

 

 

 

 

Len과 dir을 이용하여 좌표를 구함

		public double d_set(double _Dir)
		{
			if(_Dir<0d)
			{
				_Dir=360d-((-_Dir)%360d);
			}
			if(_Dir>=360d)
			{
				return _Dir%360d;
			}
			return _Dir;
		}
		public double len_x(double _Len,double _Dir)
		{
			_Dir = d_set(_Dir);
			return _Len*Math.Cos(_Dir*Math.PI/180.0);
		}
        
		public double len_y(double _Len,double _Dir)
		{
			_Dir = d_set (_Dir);
			return _Len*Math.Sin(_Dir*Math.PI/180.0);
		}

 

 

pdir

x1,x2,y1,y2를 이용하여 각도를 구함

float2 center = 0.5;
float2 pos = i.uv.xy-center;
float2 dir  = ((atan2(pos.x,-pos.y)*2/3.14)/4+0.75)%1;

 

 

 

 

p1,p2,r,center를 이용하여 p3를 구하는 공식
챗GPT가 짜줬다

float2 FindIntersection(float2 p1, float2 p2, float R, float2 center)
{
    float2 dir = normalize(p2 - p1);
    float2 diff = p1 - center;

    // 원의 중심에서 선까지의 거리 d 계산
    float d = abs(diff.x * dir.y - diff.y * dir.x);

    // 만약 d가 R보다 크면 교점이 없음
    if (d >= R)
        return float2(0, 0);

    // L 계산: L = sqrt(R^2 - d^2)
    float L = sqrt(R * R - d * d);

    // 원의 중심에서 교점까지의 거리 h 계산: h = sqrt(R^2 - L^2)
    float h = sqrt(R * R - L * L);

    float2 midpoint = p1 + dot(center - p1, dir) * dir; // 선 위의 원의 중심에 수직인 점

    // 두 교점은 midpoint에서 ±L만큼 dir 방향으로 떨어져 있음
    float2 intersection1 = midpoint + L * dir;
    float2 intersection2 = midpoint - L * dir;

    // 이 예제에서는 두 교점 중 하나만 반환합니다.
    // 필요에 따라 두 교점 중 원하는 교점을 선택하여 반환하면 됩니다.
    return intersection1; 
}

 

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

코드 모음 사이트  (0) 2021.01.24
화면관련  (0) 2021.01.17
c# 기본 문법  (0) 2021.01.15
posted by 모카쨩
2021. 1. 17. 03:52 Unity/C#

 

 

 

 

모니터계열

public static Bitmap screenImg = new Bitmap(SystemInformation.VirtualScreen.Width
, SystemInformation.VirtualScreen.Height
, PixelFormat.Format32bppArgb);

public static Graphics graphicsScreenImg = Graphics.FromImage(screen_img);
//모니터 화면을 가져옴(전역변수에 담아둔다음 불러오는 형식)
public static System.Drawing.Bitmap GetScreen()
{
    graphicsScreenImg.CopyFromScreen(SystemInformation.VirtualScreen.X
        , SystemInformation.VirtualScreen.Y
        , 0
        , 0
        , SystemInformation.VirtualScreen.Size
        , CopyPixelOperation.SourceCopy);
    return screenImg;
}
//모니터화면을 가져옴(안정적이지만 호출시마다 메모리 사용량이 높음)
public static Bitmap GetScreenLS()
{

    Bitmap img = new Bitmap(SystemInformation.VirtualScreen.Width
            , SystemInformation.VirtualScreen.Height
            , PixelFormat.Format32bppArgb);

    Graphics graphics = Graphics.FromImage(img);
    graphics.CopyFromScreen(SystemInformation.VirtualScreen.X
        , SystemInformation.VirtualScreen.Y
        , 0
        , 0
        , SystemInformation.VirtualScreen.Size
        , CopyPixelOperation.SourceCopy);
    return img;
}
//모니터픽셀 가로
public static int GetScreenWidth()
{
    return SystemInformation.VirtualScreen.X;
}
//모니터픽셀 세로
public static int GetScreenHeight()
{
    return SystemInformation.VirtualScreen.Y;
}

 

 

 

2021년 기준 화면비

Z폴드2 (5:4)

Z플립3 (22:9)

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

수학 Math  (0) 2021.01.18
c# 기본 문법  (0) 2021.01.15
MapBorder  (0) 2020.12.24
posted by 모카쨩
2021. 1. 15. 00:49 Unity/C#

 

 

구조체

더보기
public struct mVec3
    {
        public float x, y, z;
        public float Length
        {
            get
            {
                return (float)(Math.Sqrt((x * x) + (y * y) + (z * z)));
            }
            set
            {
                //float _t=Length*value;
                //float _t=value/(float)(Math.Sqrt((x*x)+(y*y)+(z*z)));
                if (Length <= 0)
                {
                    z = value;
                }
                else
                {
                    float _t = value / Length;
                    x *= _t;
                    y *= _t;
                    z *= _t;
                }
            }
        }
public static mVec3 forward //절대적
{
 get
 {
  return new mVec3(0f,0f,1f);
 }
}
public mVec3 up //상대적
{
 get
 {
  return new mVec3((Quaternion.Euler( this.x,this.y,this.z) * Quaternion.Euler(90f,0f,0f)).eulerAngles);
  //return mScript.len_vec(this);
 }
}
        
        public mVec3() : this(1,2,3)//생성자 (x:1,y:2,z:3)
        {

        }
        public mVec3(float X, float Y, float Z)//생성자
        {
            this.x = X;
            this.y = Y;
            this.z = Z;
        }
        public static mVec3 operator ++(mVec3 _Vec)
        {
            _Vec.x++;
            _Vec.y++;
            _Vec.z++;
            return _Vec;
        }
        public static mVec3 operator /(mVec3 _Vec1, mVec3 _Vec2)
        {
            _Vec1.x /= _Vec2.x;
            _Vec1.y /= _Vec2.y;
            _Vec1.z /= _Vec2.z;
            return _Vec1;
        }
        public static explicit operator mVec4(mVec3 _this) //명시적 형변환, 암시적은 implicit
        {
            mVec4 _return;
            _return.x=_this.x;
            _return.y=_this.y;
            _return.z=_this.z;
            _return.w=0;
            return _Vec;
        }
        

        public static bool operator ==(mVec3 _Vec1, mVec3 _Vec2)
        {
            foreach (var field in typeof(mVec3).GetFields())
            {
                if (field.GetValue(_Vec1) != field.GetValue(_Vec2))
                {
                    return false;
                }
            }
            return true;
        }
        public static bool operator !=(mVec3 _Vec1, mVec3 _Vec2)
        {
            return !(questionDictionary1== questionDictionary2);
        }
}
사용시
        //public static mVec3 zero(0f,0f,0f);

 

 

Enum

    public enum UpperPath
    {
        persistentDataPath
            , dataPath
            , streamingAssetsPath
            , temporaryCachePath
    };

 

Enum 길이 반환

int enumCount=System.Enum.GetValues(typeof(EnumName)).Length;
        Category[] openCategorysIndexes = (Category[])System.Enum.GetValues(typeof(Category));

 

 

namespace가 아닌 class using

using static SampleClass;

 

using문

using (var streamReader = new System.IO.StreamReader(response))
{
    string result = streamReader.ReadToEnd();
    streamReader.Close();
    return result;
}

 

 

 

 

자주쓰는데 은근 겁나 까먹음

try
{

}
catch(Exception ex)
{
	Debug.Log(ex.ToString());
}

 

 

 

 

변수이름

string 변수명=nameof(변수);

타입 이름

typeof(AudioClip).Name

 

 

 

c#버전 #define

public const float PointMax = 2;
public float Point = PointMax;

 

 

C#의 실제 #define

버전관리할때 유용함

#define Ver1000
#define Ver1001

#if Ver1000
    //여기서 동작함
#elif Ver1001
    //Ver1001일때 작동함
#else
    //그것도 아닐때
#endif

 

 

 

 

///함수주석

    /// <summary>
    /// 이름을 GUI에 표시함
    /// </summary>
    /// <param name="wordDictionary">이름</param>
    /// <param name="wid">가로크기</param>
    /// <param name="hei">세로크기</param>
    void DrawWordDictionary(string Name, int wid, int hei)
    {
    }

 

 

널은 안됨

class NotNullContainer<T> where T : notnull
{
}

 

new한정자

new가 붙은거만 넣을수 있음

    public static T GetClass<T>(string text) where T : new()
    {
    	if(text=="ok")
        {
            var targetClass = new T();
            return targetClass;
        }
        else
        {
            return null;
        }
    }

 

 

is 연산자

어디서 온건지 알 수 없는 obj등을 처리할 때 쓰인다

if ((objData is Dictionary<string, object>)==false)
{
	Debug.LogError("objData는 Dictionary<string, object>가 아닙니다");
	return;
}

//아래와 동일함

if ((objData.GetType() == typeof(Dictionary<string, object>))==false)
{
	Debug.LogError("objData는 Dictionary<string, object>가 아닙니다");
	return;
}

 

 

as 연산자

캐스팅 연산자인데 좀 복잡함 아래 참고

서로 동일한 코드를 나타내고 있다

string text= obj as string;

//위아래 동일함

string text;
if (obj is string)
{
    text = (string)obj;
}
else
{
    text = null;
}

 

 

if else 간소화 (남용은 금지, 복수로 쓰게될경우 가독성이 개판된다)

bool A;
if (B)
{
   A = C;
}
else
{
   A = D;
}


//위아래 동일

bool A=B?C:D;

 

null체크 간소화

if (A != null)
{
    if (B != null)
    {
        return C;
    }
}
return null;


//위아래 동일


return A?.B?.C;

 

?[]연산 에러발생시 null반환

다만 인덱스 오류는 캐치가 안 된다

string text = null;
if (array!=null)
{
    text = array[1];
}

//위아래 동일

var text = array?[1];

 

 

 

아래건 동일분기 처리를 좀 알아봐야 겠다

switch 간소화 (유니티 안됨, 비주얼스튜디오 2019 자동화 안됨)

switch(condition)
{
   case 1:
      A=B;
      break;
   case 2:
      A=C;
      break;
   default:
      A=D;
     break;
}

//위아래 동일


condition switch
{
    1 => A=B;
    2 => A=C;
    _ => A=D;
}

 

 

 

 

튜플

    void Start()
    {
        var (min, max) = FindMinMax(1, 2, 3, 4);
        Debug.Log("min: " + min);
        Debug.Log("max: " + max);
    }
    (int min, int max) FindMinMax(params int[] input)
    {
        var min = Mathf.Min(input);
        var max = Mathf.Max(input);
        return (min, max);
    }

 

여러개 리턴할때 사용

 

유니티도 된다

 

 

 

 

??연산

null처리할때 좋음

아래 네개 모두 동일한 코드이다

string a = null;
Debug.Log(a ?? "ABC"); //ABC반환
a = "a";
Debug.Log(a ?? "BCD"); //a반환

//위아래 동일

string a = null;
Debug.Log(a is string ? a:"ABC"); //ABC반환
a = "a";
Debug.Log(a is string ? a:"BCD"); //a반환

//위아래 동일

string a = null;
Debug.Log(a==null ? "ABC":a); //ABC반환
a = "a";
Debug.Log(a==null ? "BCD":a); //a반환


//위아래 동일

string a = null;
if(a!=null)
{
	Debug.Log(a);
}
else
{
	Debug.Log("ABC");
}
a = "a";
if(a!=null)
{
	Debug.Log(a);
}
else
{
	Debug.Log("BCD");
}

 

 

인덱스 체크 간소화

근데 어차피 쓰려면 null체크 추가로 들어가서 그렇게 효율적이진 않음
오히려 협업할때는 누구나 알기쉬운 위쪽이 나을수도 있겠다


if((index >= 0)&&(index < array.Length))
{
    var item = array[index];
    //작동할 코드
}


//위아래 동일

var item = array.ElementAtOrDefault(index);
if(item != null)
{
    //작동할 코드
}

 

 

 

로컬함수

외부로 표출될 필요가 없는 함수 작성시 매우매우 유용하다.

특히 최장점은 같은 이름의 함수를 여러군데서 쓸수있다는 점

함수를 사용할때마다 생성하는 방식인지

성능을 절약하기 위해 static을 붙이라는 문구가 뜨는데 유니티 2019에서는 미지원이다

void SampleFunction()
{
    Debug.Log(LocalFunction("test")); //long text
    Debug.Log(LocalFunction("te")); //short text
    Debug.Log(LocalFunction("")); //short text


    string LocalFunction(string text)
    {
        if(text.Length>2)
        {
            return "long text";
        }
        return "short text";
    }
}

 

 

 

모든 스크립트에 using을 적용

몰론 함부로 쓰면 ㅈ된다

global using System;

 

 

 

함수내부 조건식 Predicate

 public static class Array
{
    //Array.FindIndexAll(arr,x=>x>1);
    //혹은 arr.FindIndexAll(x=>x>1);
    public static int[] FindIndexAll<T>(this T[] array, System.Predicate<T> match)
    {
        var indexList = new List<int>();
        for (int i = 0; i < array.Length; i++)
        {
            if (match.Invoke(array[i]))
            {
                indexList.Add(i);
            }
        }
        return indexList.ToArray();
    }
    
    //2개인자
    //Array.FindAll(arr,x=>x.Item1>x.Item2)
    public static int[] FindAll<T>(T[] array, System.Predicate<(T previous,T target)> match)
    {
        var indexList = new List<int>();
        for (int i = 0; i < array.Length; i++)
        {
            if (match.Invoke((array[i-1],array[i])))
            {
                indexList.Add(i);
            }
        }
        return indexList.ToArray();
    }
}

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

화면관련  (0) 2021.01.17
MapBorder  (0) 2020.12.24
리플렉션  (0) 2020.12.23
posted by 모카쨩

저사양 유저용 블로그 진입