'프로그램개발/C# and unity'에 해당되는 글 43건

  1. 2018.12.22 emgucv opencv unity 에서 가능
  2. 2018.06.28 서버 구조
  3. 2018.06.20 dotnetcore
  4. 2018.06.18 유니티 안드로이드 권한 문제
  5. 2018.06.07 구글피처드
  6. 2018.05.23 압축라이브러리
  7. 2018.05.10 에디터 확장 기능
  8. 2018.04.27 유니티 안드로이드 빌드 에러
  9. 2018.02.20 C# 코딩가이드 v1.0
  10. 2016.10.19 젠킨스 유니티

emgucv opencv unity 에서 가능


유니티 최신 버젼에 빌드 옵션 수정할것


흑백 출력

void Update () {

 if (webcamTexture.didUpdateThisFrame)

        {

            webcamTexture.GetPixels32(colors);


            GCHandle imageHandle = GCHandle.Alloc(colors, GCHandleType.Pinned);

            GCHandle matHandle = GCHandle.Alloc(bytes, GCHandleType.Pinned);

            using (Image<Bgra, byte> image = new Image<Bgra, byte>(webcamTexture.width, webcamTexture.height, webcamTexture.width * 4, imageHandle.AddrOfPinnedObject()))

            {

                //using (Mat mat = new Mat(webcamTexture.height, webcamTexture.width, DepthType.Cv8U, 3, matHandle.AddrOfPinnedObject(), webcamTexture.width * 3))

                //{

                //    CvInvoke.CvtColor(image, mat, ColorConversion.Bgra2Bgr);

                //    //CvInvoke.CvtColor(mat, image, ColorConversion.Bgr2Gray);


                //    tex.LoadRawTextureData(mat.Bytes);

                //    tex.Apply();

                //}


                using (Image<Bgr, byte> mat = new Image<Bgr, byte>(webcamTexture.width, webcamTexture.height, webcamTexture.width * 3, matHandle.AddrOfPinnedObject()))

                {

                    CvInvoke.CvtColor(image, mat, ColorConversion.Bgra2Bgr);

                    //CvInvoke.CvtColor(mat, image, ColorConversion.Bgr2Gray);

                    Image<Gray, byte> grayframe = mat.Convert<Gray, byte>();

                    Image<Bgr, byte> grayframe2= grayframe.Convert<Bgr, byte>();


                    tex.LoadRawTextureData(grayframe2.Bytes);

                    tex.Apply();

                }



            }

            imageHandle.Free();

            matHandle.Free();


            

        }

}

Posted by 아기곰푸우
,

서버 구조는 상황에 따라 다양하게 구성될수 있다.

1. 서버가 없는 구조 - 아예 없는 구조, 기타 외부 솔류션을 사용, 클라우드의 서버리스를 사용하는 방법이 있

   이경우 구글 게임 서비스등과 같은 서비스를 최대한 활용, 간단한 인증과 로그인, 데이터 저장 및 방 구조의 네트워크까지 가능


2. REST용 웹서버 - 아마존의 람다 같은 서버시를 사용해서 구현, 구글 앱엔진도 가능, 간단한 인증과 로그인 데이터 저장이 가능


3. 웹서버 - 구글 앱엔진도 가능, 간단한 인증과 로그인 데이터 저장이 가능, 다양한 가능, 턴제 네트워크 정도는 가능할듯


4. 




----------------- 실시간 네트워크 게임

5. 네트워크 proxy 가 앞에 있고 서버별, 채널별, 기능별로 연결 가능한 구조

   확장성은 중간정도 성능 - 채널별 서버가 좋아 보임, 서버별은 특정 서버로 접속 못하면 유저가 게임을 할수 없고 기능별 서버도 특정 기능에 문제생기면 힘들지만 채널은 유저가 채널만 바꾸면 됌


6. 




Posted by 아기곰푸우
,

webapi

rest api



mvc

모델 뷰 컨트롤러

뷰는 razor가능



razor

cshtml 형식의 razor로 



console 그냥 console실행파일

Posted by 아기곰푸우
,

유니티 안드로이드 권한 문제


http://mentum.tistory.com/150

http://dasony.net/220873562780

Posted by 아기곰푸우
,

http://redhatround.blogspot.com/2017/01/blog-post_11.html

