C# 공부가 지루하던 찰나 곧 2D 게임을 만들건데 그 때 사용할 캐릭터를 도트로 찍을 겸 머리도 식힐겸 스팀에서 판매하는 국룰 도트 프로그램인 aseprite를 구매하고 설치하여 가볍게 기초 강좌를 듣고 그리고 싶은대로 그려봤다.

 

새 파일을 열자말자 아무 지식 없이 처음으로 그린 도트 캐릭터이다. 지금보니 누군가에게 핵펀치로 눈을 맞은 것 같아 보인다.

그렇지만 나는 이 캐릭터에 나름 만족하고 도트강좌의 첫 영상을 시청했다. 그리고 영상에서의 팁을 이용해 처음 만든 캐릭터를 수정해보았다.

 

 

와! 정말 귀엽다. 저 위에 이상한 괴생명체와는 너무나도 비교된다. 이렇게까지 교육을 받고 안받고 차이가 날 줄은 몰랐다. 나는 교육을 안받으면 엉망진창이지만 교육만 받는다면 습득력이 좋은 인재...?

첫 번째 캐릭터와 두 번째 캐릭터의 차이점은 크게 보면 테두리 색, 명암이라는 것을 알 수 있다. 

먼저, 테두리색은 캐릭터 색 계열의 어두운 색(현재 색에서 아래로 쭉 내려가기)으로 처리하는 것이 자연스럽다.

그리고 명암은 현재 캐릭터 색에서 명도와 채도를 둘 다 조금씩 바꾼 색(대각선 오른쪽 방향으로 아주 조금 내려가기)으로 처리하면 된다.

또 다른 팁이 있었는데, 원색(RGBK)을 피하라는 것이다. 원색을 사용하면 캐릭터가 되게 투박해진다고 한다.

영상에서 팔레트를 추천해주었는데 해외 도트 유튜버인 MortMort님의 SoftMilk 32색을 추천해주었다. 파스텔톤으로 이 팔레트를 이용해 배경을 만들면 정말 이쁘다.

 

이후에 주제를 공룡으로 정해 친구와 함께 한번 그려보았다. 먼저 내 도트 그림이다.

 

 

음... 도트로 그리는 솜씨가 연필이나 붓을 가지고 손으로 그리는 솜씨와 많이 유사한 것 같다. 그 다음은 친구의 그림이다.

 

 

잘그렸다. 첫 번째 그림은 얼굴만 그렸지만 되게 리얼한 것 같다.

 

이렇게 도트 입문을 해보았다. C#공부와 도트공부를 이렇게 밸런스 맞추며 한다면 지루함은 줄어들 것이고 흥미는 더 증가 할 것이라고 생각한다.

 


내일은 금요일 다음으로 시간적 여유가 많은 화요일이다. (사실 내일이 아니고 오늘이긴함)

아마 수업을 다 들은 후 수학공부(선형대수, 미분적분학)을 저녁 먹기전까지 하고 저녁 먹고 조금의 휴식을 가진 후 다시 C#과 도트 공부를 하지 않을까 싶다.

'game > design' 카테고리의 다른 글

시점 뷰와 애니메이션  (0) 2022.04.07
int[] exp = {50, 100, 150, 200, 250};
int[] exp2;

 

이렇게 배열을 선언해 줄 수 있다. 배열은 비슷한 성격을 가진 변수들의 집합체이다. 

배열의 값을 참조하고 싶을 때에는 

 

print(exp[0]); //50 (0부터 카운팅하므로)

 

배열의 값을 참조하고 싶을 때에는 위와 같이 하면 된다. (파이썬 공부할 때 배웠던 내용과 동일함)

배열의 원소 개수를 알고 싶을 때 파이썬에서는 len함수를 이용했겠지만 C#에서는 exp.Length를 통해 알 수 있다.

 

int [] array = new int[10];

 

이렇게 하는 것은 배열의 크기(원소의 개수)만 지정해주는 것이다. 

 

방금까지 한 것은 1차원 배열이다.

2차원 배열은 다음과 같이 나타낼 수 있다. (그 이상의 배열들의 형식은 2차원 배열이 생성되는 형식과 유사하다)

 

int[,] array2 = { {1, 2, 3, 4, 5} , {10, 20, 30, 40, 50} };
print(array2[1,3]);

 

코드를 실행해보면 print의 값이 40으로 나오는 것을 알 수 있다. array2[1,3]는 두 배열중 인덱스 1에 해당하는 배열에서의 인덱스 3의 값을 의미한다.

 

