Get it on Google Play


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

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

Recent Comment

Archive


'Unity'에 해당되는 글 181건

  1. 2020.07.29 c# Array(배열)관련
  2. 2020.07.28 유니티 키보드
  3. 2020.07.28 c# @변수
  4. 2020.07.28 c# 문자열 처리
  5. 2020.07.27 OnGUI
  6. 2020.07.24 유니티 스파인 오류 모음
  7. 2020.07.20 싱글톤 패턴
  8. 2020.07.20 유니티 버그, 에러, 오류모음
2020. 7. 29. 19:25 Unity/C#

배열 생성 이상한방식

//1차원
Array array1 = Array.CreateInstance(typeof(int), 사이즈);

//2차원
Array array2 = Array.CreateInstance(typeof(int), X사이즈, y사이즈);

//가변
Array arrayMain = Array.CreateInstance(typeof(Array), 2);
BossArray.SetValue(array1, 0);
BossArray.SetValue(array2, 1);

 

배열관련 함수

//해당조건을 만족하는 번호를 반환. 없으면 -1
var nameAIndex = System.Array.FindIndex(array,x => x.name == "A");

//해당조건을 만족하는 값을 반환.
var nameA = System.Array.Find(array,x => x.name == "A");

//해당조건을 만족하는 값들을 반환. RemoveAll대용으로도 사용가능
var nameAs = System.Array.FindAll(array,x => x.name == "A");

//중복되는것만 추출
var redundantArray = System.Array.FindAll(array, x => List.Contains(x));

//중복되는것만 추출2
redundantArray = System.Array.FindAll(array, x => System.Array.FindIndex(array2,y=>y==x)>=0);

//RemoveAll(삭제)용도일경우
System.Array.FindAll(배열,x => x.name != "A");

//해당조건을 만족하는게 한개라도 존재하는지
System.Array.Exists(배열,x => x.name == "A");

//내용물에 전부 1을 더하여 반환
int[] 배열=System.Array.ConvertAll(배열,x => x+1);

//변수값 0으로 초기화
int[] 배열=System.Array.ConvertAll(배열,x => 0);


//bool[] 중 하나라도 true인지 검사
return System.Array.Find(bools, x => x == true);

//bool[] 중 하나라도 true인지 검사 2
System.Array.TrueForAll(toggles, x => x.isOn == false)

//array가 List안에 전부 포함되어 있는지 검사
if (System.Array.TrueForAll(array, x => List.Contains(x)))

 

 

배열관련 함수 Linq계열

using System.Linq;


//맥스값 추출
arrayCount = array.Max(x => x.level);


//맥스값'들' 추출
var timeMax = saves.Max(save => save.time);
var timeMaxSaves = System.Array.FindAll(saves,save => save.time == timeMax);



//평균추출
var average = array.Average();


//중복제거(중복제거의 반대는 FindAll을 쓴다)
array = array.GroupBy(x => x.Substring(0,3)).Select(x=>x.First()).ToArray(); //앞글자 3개가 똑같다면 제거
array = array.GroupBy(x => x).Select(x=>x.First()).ToArray(); //완벽히 동일한것만 제거


//셔플(미세한 편향)
System.Random seed = new System.Random((System.Int32)System.DateTime.Now.Ticks);
array = array.OrderBy(a => seed.Next()).ToArray();


//셔플 유니티타입(미세한 편향)
array = array.OrderBy(a => Random.value).ToArray();

//정렬
array = array.OrderBy(x => x).ToArray();

//합치기
if(array2 != null)
{
    array1 = array1.Concat(array2).ToArray();
}

//인자1개 추가
array1 = array1.Append(data).ToArray();

//슬라이스(자르기)
var array = new int[] { 1, 2, 3, 4, 5 };
var length = 3;
var sliceArray =  array.Take(length).ToArray();
Debug.Log(string.Join(", ", sliceArray));
//결과: 1,2,3

//슬라이스2 (중간부터)
var array = new int[] { 1, 2, 3, 4, 5 };
var startIndex = 1;
var length = 3;
var sliceArray =  array.Skip(startIndex).Take(length).ToArray();
Debug.Log(string.Join(", ", sliceArray));
//결과: 2,3,4


//슬라이스3 (뒤에서부터)
var array = new int[] { 1, 2, 3, 4, 5 };
var length = 3;
var sliceArray =  array.Skip(array.Length-length).ToArray();
Debug.Log(string.Join(", ", sliceArray));
//결과: 3,4,5


//해당조건을 만족하는 값을 반환
//FirstOrDefault (System.Array.Find와 동일)
var nameA = array.FirstOrDefault(x => x.name == "A");

//모두 true인지 검사
//Array.TrueForAll과 동일하다
var allNameA = array.All(x => x.name == "A");

//하나라도 true인지 검사
//Find검사로 비슷하게 구현할수 있다
var anyNameA = array.Any(x => x.name == "A");

 

 

Array.Copy

var array1 = new int[] { 1, 2, 3, 4, 5 };
var array2 = new int[] {6,7,8,9,10 };
System.Array.Copy(array1, array2, 3);
Debug.Log(string.Join(", ", array2));
//결과 1,2,3,9,10

 

배열깊은복사 (배열복제)

var stringArrayClone = (string[])stringArray.Clone();

 

 

오브젝트 리스트를 스트링배열로 변경


using System.Linq;
var list = new List<object> ();
list.Cast<string>().ToArray()

 

FindIndexAll

    public static class Array
    {
        public static int[] FindIndexAll<T>(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();
        }
    }

 

 

 

중간에 끼워넣기

var randomIndex=(int)Random.Range(0,list.Count);
list.Insert(randomIndex, memorizeList[index]);
list.RemoveAt(index);

 

 

 

이동평균함수

고속으로 처리할일이 생겨서 만듦

써보니까 앞부분은 처리해도 도움이 안 되길래 과감히 지우는쪽으로 했다

double[] MovingAverageHS(double[] datas,int period)
{
    if (datas.Length< period)
    {
        return null;
    }
    var movingAverages = new double[datas.Length- period + 1];

    var sum = 0.0;
    for (int i = 0; i < period; i++)
    {
        sum += datas[i];
        movingAverages[0]=sum/ period;
    }
    for (int i = period; i < datas.Length; i++)
    {
        sum = sum - datas[i - period] + datas[i];
        movingAverages[i - period + 1] = sum / period;
    }
    return movingAverages;
}

 

 

인덱스 체크 간소화

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

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


//위아래 동일

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

 

 

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

C# 파일관련 함수들  (0) 2020.07.30
유니티 키보드  (0) 2020.07.28
c# @변수  (0) 2020.07.28
posted by 모카쨩
2020. 7. 28. 13:17 Unity/C#

 

 

 

정석적인 방법

if (Input.GetKeyDown(KeyCode.A))
{
	//명령
}

 

 

OnGUI 계열

    void OnGUI()
    {
        Event e = Event.current;
        if (e.isKey)
        {
            if (e.keyCode== KeyCode.A)
            {
            //명령
            }
        }
    }

 

press체크의 경우

    void OnGUI()
    {
        Event e = Event.current;
        if (e.isKey)
        {
            KeyCode k= e.keyCode;
            if (e.Equals(Event.KeyboardEvent(k.ToString())))
            {
                if (k== KeyCode.A)
                {
                    //명령
                }
            }

        }
    }

 