https://developer.android.com/docs/quality-guidelines/core-app-quality

Posted by 아기곰푸우
,

https://icsharpcode.github.io/SharpZipLib/



SharpZipLib_0860_Bin.zip



Posted by 아기곰푸우
,

http://hammerimpact.blog.me/220769879313

Posted by 아기곰푸우
,

stan's assets 과 facebook sdk 설정후 빌드시 에러


1. Unity] Suggestion: add 'tools:replace="android:icon"' to <application> element at AndroidManifest-main.xml:5:3-14:17 to override. 에러 발생

아래 웹사이트 참조후

https://forum.unity.com/threads/sudden-error-unable-to-merge-android-manifests.490096/




xmlns:tools="http://schemas.android.com/tools"  을 추가



2. CommandInvokationFailure: Unable to convert classes into dex format. 에러 발생 

검색해 보니 중복 혹은 다른 버젼을 라이브버리가 있어서 문제라는데 jar, aar 파일을 다 뒤져야 하는 상황


아래글 참조해서 

https://groups.google.com/forum/#!topic/firebase-talk/SLL2I50bDPI



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

을 설치


3. trouble writing output: Too many field references to fit in one dex file: 86568; max is 65536. 에러 발생

필요없는 플러그인 세팅 삭제

빌드 방식 수정 gradle

 

4.  add 'tools:replace="android:theme" 에러 발생

해당 facebookactivity 에 추가


5. unity Uncaught translation error: java.lang.IllegalArgumentException: already added: Landroid/support/v4/BuildConfig 에러 발생 같은 라이브러리 인듯 



com.android.support.support-v4-25.3.1.aar 가 있길래 support-v4-24.1.1.aar 지움 



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

6. facebook path 에러

https://slproweb.com/products/Win32OpenSSL.html

설치후 bin 폴더 path 설정


7. java sdk bin 폴더 path 설정



Posted by 아기곰푸우
,

C# 코딩가이드 v1.0 

가독성 우선 (코드는 대부분 문서화되어야합니다)
IDE의 자동 서식있는 스타일을 따르지 않는 한 정말 좋은 이유가없는 한 그렇게하십시오. (Visual Studio에서 Ctrl + K + D)
기존 코드에서 배우기

1 카멜 표기법

  • "camelCase"
  • "단봉낙타" 표기법
  • 각 단어의 첫문자를 대문자로 표기하고 붙여쓰되, 맨처음 문자는 소문자로 표기함
  • 띄어쓰기 대신 대문자로 단어를 구분하는 표기 방식
  • 예시: backgroundColor, typeName, iPhone

2 파스칼 표기법

  • "PascalCase"
  • 첫 단어를 대문자로 시작하는 표기법
  • 예시: BackgroundColor, TypeName, PowerPoint


참고 URL :

https://msdn.microsoft.com/en-us/library/ff926074.aspx

http://www.csharpstudy.com/Guide/coding-guide.aspx

https://docs.google.com/document/d/1ymFFTVpR4lFEkUgYNJPRJda_eLKXMB6Ok4gpNWOo4rc/edit#heading=h.w8phdtkl6qc8


*Naming Conventions 

var currentPerformanceCounterCategory = new System.Diagnostics.

    PerformanceCounterCategory();

 

- Camel, Pascal 를 유의해서 사용해야 한다.

- 한줄에 표시하기가 너무 긴 경우 .을 이용해서 몇 줄로 나누어서 처리하면 된다.

 

*Layout 규칙 

-띄어쓰기는 4칸을 사용한다.

-한줄에 하나씩만 사용한다.

-여러 괄호 식을 아래 처럼 사용해서 명확하게 구분한다.

if ((val1 > val2) && (val1 > val3))

{

    // Take appropriate action. 

}

 

*주석 규칙 

-주석은 대문자로 작성하고 글자는 80이내로 한다. 

-줄 바꿀 경우에는 추가로 //를 하면 된다.

// The following declaration creates a query. It does not run 

// the query. 

 

*C# 코딩 가이드 

-스트링 데이타 타입 

string displayName = nameList[n].LastName + ", " + nameList[n].FirstName;

글자가 길 경우에는 StringBuilder를 사용한다. 