그런데 배열은 한번 생성되면 배열의 크기가 고정되어 원소를 늘리거나 줄일 수 없다.

이러한 단점을 극복하는 것이 컬렉션(리스트, 큐, 스텍, 해시테이블, 딕셔너리, 어레이리스트)이다.

 

//ArrayList
ArrayList arrayList = new ArrayList();
arrayList.Add(1); //arrayList에 1이라는 원소를 추가함
arrayList.Add("가나다라");

print(arrayList.Count); //arrayList에서는 length가 없고, Count가 그 기능을 해줌
arrayList[0] = 3; //배열과 사용법은 같음
arrayList.Remove("가나다라"); //직접 지움
arrayList.RemoveAt(0); //인덱스를 통해 지움

 

ArrayList는 누군가가 이미 만들어 놓은 class이다. 점(.)을 찍으면 Add나 Remove같은 메소드를 이용할 수 있다.

 

//List
List<int> list = new List<int>(); //ArrayList와 달리 특정한 자료형만을 원소로 가짐

 

ArrayList는 자료형 상관없이 원소를 가지지만 List는 특정한 자료형을 지정하고, 그 자료형만을 원소로 가진다. 단순히 생각하면 범위가 넓은 ArrayList를 항상 쓰면 더 편하고 좋겠다고 생각되겠지만 범위가 넓은만큼 값이 들어올 때 마다 넓은 Box를 만들고 들어올 때, 나갈 때마다 더 많은 연산이 필요해진다. 즉, 비효율 적인 것이다. 그래서 List보다 더 연산량이 많을 것이고 과부하에 걸리기 쉽다. 

 

//HashTable
HashTable hashTable = new HashTable();
hashTable.Add("만", 10000); //(key, value) 입력
hashTable.Add("백만", 1000000);

print(hashTable["만"]); //인덱스 대신 key로 value를 호출한다

//Dictionary
Dictionary<string, int> dictionary = new Dictionary<string, int>(); //key(string), value(int)

 

HashTable과 Dictionary의 관계는 ArrayList와 List의 관계와 동일하다고 보면 된다.

 

//Queue
Queue<int> queue = new Queue<int>();
queue.Enqueue(5); //원소 5를 넣음
queue.Enqueue(6); //원소 6을 넣음
queue.Dequeue(); //가장 먼저 들어간 원소를 꺼냄
queue.Dequeue(); //두 번째로 들어간 원소를 꺼냄​

 

이 상태에서 queue.Dequeue();를 한번 더 실행하게 된다면 오류가 뜰 것이다. 왜냐면 이미 들어간 총 두개의 원소가 이전에 다 꺼내졌기 때문에 더이상 꺼낼 원소가 없기 때문이다. 그렇기 때문에 queue.Dequeue는 queue.Count!=0일 때에만 실행될 수 있도록 if문과 함께 쓰이는 것이 좋다.

queue는 선입전출이라하고 반대로 후입전출이라고 불리는 stack도 있다.

stack은 queue와 반대로 가장 마지막에 넣었던 원소를 꺼낸다.

 

Stack<int> stack = new Stack<int>();
stack.Push(1); //stack에 1을 넣어줌
stack.Push(2);
stack.Push(3);
stack.pop(); //3을 꺼냄

'game > unity(C#)' 카테고리의 다른 글

2D 기초 - 1 (Component, Animation)  (0) 2022.07.12
Visual Studio Code 자동 완성이 되지 않는 오류  (0) 2022.07.12
0401) C# 기초 - 2  (0) 2022.04.01
0331) C# 기초 - 1  (0) 2022.03.31
메모장  (0) 2022.03.30
  • 변수 이름을 지을 때 intValue 처럼 길어지면 첫글자는 소문자로 쓰고, 중간 단어 첫글자는 대문자로 쓰도록 한다.
  • 함수의 첫글자는 대문자로 쓰도록 하자.

다음과 같이 말이다.

 

public class NewBehaviourScript : MonoBehaviour
{
int intValue;
float floatValue = 10.5f;
float floatValue2 = 20.5f;

void FloatToInt(float _parameter, float _parameter2, string _stringParm = "디폴트값") //함수 생성
{
    intValue=(int)(_parameter+_parameter2);
    print(intValue);
    print(_stringParm);
}

void Start()
{
	FloatToInt(floatValue, floatValue2);
}
}

 