다른방식

    void OnGUI()
    {
        Event e = Event.current;
        if (e.type == EventType.KeyDown)
        {
            if (e.keyCode== KeyCode.A)
            {
            	//명령
            }
        }
    }

 

inputString 방식, 한프레임에 여러키가 와도 순서가 안 섞임

string _str = Input.inputString;
for (int i = 0; i < _str.Length; i++)
{
	if(_str[i]=="k")
    {
    	//명령
    }
}

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

c# Array(배열)관련  (0) 2020.07.29
c# @변수  (0) 2020.07.28
c# 문자열 처리  (0) 2020.07.28
posted by 모카쨩
2020. 7. 28. 12:51 Unity/C#

별 의미 없고 그냥 키워드를 변수로 사용가능하게 해주는거

 

 

예를들어


Event @event= Event.current;

 이런식으로 씀

 

근데 애초에 저런식으로 겹치게 짜지 마라

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

유니티 키보드  (0) 2020.07.28
c# 문자열 처리  (0) 2020.07.28
OnGUI  (0) 2020.07.27
posted by 모카쨩
2020. 7. 28. 10:48 Unity/C#

일반

//텍스트에서 A를 찾는다
int index = text.IndexOf("A");



//문자열 자르기
string text=nameof(speed);
string textSpe = text.Substring(startIndex:0, length:3); //spe
string textPee = text.Substring(startIndex:1, length:3); //pee
string textEed = text.Substring(startIndex:2); //eed


//숫자만 추출
text = new string(System.Array.FindAll(text.ToCharArray(), c => char.IsDigit(c)));


//숫자앞에 0붙이기
int num=7;
num.ToString("D3"); //7 -> 007 , 76 -> 076같이 3글자 숫자로 바꿔줌


//숫자앞에 0붙이기2
string text="7";
text.ToString().PadLeft(3,'0'); //7 -> 007 , 76 -> 076같이 3글자 숫자로 바꿔줌


//소숫점 자르기
7.014837f.ToString("N4"); //7.0148
7.014837f.ToString("N2"); //7.01


//text가 숫자인지 확인(bool반환)
string text="";
if(int.TryParse(text, out int num))
/*
    -결과 모음, int형에 부합하는것만 true를 반환
    A : False
    A1 : False
    1 : True
    1.0 : False
    001 : True
    1+1 : False
    2147483647 : True
    2147483648 : False

    -복합사용예제
    if (int.TryParse(text, out int num))
    {
        if (num > 5)
        {
        }
    }


*/


문자열을 int형으로 변환
int number = System.Int32.Parse(text);







//A~Z 랜덤 문자열
string randomChar = ((char)Random.Range('A', 'Z')).ToString();



//따옴표를 표기할때
Debug.Log(@"""A""");//"A"가 표시됨


//문자열을 ?형으로 변환
//일반적으로 리플렉션과 연동할때 사용

public static T StringArrayToClass<T>(string[] texts) where T : new()
{
    var fields = typeof(T).GetFields();
    var tempClass = new T();
    for (int i = 0; i < fields.Length; i++)
    {
        var field = fields[i];

        try
        {
            var converter = System.ComponentModel.TypeDescriptor.GetConverter(field.FieldType);
            var objData = converter.ConvertFrom(texts[i]);
            field.SetValue(tempClass, objData);
        }
        catch (System.Exception ex)
        {
            Debug.LogError(ex);
            Debug.LogError($"text:{texts[i]}");
            Debug.LogError($"field.Name:{field.Name}");
            Debug.LogError($"field.FieldType:{field.FieldType}");
            throw;
        }
    }
    return tempClass;
}

 

형변환

//char를 string으로 변환
string text= char.ToString();



//char[]를 string으로 변환
//절대로 toString()을 쓰면 안된다
string text= new string(chars);

//string을 char[]로 변환
char[] charArray= text.ToCharArray();



//키코드를 문자열로 바꿈
text=((KeyCode)key).ToString().Replace("Alpha", "");



//10진수 정수를 16진수 문자열로 바꿈
int num=61;
string hex = System.Convert.ToString(num, 16);
Debug.Log(hex); //결과 3d

//16진수 문자열을 10진수 정수로 바꿈
System.Int32.Parse(hex, System.Globalization.NumberStyles.HexNumber);





//문자열 배열을 문자열로 통합
string text=string.Concat(texts);


//문자열 배열을 사이에 엔터를 넣어가며 문자열로 통합
string text=string.Join("\n", texts);


//String to StringArray
//문자열을 잘라서 문자열 배열로 반환
//분할후 공백을 모두 제거
string text="line1 \n Line2"
string[] lines = text.Split(new char[] { '\r', '\n' },StringSplitOptions.RemoveEmptyEntries);

//String to StringArray2
//이번엔 string으로 구분값을 사용
var texts = text.Split(new string[] { ":--:" });

 

 

 

 

 

 

세줄 모두 같은 처리결과를 가진다

int count=0;
string t;
t="count: " + count;
t=$"count: {count}";
t=string.Format("count: {0}", count);

 

마지막 줄 코드는 틀니스러운 방법이다. 이젠 쓰이지 않는다

 

 

 

 

StringBuilder 예제

var sb = new System.Text.StringBuilder();
sb.AppendLine("AB");
sb.AppendLine("C");
Debug.Log(sb.ToString());

//결과: 
AB
C
var sb = new System.Text.StringBuilder();
sb.Append("AB");
sb.Append("C");
Debug.Log(sb.ToString());

//결과: 
ABC

 

 

앞에 @가 붙으면 입력받은 그대로 쓸수있게 해준다 가령 \n이 엔터가 아니라 그대로 보이게 해준다

파일주소를 그대로 넣을때도 사용한다

Debug.Log(@"\n보\n이\n냐\n?");
//결과: \n보\n이\n냐\n?

$와 @를 동시에 써야할때

int num=100;
Debug.Log($@"\n보\n인\n다{num}\n?");
//결과: \n보\n인\n다100\n?

 

 

 

 

 

Replace는 해당 문자가 들어있으면 지워버린다.

경로에 StreamingAssets/가 포함되어있으면 Streaming만 남으니 주의하자

Debug.Log("Assets/user.csv".Replace("Assets/",""));
//결과: user.csv

응용해서 띄어쓰기 지우기

Debug.Log("문자 테스트 입니다.".Replace(" ",""));
//결과: 문자테스트입니다.

 

 

Regex패턴들 (정규표현식)

@"^[a-zA-Z ',.?""!]+$" //일반적인 영어문장에 사용되는 패턴
@"^[0-9]+$" //숫자만
@"^[a-zA-Z]+$" //알파벳만

영어로만 이루어져있는지 검사

System.Text.RegularExpressions.Regex.IsMatch("ABC",@"^[a-zA-Z]+$"); //true
System.Text.RegularExpressions.Regex.IsMatch("한글",@"^[a-zA-Z]+$"); //false

지정한 문자열만 제거

System.Text.RegularExpressions.Regex.Replace("테스트@$%^", @"[^\w\.@-]", "") //결과:테스트

 