var phrase = "lalalalalalalalalalalalalalalalalalalalalalalalalalalalalala";

var manyPhrases = new StringBuilder();

for (var i = 0; i < 10000; i++)

{

    manyPhrases.Append(phrase);

}

//Console.WriteLine("tra" + manyPhrases); 


-var 지역 변수 사용 

오른쪽 변수 형식인 명확하거나 암시적 형식을 사용해도 됩니다. 주로 로컬 변수일 경우 사용해도 됩니다. 

var var1 = "This is clearly a string.";

var var2 = 27;

var var3 = Convert.ToInt32(Console.ReadLine());

 

오른쪽 리턴값등 형식이 명확하지 않는 경우에는 var를 사용하지 않습니다.

int var4 = ExampleClass.ResultSoFar();


변수 이름에 Type을 지정하지 않습니다. 특히 var일경우 차후 변수 타입이 변경될 경우 코드 디버깅이 어려워집니다.


var inputInt = Console.ReadLine();

Console.WriteLine(inputInt);


for, foreach에서 var 사용합니다.

var syllable = "ha";

var laugh = "";

for (var i = 0; i < 10; i++)

{

    laugh += syllable;

    Console.WriteLine(laugh);

foreach (var ch in laugh)

{

    if (ch == 'h')

        Console.Write("H");

    else 

        Console.Write(ch);

}

 

Console.WriteLine();


-배열 

간경하고 단순하게 작성합니다.

string[] vowels1 = { "a""e""i""o""u" }; 

var vowels2 = new string[] { "a""e""i""o""u" };

var vowels3 = new string[5];

vowels3[0] = "a";

vowels3[1] = "e";

만약 배열 사이즈를 알고 선언한다면, 꼭 개별 배열 값에 초기화 값을 넣어주어야 합니다.

 

-Delegate(대리자)

 최대한 간결하게 해야 한다.

// 선언 

public delegate void Del(string message);

// 메소드 이름이 Delegate와 매칭(매핑)되어야 한다. 

public static void DelMethod(string str)

{

    Console.WriteLine("DelMethod argument: {0}", str);

}

// 아래 처럼 선언만 하는 것은 피한다. 

Del exampleDel2 = DelMethod;

 

// new를 해서 사용해서 Deleagte 사용할 수 있도록 하는게 좋다. 

Del exampleDel1 = new Del(DelMethod);

 

-예외 처리 (try catch)

static string GetValueFromArray(string[] array, int index)

{

    try 

    {

        return array[index];

    }

    catch (System.IndexOutOfRangeException ex)

    {

        Console.WriteLine("Index is out of range: {0}", index);

        throw;

    }

}


-New 연산자 

개체 Initialize를 이용해서 간단하게 초기화 하는게 좋다.

var instance3 = new ExampleClass { Name = "Desktop", ID = 37414,

    Location = "Redmond", Age = 2.3 };

var instance4 = new ExampleClass();

instance4.Name = "Desktop";

instance4.ID = 37414;

instance4.Location = "Redmond";

instance4.Age = 2.3;


-이벤트 처리 

나중에 제거가 필요없는 이벤트는 아래 처럼 람다를 이용해도 좋다.

// 생성자에서 바로 이벤트 등록하고 처리하는 함수를 람다식으로 등록한다. 

public Form2()

{

 

    this.Click += (s, e) =>

        {

            MessageBox.Show(

                ((MouseEventArgs)e).Location.ToString());

        };

}

위와 다르게 간단하지 않고 복잡할 경우에는 따로 이벤트 함수를 처리하는게 좋다.

// 생성자에서 이벤트를 등록만한다. 

public Form1()

{

    this.Click += new EventHandler(Form1_Click);

}

 

void Form1_Click(object sender, EventArgs e)

{

    MessageBox.Show(((MouseEventArgs)e).Location.ToString());

}


-정적 멤버 (Static)

1)ClassName.StaticMember 이러한 형식을 사용하면 됩니다.

2)만약 상속을 통해서 자식 클래스에서 부모 클래스 메소드 함수를 다시 정의하거나 하면 절대 안됩니다. 차후 디버깅 할때 어느 정적 함수인지 혼동이 오거나 차후 코드 수정때 예상하지 못한 Side Effect 가 발생할 수 있습니다.

 