public class에서 지정한 변수들은 함수안에서도 사용 가능하다.(전역변수이므로) 

먼저 함수를 만들어주고 void Start() 안에 함수를 적어주고 이 C# 스크립트를 main camera에 넣어주고 실행시키면 콘솔창에 문제 없이 print됨을 볼 수 있다.

void는 함수의 반환 값이 없을 때 사용한다. 반환 값이 있을 때에는 void대신 반환 값의 형태(int, float 등)를 적어주면 된다.

함수 내에서 다른 함수도 호출시킬 수 있다!

 


public class Test1
{
    private int a;
    public int b;
    public static int c; //공공의 공유자원, 정적 변수
}
public class NewBehaviourScript : MonoBehaviour
{
    Test1 a1;
    Test2 a2;
    
    void Abc()
    {
        a1.b = 5;
        a2.b = 10;
        print(a1.b);
        print(a2.b);
        
        Test1.c = 100; //공유자원은 클래스 자체에 접근
        print(Test1.c);
    }
    void Start() {
        Abc();
    }
}

 

이렇게 private으로 변수를 만들면 다른 class에서는 사용하지 못한다. 하지만 public으로 지정하면 다른 class에서도 사용이 가능하다. 물론 함수도 똑같이 적용된다.

그런데 이런 생각이 들 수 있다. 'public과 private을 왜 굳이 나눠야할까?'

public은 다른 곳에서도 쉽게 접근이 가능하다. 그러므로 보안적인 측면에서 좋지 못할 수 있다. 위의 b가 노출이 되어 제 3자에게 코드를 분석 당할 수 있으니까 말이다.

 

그런데 위 코드를 실행시켜보면 NullReferenceException이라는 오류가 뜨는 것을 확인할 수 있다. 이는 변수에 값이 아무것도 대입되지 않았다는 뜻이다. 

Test1 a1;은 선언만 한것이다. 그래서  Test1 a1 = new Test1(); 이렇게 새롭게 할당을 해주도록 수정해야 한다. 

 

c는 공유자원이므로 a1, a2모두 c의 값으로 100을 가지지만, b는 각각 다른 값을 가지는 것을 알 수 있다.

아직 이 부분이 헷갈리긴 한데, 여러번 실습 하다보면 익숙해지고 완벽하게 이해가 될 것이라고 생각한다.

 


print(a++) vs print(++a)

a++ : 먼저 출력을 한 뒤에 a에 1을 더한다.

 

++a : 출력하기전에 a에 1을 더하고 그 값을 출력한다. 


 

int input = 11;
int num = 10;

switch (input) //조건문
{
    case 10:
        print("input의 값이 10입니다.");
        break;

    case 11:
        print("input의 값이 11입니다.");
        break;
        
    default:
    	print("그 외의 경우");
        break;
}

 

switch case 조건문 다음에는 반드시 break를 써줘야한다. default는 위 케이스에 걸리지 않은 모든 경우에 해당한다.(마치 else와 같은)

 

 

int temp = input == num ? 50 : 100; //삼항 연산자

 

이 코드는 input과 num이 같을 경우에는 temp에 50을, 같지 않을 경우에는 100을 넣어준다는 뜻이다. 이를 삼항 연산자라고 부른다.

 


 

반복문 중 처음 알게된 반복문이 있는데 그것이 foreach문이다.

string text = "가나다라마";

foreach(char a in text)
{
	print(a);
}

 

이는 문자열을 한글자씩 쪼개준다. 즉 코드를 실행시키면 가, 나, 다, 라, 마가 한글자씩 출력될 것이다.

 


 

아 ~ 힘들다. 별로 한건 없는데 피곤하다. 그렇지만 아직까지는 공부에 대한 열정을 잃지 않았다!

오늘은 조금 길게 게임을 기획하고 아이디어를 내는 시간을 가졌다. 되게 마음에 드는 컨셉이 떠올랐고, 정말로 만들고 싶은 게임이 생겼다.

얼릉 실력을 키워서 정말 나만의 게임을 개발해봐야겠다.

그러기 위해선

달려~~~

'game > unity(C#)' 카테고리의 다른 글

Visual Studio Code 자동 완성이 되지 않는 오류  (0) 2022.07.12
0404) C# 기초 - 3  (0) 2022.04.04
0331) C# 기초 - 1  (0) 2022.03.31
메모장  (0) 2022.03.30
0326(기초 강좌 final)  (0) 2022.03.28

+ Recent posts