지정한 화이트리스트에 등록된 문자열만 통과

    public static string ReplaceWhiteList(string text,string regexPattern)//화이트리스트
    {
        if (string.IsNullOrWhiteSpace(text))
        {
            return text;
        }
        var convertText = new List<char>();
        for (int i = 0; i < text.Length; i++)
        {
            if(System.Text.RegularExpressions.Regex.IsMatch(text[i].ToString(), regexPattern))
            {
                convertText.Add(text[i]);
            }
        }
        if(convertText.Count==0)
        {
            return "";
        }
        else
        {
            return new string(convertText.ToArray());
        }
    }

 

앞글자를 대문자로 바꿈

int jumpSpeed=0;

{
    string text=nameof(speed);
    var textInfo = new System.Globalization.CultureInfo("en-US", false).TextInfo;
    string toUpperTitleLetter = textInfo.ToTitleCase(text);
    //toUpperTitleLetter는 Jumpspeed가 됨
}

{
    string text=nameof(speed);
    string toUpperFirstLetter = text.ToUpper()[0] + text.Substring(1, text.Length - 1);
    //toUpperFirstLetter는 JumpSpeed가 됨
}

 

 

 

 

 

 

 

 

 

 

 

 

소문자인지 체크

if (inputString==inputString.ToLower())

 

 

 

중복제거

using System.Linq;

var text = "ABCABD";
var filterText = new string(text.ToCharArray().Distinct().ToArray());
Debug.Log(filterText);
//결과 : ABCD

 

 

 

컬러텍스트 (유니티)

    public string ColorText(string text, Color color)
    {
        return $"<color=#{ColorUtility.ToHtmlStringRGB(color)}>{text}</color>";
    }

 

 

특정 문자의 사이즈와 컬러를 바꿈

 

심플타입

    public static string HighlightWord(string originalText, string highlightChar, Color highlightColor, int fontSize)
    {
        var convertText = originalText;
        convertText = convertText.Replace(highlightChar.ToLower(), highlightChar.ToUpper());
        convertText = convertText.Replace(highlightChar.ToUpper(), $"<size={fontSize}><color=#{ColorUtility.ToHtmlStringRGB(highlightColor)}>{highlightChar.ToUpper()}</color></size>");

        return convertText;

    }

 

해쉬키타입, 간단하지만 변경될 문자에 해쉬키의 일부가 있으면 안된다

    public static string HighlightWord(string originalText, string highlightChar, Color highlightColor, int fontSize)
    {
        var convertText = originalText;
        string hash = "&*&*&*&*&*&";
        for (int i = 0; i < 100; i++)
        {
            if (originalText.Contains(hash))
            {
                hash += $"Dummy{(int)Random.Range(0,100)}";
            }
            else
            {
                break;
            }
        }
        convertText = convertText.Replace(highlightChar.ToLower(), hash);
        convertText = convertText.Replace(highlightChar.ToUpper(), $"<size={fontSize}><color=#{ColorUtility.ToHtmlStringRGB(highlightColor)}>{highlightChar.ToUpper()}</color></size>");
        convertText = convertText.Replace(hash, highlightChar.ToLower());

        return convertText;

    }

 

레겍스 타입 (미완성임)

    public static string HighlightWord(string originalText, string highlightChar, Color highlightColor, int fontSize)
    {
        var convertText = originalText;
        var pattern = new System.Text.RegularExpressions.Regex($"^[{highlightChar.ToLower()}]|[{highlightChar.ToUpper()}]+$");
        return pattern.Replace(convertText, $"<size={fontSize}><color=#{ColorUtility.ToHtmlStringRGB(highlightColor)}>{highlightChar.ToUpper()}</color></size>");
    }

 

찾아낸 첫번째 문자만 하이라이트

    public static string HighlightWordFirstIndex(string originalText, string highlightChar, Color highlightColor, int fontSize)
    {
        var convertText = originalText;
        var firstIndexLower = originalText.IndexOf(highlightChar.ToLower());
        var firstIndexUpper = originalText.IndexOf(highlightChar.ToUpper());

        int firstIndex = -1;
        if (firstIndexLower==-1)
        {
            firstIndex = firstIndexUpper;
        }
        if (firstIndexUpper == -1)
        {
            firstIndex = firstIndexLower;
        }
        if (firstIndex == -1)
        {
            firstIndex = Mathf.Max(firstIndexLower, firstIndexUpper);
        }
        if (firstIndex == -1)
        {
            Debug.LogWarning("찾는 문자열이 없음");
            return originalText;
        }
        convertText =convertText.Remove(firstIndex,1);
        convertText = convertText.Insert(firstIndex, $"<size={fontSize}><color=#{ColorUtility.ToHtmlStringRGB(highlightColor)}>{highlightChar.ToUpper()}</color></size>");

        return convertText;
    }

 

 

 

찾아낸 첫번째 글자를 기준으로 분할함

        public static string[] SplitFirstIndex(string text, string separator)
        {

            var splitTextList = new List<string>();
            var firstIndexLower = text.IndexOf(separator.ToLower());
            var firstIndexUpper = text.IndexOf(separator.ToUpper());

            int firstIndex = -1;
            if (firstIndexLower == -1)
            {
                firstIndex = firstIndexUpper;
            }
            if (firstIndexUpper == -1)
            {
                firstIndex = firstIndexLower;
            }
            if (firstIndex == -1)
            {
                firstIndex = Mathf.Max(firstIndexLower, firstIndexUpper);
            }
            if (firstIndex == -1)
            {
                Debug.LogWarning("찾는 문자열이 없음");
                return null;
            }

            if (firstIndex == 0)
            {
                splitTextList.Add("");
            }
            else
            {
                splitTextList.Add(text.Substring(0, firstIndex));
            }
            
            if (firstIndex == text.Length)
            {
                splitTextList.Add("");
            }
            else
            {
                splitTextList.Add(text.Substring(firstIndex , text.Length-(firstIndex)));
            }

            return splitTextList.ToArray();
        }

 

 

대소문자구분없이 리플레이스

 

    public static string RelaceUL(string text,string oldValue, string newValue)
    {
        if (string.IsNullOrEmpty(oldValue))
        {
            return text;
        }
        var charList = text.ToCharArray().ToList();
        {
            int i = 0;
            while (i+ oldValue.Length-1 < charList.Count)
            {
                bool replaceCheck = true;
                for (int j = 0; j < oldValue.Length; j++)
                {
                    var word = charList[i + j].ToString();
                    if (System.Text.RegularExpressions.Regex.IsMatch(word, @"^[a-zA-Z]+$"))
                    {
                        var oldWord = oldValue[j].ToString();
                        if (word.ToUpper() != oldWord.ToUpper())
                        {
                            replaceCheck = false;
                            break;
                        }
                    }
                    else if (charList[i + j] != oldValue[j])
                    {
                        replaceCheck = false;
                        break;
                    }
                }

                if (replaceCheck)
                {
                    charList.RemoveRange(i, oldValue.Length);
                    charList.InsertRange(i, newValue.ToCharArray());
                    i += newValue.Length;
                }
                else
                {
                    i++;
                }
            }
        }
        return new string(charList.ToArray());

    }
    
    //Debug.Log(RelaceUL("1text 2Text 3TEXT 4텍스트 5text","text","convert"));
    //1convert 2convert 3convert 4텍스트 5convert

 