-LINQ 쿼리 

쿼리 변수 이름을 아래처럼 의미가 있는 것을 사용합니다.

var seattleCustomers = from cust in customers

                       where cust.City == "Seattle" 

                       select cust.Name;

 

별칭을 사용할 경우 파스칼 타입을 합니다.(빨간색 글자)

var localDistributors =

    from customer in customers

    join distributor in distributors on customer.City equals distributor.City

    select new { Customer = customer, Distributor = distributor };

 

 

별칭 이름이 모호할 경우 아예 명확하도록 이름을 바꿉니다. (ID면 ID, 이름도 이름으로 빨간색 글자)

var localDistributors2 =

    from cust in customers

    join dist in distributors on cust.City equals dist.City

    select new { CustomerName = cust.Name, DistributorID = dist.ID };

 

LINQ 쿼리 변수는 var를 이용해서 선언합니다. 또한 코드는 from 이후 작성해서 가독성을 높입니다.

var seattleCustomers = from cust in customers

                       where cust.City == "Seattle" 

                       select cust.Name;

 

꼭 From 다음에 where를 사용해서 필터링 한후 한번 범위를 줄인 후에 쿼리가 동작하도록 해야 

가독성과 성능이 좋아집니다.

var seattleCustomers2 = from cust in customers

                        where cust.City == "Seattle" 

                        orderby cust.Name

                        select cust;

내부 여러 컬렉션을 액세스 하는 경우라면 join 대신 여러 from절을 사용한다. 아래 처럼 student 안에 scores를 또 사용해서 처리했습니다.


var scoreQuery = from student in students

                 from score in student.Scores

                 where score > 90

                 select new { Last = student.LastName, score };

 

Microsoft에서 권장하는 C# 코딩 표준에 대해서 알아 보았습니다. 위 내용을 준수해서 코드를 개발하세요.

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

C# 블럭(block)을 표현하는 { 과 } (즉, Open Brace와 Close Brace) 는 항상 라인의 처음에 위치한다.

블럭 안에 단 하나의 문장(statement) 만 있더라도 반드시 Brace를 붙인다. 예를 들어, if() 문 뒤에 한 라인의 문장(statement)만 있더라도 이를 Brace 안에 넣는다. 이는 차후 문장들을 더 추가할 경우 복수 문장들이 if 블럭 안에 쉽게 추가될 수 있게 할 뿐만 아니라, 블럭을 명확히 구분하는 역활을 해서 코드 가독성을 높이기 때문이다. if...else, for/foreach, while 등의 블럭에서 한 문장이라도 항상 Brace를 사용한다.

예제
// 좋은 표현
if (condition)
{
    Run();
}
else
{
    OtherRun();
}

// 나쁜 표현
if (condition) { //Bad: 시작 Brace는 별도의 라인에 있지 않음
    Run();
}
else OtherRun(); //Bad: Brace가 생략되었음


// 나쁜 표현
for (int i = 0; i < 100; ++i) //Bad: Brace가 생략되었음 
Run();


Bracing 스타일: 예외 규칙

Bracing 스타일의 예외 규칙으로 한 라인으로 get/set 속성을 정의하는 경우를 들 수 있다. 즉, 한 라인으로 get 혹은 set 속성을 짧게 정의하는 경우, { } 를 한 라인으로 처리한다.

예제
// OK 표현
Public string Name
{
     get { return this.name; }
     set { this.name = value; }
}


switch/case 문

case문 안에 여러 문장이 있을 경우 break 문을 제외한 문장들을 Brace로 묶으면 읽기 편리하다. 단, case 문에 하나의 문장만 있을 경우 Brace를 생략할 수 있다.

예제
// switch/case문 들여쓰기

switch (category)
{
     case 0:
        Run1();
        break;

    case 2:
    {
        int n = 1;
        Run2(n);
    }
    break;
}

C# 코딩: 탭(tab)과 들여쓰기(Indentation)

C# 소스코드에서 탭(tab)은 4개의 문자로 설정한다. 그리고 코드 상의 탭은 항상 공백(space) 문자로 치환한다 (아래 Insert Spaces 옵션). 이는 아래 그림과 같이 Visual Studio의 도구상자-옵션에서 일괄적으로 설정하면 편리하다.

만약 Tab을 Space로 일관되게 치환하지 않는다면, 에디터마다 다르게 설정된 Tab 공간으로 인해 소스코드의 블럭들이 뒤죽박죽 표현될 수 있다. 특히, 소스마다 탭을 이용한 블럭표시와 공백으로 된 블럭표시(3~4 spaces)가 혼재되어 있다면, 소스코드 가동성은 크게 저하된다.


C# 코딩: 띄어쓰기

C# 코딩에 있어 띄어쓰기의 규칙은 일반적인 영어나 수학에서의 띄어쓰기 규칙에 따른다. 적절한 띄어쓰기는 가독성을 크게 향상시킨다.

몇 가지 경우의 예를 들면:

(1) 메서드 파라미터들 사이에 공백을 준다
(2) 비교연산자 전후에 공백을 준다.

예제
// 좋은 표현 (메서드 파라미터들 사이에 공백)
Console.In.Read(name, startIndex, nCount);
// 나쁜 표현
Console.In.Read(name,startIndex,nCount);

// 좋은 표현 (비교연산자 전후에 공백)
if (actualValue < maxValue)
// 나쁜 표현
if (actualValue<maxValue)


C# 코딩: Name Casing

클래스명, 변수명, 메서드명 등과 같은 명칭을 어떤 대소문자 형식으로 표현하는가는 일관된 코드를 유지하는데 중요하다. 아래 표는 프로그래밍에서 일반적으로 사용하는 몇 가지 Casing을 요약한 것이다. 또한, C#의 각 Identifier 명칭마다 어떤 Casing을 사용하는 것이 좋은지를 설명한다.


흔히 사용되는 Casing (Identifier 명칭을 대소문자로 어떻게 표현하는가)

Casing 내용 예제
Camel Case 첫 문자는 소문자이고 계속되는 다음 단어의 첫문자는 대문자로 한다. C#에서 변수명이나 필드명에 사용된다. startIndex
Pascal Case 첫 문자와 계속되는 다음 단어의 첫문자를 모두 대문자로 한다. C#에서 클래스, 메서드명, 속성명 등에 사용된다. StartIndex
Snake Case 단어(word) 사이를 공백없이 밑줄로 연결한다. C#에서 사용하지 않는다. start_index 혹은 Start_Index
Screaming Snake Case 단어(word) 사이를 공백없이 밑줄로 연결하고, 모두 대문자로 한다. C#에서 권장되진 않지만, 상수에 쓰는 경우도 있다. START_INDEX

C#에서의 Casing Convention

클래스명, 메서드명, 속성명, 이벤트명은 Pascal Case를 사용한다.

public void Order //클래스명. Pascal Case

    public int OrderId { get; set; } //속성명. Pascal Case  
    public void PlaceOrder(int id) //메서드명. Pascal Case
    {
    }
    public event EventHandler Completed; //이벤트명. Pascal Case
}

상수가 아닌 필드명은 Camel Case를 사용한다.

class MyClass
{
    public int startIndex; //Camel Case
    public string lastName; 
}

메서드 파라미터는 Camel Case를 사용한다.

CallMethod(startIndex, endIndex);

로컬 변수명은 Camel Case를 사용한다.

public void Run() 

    int startIndex; //로컬변수. Camel Case
}

public 상수(public const)와 public 읽기전용 정적 변수(public static readonly)는 ALL_CAPS_SEPARATED_BY_UNDERSCORE 를 사용한다.

public void Order 

    public const int MAX_ORDERS = 30; 
    public static readonly TAG; 
}

Enum Value 즉 Enum element는 Pascal Case를 사용한다.

public enum OrderStatus
{
    Open,
    InDelivery
    CancelByCustomer
//...
}

C# 코딩: Naming Convention

명칭에 대한 규칙(Naming Convention)에 대해서는 .NET Framework Design Guidelines 에 자세히 정리되어 있으므로 이 책을 참조하면 좋다. 여기서는 그 중 중요한 사항들만을 요약 정리해 본다. 특히, Naming Convention에 대해 다른 프로그래밍 언어로 개발한 개발자들은 그 동안의 습관으로 인해 다른 의견을 가질 수 있다.