한국어 처리관련

Debug.Log((char)('가' + 1)); //각
Debug.Log((char)('가' + 2)); //갂
Debug.Log((char)('가' + 3)); //갃
Debug.Log((char)('나' + ('나' - '가'))); //따

 

 

Char To Hex

Debug.Log(((int)'가').ToString("X")); //AC00
Debug.Log(((int)'나').ToString("X")); //B098
Debug.Log(((int)'다').ToString("X")); //B2E4
Debug.Log(System.String.Format("{0:X}", (int)'가')); //AC00
Debug.Log(System.String.Format("{0:X}", (int)'나')); //B098
Debug.Log(System.String.Format("{0:X}", (int)'다')); //B2E4

 

String To HexString 간략버전

//String To HexString
string text = "테스트";
var bytes = System.Text.Encoding.UTF8.GetBytes(text);
var hexString = System.BitConverter.ToString(bytes);
Debug.Log(text);
Debug.Log(string.Join(",", bytes));
Debug.Log(hexString);


//HexString To String
var bytes2 = System.Array.ConvertAll(hexString.Split('-'), x => System.Convert.ToByte(x, 16));
var text2 = System.Text.Encoding.UTF8.GetString(bytes2);
Debug.Log(string.Join(",", bytes2));
Debug.Log(text2);

 

 

 

 

String To HexString 경량버전

//String To HexString2
string text = "테스트";
var bytes = System.Text.Encoding.UTF8.GetBytes(text);
var hexString = System.BitConverter.ToString(bytes).Replace("-","");
Debug.Log(text);
Debug.Log(string.Join(",", bytes));
Debug.Log(hexString);


//HexString To String2
var bytes2 = new byte[hexString.Length / 2];
for (int i = 0; i < bytes2.Length; i++)
{
	bytes2[i] = System.Convert.ToByte(hexString.Substring(i * 2, 2), 16);
}
var text2 = System.Text.Encoding.UTF8.GetString(bytes2);
Debug.Log(string.Join(",", bytes2));
Debug.Log(text2);

 

 

 

Bytes To HexString V1

//bytes To HexString
{
    System.Text.StringBuilder sb = new System.Text.StringBuilder();
    foreach (byte b in bytes)
    {
        sb.Append(b.ToString("X2"));
    }
    string hexString = sb.ToString();
}

 

Bytes To HexString V2

string hexString = System.BitConverter.ToString(bytes).Replace("-", "");

 

 

 

 

UTF8 to ASCII

옛날시스템과 호환시킬때 사용한다

ASCII는 7비트니까 UTF7으로 변환시킨후 아스키로 바꿔서 전송

//UTF8 to ASCII
string text = "테스트";
var bytes = System.Text.Encoding.UTF7.GetBytes(text);
var ascii = System.Text.Encoding.ASCII.GetString(bytes);
Debug.Log(text);
Debug.Log(string.Join(",", bytes));
Debug.Log(ascii);


//ASCII to UTF8
var bytes2 = System.Text.Encoding.ASCII.GetBytes(ascii);
var text2 = System.Text.Encoding.UTF7.GetString(bytes2);
Debug.Log(string.Join(",", bytes2));
Debug.Log(text2);

 

 

 

String To Bytes

//문자열 -> 바이트배열
System.Text.Encoding.Default.GetBytes(text);

//바이트배열 -> 문자열 
System.Text.Encoding.Default.GetString(bytes2)

 

 

 

Root를 제외한 경로반환

가령 Root/armature/Hips는 /armature/Hips가 된다

string ArmaturePath(Transform bone)
{
    var rootName = bone.transform.root.name;
    var hierarchyPath = bone.transform.GetHierarchyPath();
    return hierarchyPath.Substring(rootName.Length, hierarchyPath.Length - rootName.Length);
}

 

 

 

Second To String

//0:02:13.878
System.TimeSpan.FromSeconds(clip.length).ToString("g")

 

 

비슷한 문장 검색

클래스형이 아니라 string으로 바꿔놔야 쓰기 편할텐데 나중에하자

MemorizationData GetSimilarWord(MemorizationData fromWord, List<MemorizationData> words)
{
    var similarWords = GetSimilarWords(fromWord, words);
    if (similarWords.Count == 0)
    {
        return null;
    }

    //셔플
    similarWords = similarWords.OrderBy(a => Random.value).ToList();


    return similarWords[0];
}
List<MemorizationData> GetSimilarWords(MemorizationData fromWord, List<MemorizationData> words)
{


    //중복이 아닌 단어들만 가져옴
    var filteredWords = words.FindAll(x => x.question != fromWord.question);
    if (filteredWords.Count == 0)
    {
        return null;
    }


    var similarWords = new List<MemorizationData>();
    for (int n = 2; n > 0; n--) //2글자까지만 검색
    {
        //n글자 이상 중복
        similarWords.AddRange(filteredWords.FindAll(word =>
        {
            if (word.question.Length < n)
            {
                return false;
            }
            for (int i = 0; i <= fromWord.question.Length-n; i++)
            {

                var fromWordSub= fromWord.question.Substring(i, n);
                if (fromWordSub.Length==1)
                {
                    if (fromWordSub[0] >= 0x20000 && fromWordSub[0] <= 0xFA2D)
                    {
                        //이것은 한자임
                    }
                    else
                    {
                        return false; //단일문자인데 한자가 아니라서 스킵
                    }
                }
                if (word.question.Contains(fromWord.question.Substring(i, n)))
                {
                    return true;
                }
            }
            return false;
        }));

        if (similarWords.Count > 0)
        {
            return similarWords;
        }
    }
    /*
    if (similarWords.Count == 0)
    {
        return null;
    }
    */
    return similarWords;
}

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

c# @변수  (0) 2020.07.28
OnGUI  (0) 2020.07.27
싱글톤 패턴  (0) 2020.07.20
posted by 모카쨩
2020. 7. 27. 14:48 Unity/C#

 

 

 

Debug.Log로 추적하기 힘든 실시간 상황값들을 추적할때 사용한다.

 

그냥 UGUI에 띄우면 되는거 아니냐? 하겠지만

ugui 할당하려면 캔버스 할당해서 Text 박스 맞추고 디버그모드에서만 활성화 하도록 따로 맞춰주고

누구한테 보여주려는거도 아니고 변수 하나 보는것뿐인데 여간 번거로운게 아니라 이쪽이 이득이다.

    #if UNITY_EDITOR //||true
    void OnGUI()
    {
        if (Debug.isDebugBuild)
        {
            GUI.Box(new Rect(0, 0, 200, 24), "Count: " + count);
        }
    }
    #endif
    public static int count = 0;

V3

    void OnGUI()
    {
#if UNITY_EDITOR
        if (UnityEditor.EditorUserBuildSettings.development)
#else
        if (Debug.isDebugBuild)
#endif
        {
            GUI.Box(new Rect(0, 0, 200, 24), "Count: " + count);
        }
    }
    public static int count = 0;

 

 

 

 

왼쪽정렬이 필요할때

    #if UNITY_EDITOR //||true
    void OnGUI()
    {
        GUI.Box(new Rect(0, 0, 200, 24), "");
        GUI.Label(new Rect(10, 0, 200, 24), "Count: " + count);
    }
    #endif
    public static int count = 0;