C#에서 Hungarian notation을 사용하지 않는다. Hungarian notation은 예전에 변수명 앞에 자료형을 나타내는 1~2 문자를 첨가했던 것인데, Intellisense의 도움의 그 의미가 많이 줄어 들었다. 변수명은 그 데이타 타입보다 변수가 담는 내용을 표현하는데 촛점을 맞춘다.

[Hungarian notation 예] bLive, szName, iVal //나쁜표현


private , protected 멤버 필드에 대해  _  접두어(prefix)를 붙인다.

bool _success;
int m_Index;


인터페이스명은 항상 I로 시작한다.

public interface IAlterable { }

Generics 클래스의 Generic 파라미터 타입은 가능하면 T와 같이 한 문자를 선택한다. (복수 타입 파라미터가 필요하면 예외)

public class MyList<TValue> //나쁜표현
public class MyList<T> //좋은표현

boolean 형의 변수/필드는 가능하면 is, has, can 등의 접두어를 붙여서 의미가 명료하게 한다.

bool bAlive //나쁜표현
bool isAlive //좋은표현

클래스명, enum명, 대리자(delegate)명에는 어떤 Prefix도 붙이지 않는다.

public enum EOrderType //나쁜 표현

클래스명, 메서드명, 속성명 등의 명칭에 축약된 단어를 사용하지 않는다.

public int GetWindow() //좋은 표현
public int GetWin() //나쁜 표현

꼭 필요하거나 널리 알려진 용어는 축약형을 사용할 수 있다. 예를 들어, UserInterface를 UI 로 축약하거나 Online Analytical Processing 을 Olap으로 축약할 수 있다.
축약형을 사용할 경우에는 2자까지는 모두 대문자로, 2자 초과인 경우는 Pascal Casing이나 Camel Casing을 사용한다.

HTMLButton //나쁜 표현
HtmlButton //좋은 표현

System.Io //나쁜 표현
System.IO //좋은 표현

메서드는 행위를 나타내므로 동사(verb)를 사용한다.

public int Addition(int a, int b) //나쁜 표현
public int Add(int a, int b) //좋은 표현

필드나 속성 혹은 로컬변수는 명사(noun)를 사용한다.

private bool createTable //나쁜 표현
private bool newTable //좋은 표현

이벤트는 가능하면 동사형으로 표현한다.

public event EventHandler Completion //나쁜 표현
public event EventHandler Completed //좋은 표현


로컬변수는 가능하면 의미있는 단어를 선택한다.

int i, j //나쁜 표현
int startIndex, endIndex //좋은 표현

조직의 계층구조를 본 따서 namespace의 계층구조를 만들지 않는다.


C# 코딩: 접미어 (suffix)

C#에서 Type을 정의할 때 불필요한 접미어 (혹은 접두어)를 붙이지 않는다. 즉, 구조체명에 중복되게 Struct를 붙이거나 enum 타입에 뒤에 Enum, Flags 등을 붙이지 않는다.

예제
// 나쁜 표현
public enum OrderTypeEnum {}

[Flags]
public enum ColorFlags {}

public struct AreaStruct {}
public interface CloneInterface {}

// 좋은 표현
public enum OrderType {}

[Flags]
public enum Color {}


public struct Area {}
public interface ICloneable {}


다음과 같은 파생클래스 타입명에는 접미어(suffix)를 붙여 준다. 이는 클래스의 기능을 이해하는데 도움을 주기 때문이다.
System.Exception 으로부터 파생된 타입에는 끝에 Exception을 붙인다.
System.Collections.ICollection 으로부터 파생된 타입에는 끝에 Collection을 붙인다.
System.EventArgs 으로부터 파생된 타입에는 끝에 EventArgs를 붙인다.
System.Delegate 로부터 파생된 타입에는 끝에 EventHandler를 붙인다.
System.Attribute 으로부터 파생된 타입에는 끝에 Attribute를 붙인다.


public class Display : Attribute //나쁜 표현
public class DisplayAttribute : Attribute //좋은 표현


다음은 C# 코딩과 관련하여 자주 문의되는 몇 가지 코딩 스타일들을 정리한 것이다.

C# 코딩: C# 데이타 타입

C#에서 데이타 타입은 built-in 타입(예: int) 혹은 CLR 타입(예: Int32)을 사용할 수 있다. C# 코드에서는 이 중 C#에 built-in 되어 있는 데이타 타입을 사용할 것을 권장한다.