GUIStyle을 안 쓰는 이유는 글자색이나 크기 배경색 등등을 전부 지정해줘야해서

 

 

 

 

아래처럼 짜면 실시간으로 변수를 확인하면서 수정할수 있다.

근데 가능하면 인스펙터를 쓰고 이런건 전역값들을 추적할때 쓰자

int count=0;
string input = "";
#if UNITY_EDITOR //||true
void OnGUI()
{
  int lineHei = 18;
  input = GUI.TextField(new Rect(10, lineHei * 4, 300, lineHei * 1)
  , (input == "") ? input : count.ToString());
  if(input!="")
  {
  	count = int.Parse(input);
  }
}
#endif

 

버튼

    #if UNITY_EDITOR //||true
    void OnGUI()
    {
        if (Debug.isDebugBuild)
        {
            if(GUI.Button(new Rect(100, 100, 100, 24), "button"))
            {
                //명령
            }
        }
        
    }
    #endif

 

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

c# 문자열 처리  (0) 2020.07.28
싱글톤 패턴  (0) 2020.07.20
유니티 버그, 에러, 오류모음  (0) 2020.07.20
posted by 모카쨩
2020. 7. 24. 11:27 Unity

화면 사이즈에 따라 이미지가 보이고 안 보이고 할때

-z축이 0이 아님

'Unity' 카테고리의 다른 글

유니티 함수 연동 안될때  (0) 2020.08.03
유니티 로그캣  (0) 2020.06.29
스파인 사용법  (0) 2020.06.25
posted by 모카쨩
2020. 7. 20. 11:34 Unity/C#

응가 싸는 패턴이다

싱글톤은 유용하지만 유니티에서 지원이 빈약하다

써야한다면 static final로 한번만 생성되게 막자

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

OnGUI  (0) 2020.07.27
유니티 버그, 에러, 오류모음  (0) 2020.07.20
자주 쓰는 유니티 코드 모음  (0) 2020.07.09
posted by 모카쨩
2020. 7. 20. 11:03 Unity/C#

 

 

2019.4.0f1버전의 유니티의

안드로이드 update에서 Time.deltaTime이 제대로 안 먹힐때가 있다. 

    float Timetime_previous = 0; 
    void Update()
    {
        Debug.Log(Time.time - Timetime_previous);
        Timetime_previous = Time.time;
    }

이걸로 해결 가능하다.

 

후일담)

2019.4.31f1에서도 동일한 증상이 있고

첫프레임에서 발생하는거 보니 델타타임으로 중요루틴 굴리면 안 될듯

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

 

 

Image 컴포넌트를 인풋으로 받을수 없을때

public Image img_comp;

이렇게 쳐도 안되면 

using UnityEngine.UIElements로 되어있기 때문

using UnityEngine.UI가 맞음

 

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

 

 

GetCharacterInfo의 characterInfo.advance를 못 받아오는 문제

콜백을 걸어서 사용해야 한다

    void Start()
    {
        Font.textureRebuilt += GetTextWidth;
    }
    void GetTextWidth(Font font)
    {
        CharacterInfo characterInfo;
        char c = 'a';
        if (font.GetCharacterInfo(c, out characterInfo, font.fontSize, FontStyle.Normal))
        {
            Debug.Log($"c: {c}, characterInfo.advance: {characterInfo.advance}");
            Debug.Log($"c: {c}, characterInfo.bearing: {characterInfo.bearing}");

            Debug.Log($"GetCharacterInfo Success, textUI.fontSize:{font.fontSize}");
        }
        else
        {
            Debug.Log($"GetCharacterInfo Fail, textUI.fontSize:{font.fontSize}");
        }
    }

 

이렇게 붙이면 된다. 결국 그래서 별로 쓸모는 없음

 

 

 

 

 

 

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

UGUI 월드스페이스에서 동작 안할경우

 

 

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

unrecognized identifier 'UNITY_FOG_COORDS'

 

 

상단에

#include "Lighting.cginc"

를 넣어주면 된다

 

 

 

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

CommandInvokationFailure: Unable to install APK to device. Please make sure the Android SDK is installed and is properly configured in the Editor. See the Console for more details.

 

키스토어가 바뀌어버린것이거나 Bundle Version Code가 더 낮은걸 올려버림

 

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

 

 

안드로이드에서만 30프레임으로 고정될때



매낮으로 설정됨

둘중하나를 선택

 

 

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

에셋번들로 빌드시 3D모델일부(스킨드 메쉬 렌더러)가 보이지 않는 현상

 

3D모델들을 Resources폴더 하위에 넣으면 된다

 

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

에셋번들로 빌드시 믹서가 크래시 나는 현상

 

믹서들을 Resources폴더 하위에 넣으면 된다

 

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

빌드시 동영상이 보이지 않을경우

 

동영상을 Resources폴더 하위에 넣으면 된다

 

 

 

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

안드로이드 이미지 로드시 튕길경우

 

jpg로 넣어라


png는 TextureFormat.ETC2_RGBA8Crunched 포맷만 되었던가 이것만 안되었던가 둘중하나인데
이걸 구분하기 힘드니까 jpg써라

 

 

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

 

애니메이션이 초기화가 안 되고 자꾸 덧씌우기로 동작할경우

 

 

체크해라

 

 

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

압축풀때 java.lang.IllegalArgumentExcetion 뜨면서 안될때