int index; //좋은 표현
System.Int32 index; //나쁜표현


C# 코딩: 접근제한자(Access Modifier)

C# 클래스의 멤버(필드, 속성, 메서드 등)들에 대해 항상 접근제한자(Access Modifier)를 명시한다. 일반적으로 접근제한자를 각 멤버 정의의 첫부분에 일괄적으로 표시하는 것이 좋다.

클래스 멤버중 필드는 private으로 지정한다 (OOP). 필드를 public, internal, protected로 해야 할 경우는 속성을 사용한다.

예제
//나쁜표현
string GetName() {...} // 접근제한자 없음
static public int GetId() {...} // public을 처음에 표시할 것

//좋은표현
public static int GetId() { ... }


C# 코딩: if 조건

if 조건문에서 bool 변수가 있다면, 이를 다시 true/false와 비교하지 않는다.

if 조건문 안에서 할당(assignment)을 하지 않는다. 이는 코드 가독성을 떨어뜨린다.

예제
if (isValid == true) //나쁜표현
if (isValid) //좋은표현

// 나쁜표현
if ((a = b) == 10)

//좋은표현
a = b; 
if (a == 10)


C# 코딩: Attribute 지정

Attribute는 별도의 라인에 지정한다. 만약 복수개의 Attribute가 있는 경우는 한 라인에 하나씩 지정한다.

예제
//나쁜표현
[Authorize] public void Run()
{
}

//좋은표현
[Authorize] 
public void Run()
{
}


//나쁜표현
[Authenticate, Authorize, Testable] 
public void Run()
{
}

//좋은표현
[Authenticate]
[Authorize] 
[Testable] 
public void Run()
{
}


C# 코딩: Escape String

문자열 안에 백슬래쉬 같은 Escaped String이 있는 경우, C#의 @ 을 사용한다.

예제
//나쁜표현
string path = "C:\\Temp\\test.txt";

//좋은표현
string path = @"C:\Temp\test.txt";


C# 코딩: 문자열 병합

문자열 병합(concatenation)을 위해서는 + 연산자를 사용하지 말고, StringBuilder나 String.Format()을 사용한다.

예제
//나쁜표현
var res = s1 + "+" + s2 + "=" + s3;

//좋은표현
var res = string.Format("{0}+{1}={2}", s1, s2, s3)


C# 코딩: Exception

Exception을 rethrow 하기 위해서는 원래의 exception 스택을 보존하기 위해 throw; 를 사용한다.

예제
//나쁜표현
catch (Exception ex)
{
    Log(ex);
    throw ex;
}

//좋은표현
catch (Exception ex)
{
    Log(ex);
    throw;
}


C# 코딩: using

IDisposable을 사용하는 클래스 객체는 C#의 using 블럭을 사용하여 자동으로 Dispose() 메서드가 호출되게 한다. using 은 블럭 내에서 Exception이 발생하더라도 항상 Dispose()를 호출하게 된다.

예제
//나쁜표현
var cn = new SqlConnection();
//...
cn.Close();

//좋은표현
using (var cn = new SqlConnection())
{
//...
}


공개함수는 "Internal" 을 뒤에 붙인다.

Private uint GetAgeInternal()
{
// function implementation...
}



boolean 변수에는 접두어 b 혹은 is 를 붙인다.
bool bFired; // for local variable
Private bool _bFired; // for private class member variable
Public bool IsFired { get; private set; }