파일명들에 한글이랑 - , ` 제거하고 영어랑 띄어쓰기만 써라

 

 

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

애니메이션에 마테리얼 프로퍼티값을 등록할수 없을때

 

Image같은 UI컴포넌트는 원래 안 되고, 메쉬렌더러같이 렌더러계열만 가능

 

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

2019.4.1f1에서 에셋번들로 실행시 AudioSouce의 PlayDelayed (float)함수가 버튼으로 실행을 넘겨받을경우 작동이 안됨

 

 

 

 

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

ArgumentException: Mesh can not have more than 65000 vertices
UnityEngine.UI.VertexHelper.FillMesh (UnityEngine.Mesh mesh) (at 

 

아웃라인 컴포넌트 오류이다

텍스트 컴포넌트에 달았는데 텍스트가 너무 길면 발생한다

 

 

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

iOS에서 플러그인 익스포트가 안 될때

DirectoryNotFoundException: Could not find a part of the path 
"C:/unity/Test/Assets/Plugins/iOS/Helloworld.swift" 
or "//DESKTOP-0000/Xcode/Test\Libraries\Plugins\iOS\Helloworld.swift"

 

폴더경로가 이상해서 그렇다.

네트워크 드라이브나 한글경로 쓰지말고 자신의 드라이브의 영어경로를 쓰자

 

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

<unknown>:0: error: no such file or directory:

'/Volumes/Xcode/Test/Libraries/Plugins/iOS/Helloworld.swift'

Command

/Users/Test/Desktop/Xcode.app/Contents/Developer/Toolchains

/XcodeDefault.xctoolchain/usr/bin/swiftc failed with exit code 1

 

 

위와 같은 문제다

내부경로 영어경로를 쓰자

 

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

 

유니티 zip가 IOS에서 빌드 안될때

 

 


넣으삼

 

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

app transport security has blocked a cleartext http (http //) resource load since it is insecure

 

 

 

 

 

  <key>NSAppTransportSecurity</key>
  <dict>
    <key>NSAllowsArbitraryLoads</key>
    <true/>
  </dict>

추가한다.

추가해도 안된다면 Security에 잡다한게 들어가서 그럼

 

 

 

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

렌더카메라가 메인카메라로 잡힐때

태그달아라

 

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

 

 

 

 

2019.4.1f1버전의 유니티에서 iOS빌드시 리플렉션 해상도가 다르게 바뀜

 

 

 

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

Found plugins with same names,  and . Delete the one of the duplicate plugins.UnityEditor.AndroidPluginImporterExtension:CheckFileCollisions(String)UnityEditorInternal.PluginsHelper:CheckFileCollisions(BuildTarget)UnityEngine.GUIUtility:ProcessEvent(Int32, IntPtr)

 

 

2018에서 2019로 올릴때 발생한다

라이브러리 폴더 지우면 폴더가 재구축 되면서 해결된다

 

 

 

 

 

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

SerializedObject target has been destroyed.
UnityEngine.GUIUtility:ProcessEvent(Int32, IntPtr)

 

특정 인스펙터를 열어둔상태에서 재생하면 발생한다. 다른곳으로 인스펙터를 열면 된다

 

 

 

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

2019.4.1.f1의 particle system force field가 android, ios에서 실행 안됨

 

에셋번들로 로드할때 실행이 안 되는 현상이 발생하고

레이어를 동일하게 맞춰주고 풀빌드 하면 잘됨

 

 

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

unrecognized identifier 'SHADOW_COORDS'

 

아래 코드를 넣는다

#pragma multi_compile_fwdbase
#include "AutoLight.cginc"

 

 

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

씬 이동후 캔버스 먹통되는 현상

 

이동할때 같이 EventSystem을 이동시켜주거나

이동한 씬에도 EventSystem을 달아준다

평소에는 자동할당 되어서 눈치채기 힘든부분이다

 

 

 

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

AssetBundle(에셋번들)에서 Polygon Collider 2D 미동작

AssetBundle(에셋번들)에서 Particle System Force Field 미동작

체크 해제한다.

동적 메쉬 데이터는 에셋번들에서 제외되기 때문IL2CPP에서만 그런듯?

단점은 불필요한 파일들의 필터링이 안 되기 때문에 빌드시간과 용량이 늘어난다

다행히 스크립트만 포함시키는듯하다

차라리 번들로더랑 같이 해당씬을 포함시키던지 해당기능을 쓰지 않거나 link.xml을 작성하여 Asset폴더에 넣자

 

 

참조 : https://docs.unity3d.com/kr/2018.4/Manual/ManagedCodeStripping.html

 

 

 

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

RenderTexture.Create: Depth|ShadowMap RenderTexture 

requested without a depth buffer. Changing to a 16 bit depth buffer.

 

2019.4.1f1에서 렌더텍스처의 DepthTexture를 쓰려고 하면 발생한다

정확히는 Camera의 RenderTexture의 Color Format의 DEPTH_AUTO를 줄때

Depth Buffer가 16bit가 아닐때 발생한다고 하는데 걍 계속 생김

 

 

해결방법은 해당 카메라를 쓸때만 키자

 

 

 

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

Attempting to bind Texture ID 125 as UAV, the texture wasn't created with the UAV usage flag set!

enableRandomWrite가 설정된 렌더텍스처만 가능하다

enableRandomWrite는 동적으로 생성시에만 설정 가능하며

만일 기존 렌더텍스처에 할당하려고 하면 RenderTexture.Create failed: format unsupported for random writes - RGBA4 (142).

라는 새로운 오류를 발생시킨다

 

 

 

 

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

Not allowed to access vertices on mesh '메쉬이름'

Read/Write 체크

 

 

 

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

java.lang.securityexception permission denied (missing internet permission )

 

 

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

 

java.io.IOException: Cleartext HTTP traffic to 링크 not permitted

 

해당 링크가 https가 아니라서 발생하는 문제이다

예외속성에 해당링크를 추가하는 방법도 있긴한데 ios 지원할거라면 걍 https쓰자

 

 

 

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

Failed running C:\Program Files\Unity\Hub\Editor\2019.4.1f1\Editor\Data\il2cpp/build/deploy/net471/il2cpp.exe

stdout:
Building libil2cpp.so with AndroidToolChain
Output directory: C:\unity\GameName\Temp\StagingArea\assets\bin\Data\Native\arm64-v8a
Cache directory: C:\unity\GameName\Library\il2cpp_android_arm64-v8a\il2cpp_cache

 

 

빌드중에 크래시 나면 빌드불가에 빠지는 버그이다

프로젝트 폴더의 Library 폴더아래의

il2cpp_android_arm64-v8a폴더와

il2cpp_android_armeabi-v7a폴더를 지워주면 된다

 

 

 

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

iOS framework addition failed due to a CocoaPods installation failure. This will will likely result in an non-functional Xcode project.

 

 

 

 

 

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

1. undefined symbol _objc_class_$_

2. _objc_class_$_firtransactionresult

3. unity _OBJC_CLASS_$_ GKLocalPlayer

4. 'FBSDKShareKit/FBSDKShareKit.h' file not found

5. ios framework addition failed due to a cocoapods installation failure

 

위 5개 전부 동일한 원인의 버그이다

얼핏보면 코코아포드 손상이나 GameKit.framework 미설치로 보이겠지만 전혀 아니다 

유니티 서비스 인증 만료로 생긴 버그이다. 해결방법은 하단 이미지 참조

 

 

알고보니 하단설정이다

 

 

 

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

cocoapods installation detected /usr/local/bin/pod

이미 설치되어 있다는 소리이다

지우고 싶다면 터미널에서 sudo gem uninstall cocoapods를 친다

 

 

 

 

 

 

 

 

 

 

 

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

error CS0234: The type or namespace name 'Graphics' does not exist in the namespace 'System.Drawing' (are you missing an assembly reference?)

 

dll을 넣어도 문제가 생긴다면 System.Drawing 중복으로 인한 참조 오류이다

 

4.0으로 올리고 dll을 넣으면 된다

 

 

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

Signing for "Unity-iPhone" requires a development team.
Select a development team in the Signing & Capabilities editor that matches the selected profile "키".

 

인증서 기간 조금 남았어도 뜨는듯

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

 

 

UnityPlayerActivity.java uses or overrides a deprecated API.
UnityEditor.BuildPlayerWindow:BuildPlayerAndRun()

 

안드로이드 Minimum API레벨이 너무 낮아서 그렇다

30으로 올려주자

 

 

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

Cycle in dependencies between targets 'Unity-iPhone' and 'UnityFramework'; building could produce unreliable results.

 

빌드할때 뭔가 빨간줄 뜨면서 헤더가 빠진채 빌드가 되었을것이다

빨간줄 안뜨게 수정하면 된다

 

 

 

 

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

Image UGUI에서 마테리얼값 바꿀때

 

https://answers.unity.com/questions/920091/how-can-i-change-the-shader-parameters-for-an-ui-i.html

Material mat = Instantiate(image.material);
mat.SetFloat("_SomeProperty", 1f);
image.material = mat;

 

이거쓰면 전역 건드리는 문제 해결된다

 

 

 

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

블루투스 권한 못 받아올때

<uses-permission android:name="android.permission.ACCESS_FINE_LOCATION"/>
<uses-permission android:name="android.permission.BLUETOOTH_ADMIN"/>
<uses-permission android:name="android.permission.BLUETOOTH"/>

이걸 Plugins/Android/AndroidManifest.xml에 넣어준다

위치는 이런식으로</application>와 </manifest>사이에 넣어야 한다

 

 

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

Note: \Temp\gradleOut\unityLibrary\src\main\java\com\unity3d\player\UnityPlayerActivity.java uses or overrides a deprecated API.

UnityEngine.GUIUtility:ProcessEvent(Int32, IntPtr)

 

api 올려주면 된다 24쯤?

 

올려도 발생할때 있는데 타겟api가 낮은 경우로 블루투스의 경우 31을 깔아주면 된다

 

 

 

 

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

Duplicated input semantics can't change type, size, or layout ('TEXCOORD1'). at line 82 (on d3d11)

 

이 문제인데 보다시피 설명과 달리 TEXCOORD1는 한번밖에 쓰여있지 않다

이유는 UNITY_FOG_COORDS에서 TEXCOORD1을 쓰기 때문

TEXCOORD2로 수정해주면 해결된다 

 

 

 

 

 

 

 

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

ArgumentException: The Assembly Mono.WebBrowser is referenced by System.Windows.Forms

 

 

 

 

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

Not a WAVE file - no RIFF header

 

NAudio의 오류

파일명의 확장자에 .wav가 안 붙어있어서 발생함

 

 

 

 

 

 

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

CommandInvokationFailure: Unable to install APK to device. Please make sure the Android SDK is installed and is properly configured in the Editor. See the Console for more details.
C:/Program Files/Unity/Hub/Editor/2019.4.1f1/Editor/Data/PlaybackEngines/AndroidPlayer\SDK\platform-tools\adb.exe -s "RF9NC0529JN" install -r -d "D:\~~~.apk"
stderr[
adb: failed to install D:\~~.apk: Failure [INSTALL_PARSE_FAILED_MANIFEST_MALFORMED: Failed parse during installPackageLI: /data/app/vmdl1319470982.tmp/base.apk (at Binary XML file line #40): com.unity3d.player.UnityPlayerActivity: Targeting S+ (version 31 and above) requires that an explicit value for android:exported be defined when intent filters are present]
]
stdout[
]
exit code: 1

 

Target API Level이 Automatic이면 가끔씩 잘 못 잡아서 그럼

수동으로 할당

 

 

 

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

Microsoft (R) Visual C# Compiler version 2.9.1.65535 (9d34608e) Copyright (C) Microsoft Corporation. All rights reserved

 

 

특정 컴퓨터에서 포톤을 열려고 하면 이렇게 된다

2019.4.1f1에서 발생했고 2019.4.31f1으로 올리면 해결된다

 

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

File couldn't be read! UnityEngine.GUIUtility:ProcessEvent(Int32, IntPtr)

 

위 버그랑 동일한 문제다

해결법도 같다

 

 

 

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

The referenced script on this Behaviour

미싱컴포넌트 있어서 그렇다

지워

 

 

 

 

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

Unsupported type BitField
UnityEditor.EditorApplication:Internal_CallUpdateFunctions ()

 

32비트까지만 지원해서 안된다느니 어쩌구~

결론은

보통 레이어마스크를 인자로 받다가 프리팹에서 꼬여서 발생한다

public LayerMask layerMask = -1;

이 부분이 문제인데 그냥은 안 생긴다

원래 int형으로 만들고 저장한 후에 나중에 LayerMask로 바꾼 괴랄한 경우에 생긴다

해당 컴포넌트를 Revert해서 기록된 쓰레기 데이터를 날려주면 된다

 

 

 

 

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

 

래그돌(Ragdoll)에 AddExplosionForce가 안먹히는 현상

GetComponent<Rigidbody>() 써서 그렇다.

콜라이더는 회전문제때문에 보통 오브젝트가 분리되어 있으니까..
attachedRigidbody로 수정해주자

//var rigidbody = collider.GetComponent<Rigidbody>();
var rigidbody = collider.attachedRigidbody;
if (rigidbody)
{
    rigidbody.AddExplosionForce(explosionForce, explosionCenter, radius);
}

 

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

2019.4.31f1에서

hit.transform.name에 이상한게 뜨는 현상

내부적으로 hit.rigidbody.transform.name을 쓰기 때문이다 (이뭐병...)

반드시 hit.collider.transform.name을 쓰자

 

 

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

2019.4.1f1에서 발생

 

Missing Project ID

 

걍 계정 두개 쓰다가 다른 계정으로 열어서 걸림

즉 권한부족

일단 아래사진대로 눌러보면

이렇게 뜰것이다

https://dashboard.unity3d.com/

먼저 유니티 대시보드 들어가서

 

 

계정을 초대하고 권한을 설정해준다

나는 부계정이라서 매니저 권한 줬는데 보통은 게스트나 유저를 주면 될것이다

그리고 유니티에서 리프레시를 누르면

짜잔 액세스 성공

내가 특이케이스라 그렇지 일반적인 경우라면 다른 직원이 초대를 못받은 경우겠다

 

 

 

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

 

 

Target Android SDK not installed

혹은

UnityException: Target Android SDK not installed
Android SDK does not include your Target SDK of 30.

 

 

SDK를 순차적으로 설치하지 않은 상태에서 없는 SDK를 요청하면 뜬다

이게 무슨 소리나면 내가 원래 34버전을 요청해서 업데이트 받았는데

도중에 30이 필요해서 맥시멈을 30으로 내렸더니 업데이트창 없이 바로 이 창이 뜸

해결방법은

https://wmmu.tistory.com/entry/%EA%B5%AC%EA%B8%80%ED%94%8C%EB%A0%88%EC%9D%B4-%EB%B9%8C%EB%93%9C%EC%97%90%EB%9F%AC

 

안드로이드 빌드관련

Minimum API Level api 29 설치방법 프로젝트 세팅에서 타겟api를 29로 놓고 빌드하면 이런창이 뜬다 눌러야 하는데 관리자 모드로 안하면 아래같은 창이 뜬다 Required API level 29 Unable to install additional SDK P

wmmu.tistory.com

이 글의 '중간버전 설치방법' 탭을 확인하자

 

 

 

 

 

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

패키지를 파싱하는 중 문제가 발생했습니다

영어로는 There was a problem while parsing the package라고 한다

 

https://discussions.unity.com/t/problem-parsing-package-with-api-level-31/249651

 

 

여기서 보면 android:exported="true"인지 머시긴지를 넣으라고만 한다

이렇게 적으면 으뜩케 알아먹으란 건데?

 

먼저 Plugins/Android/AndroidManifest.xml를 열면 이렇게 적혀있다

<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android" package="com.google.unity.ads" android:versionName="1.0" android:versionCode="1">
  <application>
    <uses-library android:required="false" android:name="org.apache.http.legacy" />
    <meta-data android:name="com.google.android.gms.ads.APPLICATION_ID" android:value="ca-app-pub-3940256099942544~3347511713" />
    <meta-data android:name="com.google.unity.ads.UNITY_VERSION" android:value="2021.1.10f1" />
  </application>
</manifest>

여기에

<activity android:name="com.unity3d.player.UnityPlayerActivity" android:theme="@style/UnityThemeSelector" android:exported="true">
  <intent-filter>
    <action android:name="android.intent.action.MAIN" />
    <category android:name="android.intent.category.LAUNCHER" />
  </intent-filter>
  <meta-data android:name="unityplayer.UnityActivity" android:value="true" />
</activity>

이걸 넣어서 아래처럼 수정했다

<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android" package="com.google.unity.ads" android:versionName="1.0" android:versionCode="1">
  <application>
    <uses-library android:required="false" android:name="org.apache.http.legacy" />
    <meta-data android:name="com.google.android.gms.ads.APPLICATION_ID" android:value="ca-app-pub-3940256099942544~3347511713" />
    <meta-data android:name="com.google.unity.ads.UNITY_VERSION" android:value="2021.1.10f1" />
    <activity android:name="com.unity3d.player.UnityPlayerActivity" android:theme="@style/UnityThemeSelector" android:exported="true">
      <intent-filter>
        <action android:name="android.intent.action.MAIN" />
        <category android:name="android.intent.category.LAUNCHER" />
      </intent-filter>
      <meta-data android:name="unityplayer.UnityActivity" android:value="true" />
    </activity>
  </application>
</manifest>

틀린그림 찾기 알아서 잘 하시길

잘보면 알겠지만 activity에 android:exported="true"를 넣어야 하는데

activity가 없어서 activity를 추가하고 거기에 android:exported="true"를 넣었다

activity는 application안에 들어가야 해서 </application> 바로 위에 써넣었다

 

그리고 ca-app-pub-3940256099942544~3347511713는 데모키니까 알아서 각자의 키로 수정해야한다

 

 

당장 급하다면 API를 낮춰서 빌드하거나 컴퓨터랑 폰 연결후 유니티에서 Build And Run하면 될듯

 

테스트 하다 말긴 했는데 위에 풀코드 말고

<activity android:name="com.unity3d.player.UnityPlayerActivity" android:theme="@style/UnityThemeSelector" android:exported="true">
</activity>

이렇게 넣어도 부팅은 되긴 했다.

하지만 유니티 버전을 낮게해서 도중에 팅겼었음

 

 

 

 

 

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

Android resource linking failed See the Console for details.

말그대로 오류는 콘솔창을 보고 해결하란 뜻

 

 

 

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

2019.4.1.f1과 2019.4.31f1에서 발생

> Task :unityLibrary:preBuild UP-TO-DATE
> Task :launcher:preBuild UP-TO-DATE
> Task :unityLibrary:preReleaseBuild UP-TO-DATE
> Task :unityLibrary:GoogleMobileAdsPlugin.androidlib:preBuild UP-TO-DATE
> Task :unityLibrary:GoogleMobileAdsPlugin.androidlib:preReleaseBuild UP-TO-DATE
> Task :unityLibrary:checkReleaseManifest UP-TO-DATE
> Task :launcher:prepareLintJar UP-TO-DATE

 

 

애드몹 업뎃하고나니 발생함

저거랑 별개로

Note: \Temp\gradleOut\unityLibrary\src\main\java\com\unity3d\player\UnityPlayerActivity.java uses or overrides a deprecated API.
Note: Recompile with -Xlint:deprecation for details.

CommandInvokationFailure: Gradle build failed. 

도 같이 뜸

찾아보니 커스텀 그래들을 쓰라고 한다

근데 난 이런 해결방식 존나 싫어함

왜?

나중에 또 고쳐야 하니까

 

생각해보면 걍 유니티가 옛날버전이라 발생하는 문제니까

유니티를 2019.4.1.f1에서 2020.3.48f1으로 올려서 고침

 

오류코드wmup20230925ASM7과도 관련이 있을수 있으니

또 발생하면 참고바람

 

 

 

 

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

A failure occurred while executing

 

GoogleMobileAds-v8.5.2가 설치된 상태에서 유니티 버전이 2020.3.48f1이 아니라서 발생함

 

 

 

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

Assembly 'Assets/ExternalDependencyManager/Editor/1.2.177/Google.IOSResolver.dll' will not be loaded due to errors:
Unable to resolve reference 'UnityEditor.iOS.Extensions.Xcode'. Is the assembly missing or incompatible with the current platform?
Reference validation can be disabled in the Plugin Inspector.

 

GoogleMobileAds-v8.5.2가 설치된 상태에서

유니티를 2019.4.1.f1에서 2022.3.5f1으로 올려서 발생함

 

IOSResolver 두개를 지워서 고치긴 했는데 원론적인 방법은 아닌듯

그래서 더 찾아봄

 

https://github.com/googlesamples/unity-jar-resolver/issues/441

 

[Known Issue] iOSResolver.dll failed to load with Unity 2021.1.11+ on Mac · Issue #441 · googlesamples/unity-jar-resolver

[REQUIRED] Please fill in the following fields: Unity editor version: Issue occurred with 2021.1.11, 2021.1.12 (Works with 2021.1.10 and 2021.2.0) External Dependency Manager version: Tried 1.2.160...

github.com

여기 보면 2021.1.10에서는 정상 동작한단다.

 

그래서 찾아보니 이런거도 있었음

보니까 걍 얘내들이 2021.1.10 기준으로 만들어서 생긴 문제다

그래서 2022.3.5f1에서 2021.1.10으로 다운그레이드해서 해결

근데 이거 비안정버전이라 2020.3.48f1으로 더 낮췄다

 

그리고 해결했단거도 정확히 따지면 재생할때 오류창이 뜨긴 하는데 동작은 한다.(...)

 

이거 체크하면 재생해도 오류 안 뜬다

 

 

 

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

 

오류코드wmup20230925ASM7

java.lang.UnsupportedOperationException: This feature requires ASM7 See the Console for details.

 

빌드버전코드 올리고 빌드하니 발생함

응?

오류창을 더 보니 이런게 쓰여있다


> Configure project :launcher
WARNING: The option setting 'android.enableR8=false' is deprecated.
It will be removed in version 5.0 of the Android Gradle plugin.
You will no longer be able to disable R8

 

또 그래들 오류냐?

근데 이게 유니티랑 애드몹 패키지 버전업하면서 사라졌는데

버전수정하면서 그래들이 재갱신 되면서 문제가 발생한듯 하다

 

https://forum.unity.com/threads/java-lang-unsupportedoperationexception-this-feature-requires-asm.1377564/

여기서 보니까 안드로이드 7.0으로 올리니 문제없단다

그러고보니 원래 미니멈 올리고 테스트 했었는데 그게 잔류했었나보다

API 24로 올리고 해결

 

 

 

 

 

 

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

유니티 드래그 안 될때

 

컴퓨터 재부팅 하면 됨

 

 

 

 

 

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

싱글톤 패턴  (0) 2020.07.20
자주 쓰는 유니티 코드 모음  (0) 2020.07.09
사소한 c# 테크닉  (0) 2020.07.08
posted by 모카쨩

  • total
  • today
  • yesterday

Recent Post

저사양 유저용 블로그 진입