새 줄에 항상 여는 중괄호 ({)를 넣으십시오.


범위에 단 한 줄이라도 중괄호를 추가하십시오.
if (bSomething)
{
 return;
}


switch 문에는 항상 default가 있어야합니다.
switch (number)
{
 case 0:
   ... 
   break;
 default:
   break;


case 문에 코드가없는 경우를 제외하고는 switch case에 대한 //fallthrough 설명을 추가하십시오.

switch (number)
{
 case 0:
   DoSomething();
   //fallthrough
 case 1:
   DoFallthrough();
   break;
 case 2:
 case 3:
   DoNotFallthrough();
 default:
   break;
}


switch case에서 기본 케이스가 발생하지 않아야하는 경우에는 항상 Assert (false)를 추가하십시오. assert 구현에서는 릴리스 빌드에 대한 최적화 힌트가 추가됩니다.
switch (type)
{
 case 1:
   ... 
   break;
 Default:
   Debug.Fail("unknown type");
   break;
}


재귀함수의 이름에는 "Recursive"을 붙입니다.
void FibonacciRecursive();


클래스 변수와 메소드의 순서는 다음과 같아야합니다.

public variables

internal variables

protected variables

private variables

public methods

Internal methods

protected methods

private methods

 

함수 오버로딩은 대부분의 경우 피해야합니다.
Use:
Anim GetAnimByIndex(int index);
Anim GetAnimByName(string name);

Instead of:
Anim GetAnim(int index);
Anim GetAnim(string name);

여러 개의 작은 클래스를 그룹화하지 않는 한, 각 클래스는 별도의 소스 파일에 있어야합니다.

파일 이름은 대문자와 소문자를 포함한 클래스의 이름과 동일해야합니다.
class Anim {}

Anim.cs

Use assert for any assertion you have. Assert is not recoverable. (e.g, most function will have Debug.Assert( not null parameters ) )

비트 플래그 열거 형의 이름은 Flags로 끝나야합니다. 
public enum VisibilityFlags
{
}

기본 매개변수보다는 함수 오버로딩을 사용합니다.

기본 매개 변수가 사용되면 null, false 또는 0과 같은 자연스러운 상수로 제한하십시오

가려지는 변수는 허용되지 않습니다.
public class SomeClass
{
 public int Count {get;set;}
 public void Func(int Count)
 {
   for (int count = 0; count != 10; ++count)
   {
     // Use Count
   }
 }
}

System.Collections.Generic의 컨테이너는 항상 System.Collections의 컨테이너보다 먼저 사용하십시오. 순수 배열을 사용하는 것도 좋습니다.


실제 유형을 var 이상으로 사용하는 것을 선호합니다. 사용 가능한 var 사용에는 열거자가 포함됩니다.

async void 대신 async Task 을 사용하십시오. async void가 허용되는 유일한 위치는 이벤트 핸들러입니다.

경계에서 외부 데이터의 유효성을 검사하고 데이터를 함수에 전달하기 전에 반환하십시오. 즉,이 시점 이후에 모든 데이터가 유효하다고 가정합니다.


따라서 우리 함수 내부에서 예외를 던지지 마십시오. 이것은 경계에서만 처리되어야합니다.

함수, 특히 공용 매개 변수에서 null 매개 변수를 허용하지 않는 것이 좋습니다.

null 매개 변수가 사용되고 OrNull로 매개 변수 이름 뒤에 붙는 경우

어떤 함수, 특히 공개 함수에서 null을 반환하지 않기를 바랍니다. 그러나 예외를 throw하지 않도록이 작업을 수행해야하는 경우가 있습니다.


임의의 함수로부터 null가 돌려 주어 졌을 경우  함수 이름 뒤에 OrNull 접미사.

public String GetNameOrNull ();


객체 이니셜 라이저를 사용하지 마십시오. 대신 명명 된 매개 변수와 함께 명시 적 생성자를 사용하십시오. 두 가지 예외.

오브젝트가 한 곳에서만 작성된 경우. (예를 들어, 1회성 DTO)

객체가 소유 클래스의 정적 메서드 내에서 만들어 질 때 (예 : factory pattern)



Posted by 아기곰푸우
,

젠키스 설치후 unity plug in 설치

unity plug in 설치후 세팅은

Global Tool Configuration 여기에서 unity 버젼 추가할것


젠키스 위도우 서비스 계정은 로그인한 계정과 일치시킬것


Invoke Unity3d Editor 에서

Editor command line arguments 설정은 아래와 같이 할것

-logFile "$WORKSPACE/unity3d_editor.log" -quit -batchMode -executeMethod ProjectBuilder.PerformAndroidBuild



-logFile "$WORKSPACE/unity3d_editor.log"  빌드시 유니티 로그 출력을  함


빌드후 조치

archive the artifacts 에 **/*.apk 추가


unity 에 안드로이드 sdk,jdk 설정이 필요


페이스북 플러그을 위해   윈도우즈 path 에 openssl/bin 설정이 필요


Posted by 아기곰푸우
,