게임 개발이 처음이어도 쉽게 배우는 모바일 게임 개발 3주차
1.Hierarachy(하이어라키)에 있는 Prefeb 수정시 변경방법

Assset에 있는 Prefeb을 월드에 올려놓고 테스트 및 수정시 변경하는 방법이 Override를 이용해서 Asset에 등록된 Prefeb의 내용을 현재 월드에서 변경한 내용으로 덮어 쓸 수 있다.

 

2.Rigidbody와 Collider

Rigidbody  GameObject 가 물리 제어로 동작하게 합니다. 리지드바디는 힘과 토크를 받아 오브젝트가 사실적으로 움직이도록 해줍니다. 리지드바디가 포함된 모든 게임 오브젝트는 중력의 영향을 받아야 하며 스크립팅을 통해 가해진 힘으로 움직이거나 NVIDIA PhysX 물리 엔진을 통해 다른 오브젝트와 상호 작용해야 합니다.- Unity 메뉴얼 출처

 

콜라이더(Collider) 컴포넌트는 물리 충돌 처리를 위한 오브젝트의 형태를 정의합니다. 콜라이더는 보이지 않는 요소이므로 오브젝트의 메시와 정확히 동일한 모양일 필요는 없으며, 실제로는 게임플레이 시에는 대략적인 근사치로도 크게 구분되지 않으며 더 효율적입니다. - - Unity 메뉴얼 출처

 

정리 : Rigidbody 컴포넌트는 GameObject에 물리를 적용 시킨다.

Collider는 물리충돌 처리의 유무 및 충돌처리의 범위를 제어하는데 사용하는 컴포넌트이다.

*충돌 시키고 싶은 오브젝트는 전부 Rigidbody 가 필요하고 Collider는 충돌시 특정코드를 동작 시키는 곳에만 필요하다.

 

3.Rigidbody 컴포넌트의 물리엔진 사용 X

Kinematic : 충돌시 특정 동작을 하고싶지만 물리현상을 적용시키지 않을때 사용된다. 하지만 옵션을 키면 물리영향을 빋지 않기에 OnTrigger 함수를 사용하여 코드를 작성하여아한다. (Collider의  is Trigger를 체크해야만 Kinematic에서 충돌처리가 작동한다)

 

4.UnityPackage 파일을 Assets - Resources에 Import 시키고 싶을때

디자이너나 Assest Store에서 받은 Package 파일을 드래그 앤 드랍으로 쉽게 Import 할 수 있다.

 

★★★ 5.RectTransform의 Anchor,Pivot (매우 중요 :: UI 위치 및 크기 설정에 필수로 들어가는 내용)

Canvas 오브젝트화면 해상도에 따라 크기가 조정된다.
간단히 정리하면 이미지는 Anchor를 기준으로 Pivot이 결정된다.

 

600 * 800 해상도에 좌측,상단으로부터 100씩 거리가 떨어져있는 이미지를 800*600 해상도로 변경해도 위치나 크기가 변경되지 않는다.

 

 

RectTransform 에서 나타내는 좌표 및 거리값  [앵커와 피봇의 거리를 나타낸다].

Pivot은 이미지의 중심점으로 피봇의 좌표는 0,0(좌측하단) - 1,1(우측상단)로 정해져있다.

 

노란색Anchor의 위치 , 파란색 점Pivot의 위치 , 하얀박스 이미지의 크기 를나타낸다.

 

Alt를 누른채 클릭하면 Rect Transform까지 동시에 변하고(이미지를 해상도에 맞춰 변경),
Shift를 누른채 클릭하면 Pivot이 동시에 변하고,
Shift + Alt를 누른채 클릭하면 Rect Transform과 Pivot이 동시에 변합니다.

 


Strectch를 쓰면 앵커가 분리되어 Rect Transform의 좌표Left top right bottom으로 표기가 변경된다.

(Pivot이 아닌 이미지와 앵커의 거리 를 나타냄)

 

Pivot 위치에 따른 Scale 값 변경시 바뀌는 모습으로 Pivot 설정의 중요성을 보여준다.


6.Slider 오브젝트를 안쓰고 HP 만들기 테크닉

  //Cat 오브젝트에 Food라는 오브젝트가 충돌 될때마다
  //energy가 회복되는 코드
  
  private void OnTriggerEnter2D(Collider2D collision)
  {
      if(collision.gameObject.CompareTag("Food"))
      {
          if(energy < full)
          {
              energy += 1.0f;
              
               //front(이미지 오브젝트)
               //Scale 값을 수정하여 빨간색 게이지가 차오르게 설계
              front.localScale = new Vector3(energy / full, 1.0f, 1.0f);
              Destroy(collision.gameObject);

          }          
      }
  }



2주차

 

1.게임 화면에 있는 마우스 좌표값 반환 받기

 //화면 좌표를 게임 월드 내의 실제 위치로 변환
 //매개변수로 현재 마우스 위치 좌표값을 주면 화면좌표 -> 월드좌표로 전환해주는 동작을 한다.
 Vector2 mousePos = Camera.main.ScreenToWorldPoint(Input.mousePosition);

 transform.position = mousePos; ;

해당 메서드는 메인카메라에 포함되어있는 기능이고 Camera.main.ScreenToWorldPoint(구하고싶은 월드좌표)이며

화면에 있는 좌표를 Unity 속 월드 좌표로 바꿔주는 기능이다.

 

즉, 이 코드를 통해 현재 화면 위에있는 마우스 위치게임내 월드좌표로 변환하여 오브젝트를 마우스에 따라디니게 할수 있다.

 

p.s

        //ScreenToViewPoint
        //2D화면 좌표를 View포트 좌표로 변환하는기능 , View 포트는 우리가 실제로 보는 화면(카메라)화면을 나타냄 
        //view 포트에 대한 설명 TIL로 정리할것 -> 컴퓨터 그래픽스 내용 복습 필요

추가 내용으로 ViewPort라는 것이있는데 스크린좌표(화면)을 정규화(Normalize)한 좌표계이다.

뷰포트 좌표계정규화 때문에 화면 해상도에 상관없이 동일한 좌표를 얻을 수 있다.

뷰포트 좌표계는 화면 안에 특정 객체가 있는지 없는지를 구분할 때 사용하면 좋다.

ViewPort

 

게임 개발이 처음이어도 쉽게 배우는 모바일 게임 개발 1주차

 

0.Singleton(싱글톤) 디자인 패턴

싱글톤이란 , 해당 프로젝트에서 단 하나의 클래스로만 존재해야 되며 외부에서 호출시 어디든지 호출 할 수 있게 하는 디자인 패턴을 뜻한다. 

 

이렇게만 보면 싱글톤이 장점만 있는것 같지만 단점으로 남발하게 되면 각 스크립트끼리 커플링될 확률이 높아 남발이 되면 안된다.

public class GameManager : MonoBehaviour
{
  private static GameManager instance; //정적변수

  public static GameManager Instance //프로퍼티 선언
  {
      get
      {
          if (instance == null)
          {
              instance = FindObjectOfType<GameManager>();

              if (instance == null)
              {
                  GameObject obj = new GameObject();
                  obj.name = typeof(GameManager).Name;
                  instance = obj.AddComponent<GameManager>();
              }

              DontDestroyOnLoad(instance);
          }

          return instance;
      }
  }
  private void Awake()
  {
      if(instance != null && instance != this)
      {
          Destroy(gameObject);
      }
      else
      {
          instance = this;
          DontDestroyOnLoad(instance);
      }
  }
}

강의 내용하곤 다른 싱글톤 패턴이지만 복습할겸 다시 작성해보았다.

개인으로 개발할때 자주 사용했던 싱글톤 구조이다. 나중에 generic으로 사용하도록 변경해야한다.

 

1.기기에 따른 게임 성능 차이 대처법

* frame(프레임)은 1초에 연산되는 횟수를 의미, 즉 60프레임 : 1초에 60번 연산(화면출력 등등)이 일어난다.

하지만 이 프레임은 기기마다 다르기 때문에 게임 진행시에 기기가 좋을수록 그 사람이 유리 할 수 박에 없다.

 Application.targetFrameRate = 60;//해당 기기의 프레임을 60으로 고정시켜주는 코드

해당 코드를 사용하여 모든 기기에서 전부 60프레임으로 고정시킬 수 있다.

 

또한 시간과 관련된 변수를 제어할때는 

 if (tatalTime > 0f)
 {
     tatalTime -= Time.deltaTime;
 }
 else
 {
     tatalTime = 0f;
     EndPanel.SetActive(true);
     Time.timeScale = 0f;
 }

 totalTimeTxt.text = tatalTime.ToString("N2");//소수점 둘째자리만 표시하는 변수

Time.deltatime 메서드를 이용하여 경과된 시간을 받아와 시간값도 다른 기기에서도 같은 값을 가져올 수 있게 할 수 있다.

 

2.간단한 오브젝트 생성 반복 로직 만들기

========Game Manager class================
[SerializeField] GameObject rain;//inspector 프리팹(게임오브젝트)를 넣을 변수

 void Start()
  {
	InvokeRepeating("MakeRain",0f,1f);
  }
  
   void MakeRain()
 {
     Instantiate(rain);
 }

InvokeRepeating(호출할 함수 이름 , n초후에 함수 시작,  함수 동작 주기)

해당 함수는 동작시 호출한 함수n초후에 동작하며  함수 동작 주기마다 반복하는 함수이다.

반복을 안하고 일정 타이밍에 동작tl키고 싶으면 Invoke( 호출할 함수 이름 , n초후에 함수 시작)로 사용하면된다.

 

3.랜덤 난수 받아오기

 float x = Random.Range(-2.4f, 2.4f);

Random.Range(최소값,최대값) 해당 함수를 사용하면 최소값 이상 최대값 미만의 수에서 하나의 숫자를 return하는 함수이면 Seed값에 따라 return 되는 값이 다르다.

 

4.SpriteReneder 에 코드로 접근하여 색상값 변경하기.

public SpriteRenderer spriterenderer; // Inspector에서 SpriteReneder 등록 필수
 spriterenderer = GetComponent<SpriteRenderer>();//해당 오브젝트의 SpriteRenderer 컴포넌트 호출
 
  spriterenderer.color = new Color(100 / 255f, 100 / 255f, 1f, 1f); //해당 색상변경

해당 오브젝트에 등록된 SpriteRenderer 컴포넌트를 호출하여 색상을 변경하는 코드다.

각 color의 멤버변수는 (r , g , b , a)로 a는 alpha값(투명도)를 나타낸다.

-.color 값 멤버변수는 float값이므로 색을 지정할떄 255f를 각 색상값을 나눗셈을 하여 사용하게된다.

ex) 파란색으로 색상을 변경하고 싶음 ->  new Color(100 / 255f, 100 / 255f, 1f, 1f);

 

5.Unity 화면 해상도 초기 설정

Game 화면에서 (+) 버튼을 눌러 새로 해상도를 설정 할 수 있다.

 

6.Unity_ UI Button에서 On Click event 설정

Inspector에서 본 Button 컴포넌트 구조
Retry Button Script를 컴포넌트로 추가하고 Button 컴포넌트에서 OnClick() 동작시 동작하게 할 Event 설정 (아직 어떤 동작을 하지는 설정 안한 모습)
Retry Button의 Retry() 함수 호출을 설정하는 모습

해당 동작으로 간단하게 UI Button의 클릭시 동작 조건을 추가할 수 있다.



Unity 퀘스트 달리기 반

 

2. 배열을 사용한 합계 및 평균 계산

int[] arr = { 10, 20, 30, 40, 50 };
int sum = 0;
int avg = 0;

for(int i =0; i < arr.Length; i++)
{
    sum += arr[i];
}

avg = sum / arr.Length;

Console.WriteLine("Sum: " + sum);
Console.WriteLine("Average:: " + avg);

 

4.숫자 맞추기 게임

Random rand = new Random(); //난수 생성 변수 초기화
int answer = rand.Next(1, 101); // 1 - 100 의 숫자를 랜덤으로 초기화
int num = 0;

do
{
    Console.Write("Enter your guess (1 - 100) : ");
    string input = Console.ReadLine();

    int.TryParse(input, out num);

    if (answer > num)
    {
        Console.WriteLine("Too low! Try again. ");
    }
    else if (answer < num)
    {
        Console.WriteLine("Too high! Try again.");
    }
    else
    {
        Console.WriteLine("Congratulations! You guessed the number.");
        return;
    }

} while (answer != num);

 

5.이중 반복문을 사용한 구구단 출력

int[] arr = { 2, 3, 4, 5, 6, 7, 8, 9 };

void print(int a , int b)
{
    Console.Write(a + " x " + b + " = " + a*b);
}

void sort_string(int num)//문자열 정렬 함수
{
    if (num >= 10)//곱 결과그 두자릿수면 4칸 띄움
    {
        Console.Write("    "); 
    }
    else // 곱결과가 한자릿수면 5칸 띄움
    { 
        Console.Write("     "); 
    }
}

//세로 출력
    for (int j = 1; j < 10; j++)
    {
        for (int i = 0; i < arr.Length; i++)
        {
            print(arr[i], j);
            sort_string(arr[i] * j);
        }
    Console.WriteLine("");
    }

Console.WriteLine("");
Console.WriteLine("");

//가로 출력
for (int i = 0; i < arr.Length; i++)
{
    for (int j = 1; j < 10; j++)
    {
        print(arr[i], j);
        sort_string(arr[i] * j);
    }
    Console.WriteLine("");
}

 

6. 배열 요소의 최대값과 최소값 찾기

int[] arr = { 20, 10, 40, 100, 30 };

int min = arr[0];
int max = arr[0];

for(int i =0; i < arr.Length; i++)
{
    if (arr[i] < min)
    {
        min = arr[i];
    }

    if (arr[i] > max)
    {
        max = arr[i];
    }
}

Console.WriteLine("Min Num : " + min);
Console.WriteLine("Max Num : " + max);
  1. 내일배움캠프 Unity 트랙에 참여한 계기는 무엇인가요?
    • 혼자서 독학하면 느낀 협업 프로젝트 경험이 적어서 신청하였습니다.
    • 참여하면서 협업 툴인 git,github 을 자세하게 익혔으면 좋겠습니다.
  2. 본 코스 수료 후, 어떤 게임 개발자로 성장하고 싶나요?
    • 어떤 장르에 속하지 않고 , 기획자가 제안하면 구현 할 수 있는 능력과 더 재미있게 만들 수 있을것 같으면
      오히려 내가 제안을 하는 게임개발자(클라이언트 프로그래머)가 되고싶습니다.
  3. 그 외에 Untiy 트랙에 기대하는 것이 있다면 자유롭게 작성해 주세요.
    • 협업 프로젝트 경험을 많이 쌓고 싶고 , 현업 및 실무에서 어떤 기술들을 익히면 좋은지를 배우고 싶습니다.

 

Unity 퀘스트 달리기 반

1.홀수 출력

 bool odd_Check(int num)
{
    if (num % 2 != 0)
    {
        return true;
    }

    return false;
}

//for문 사용
Console.WriteLine("for문 사용");
for (int i = 1; i <= 100; i++)
{ 
    if (odd_Check(i))
    {
        Console.WriteLine(i);
    }
}
Console.WriteLine("");

//while 문 사용
Console.WriteLine("while문 사용");
int num = 1;
while (num <= 100)
{
    //for문 사용
    if (odd_Check(num))
    {
        Console.WriteLine(num);
    }
    num++;
}
Console.WriteLine("");

//do-while 문 사용
Console.WriteLine("do -while문 사용");
num = 1;
do
{
    if (odd_Check(num))
    {
        Console.WriteLine(num);
    }
    num++; ;
} while(num <= 100);

3.팩토리얼 계산

Console.Write("Enter a number : ");
string input = Console.ReadLine();
int num = 0;
int result = 1;

int.TryParse(input,out num);

if(num <= 0)
{
    Console.Write("0 이하의 숫자가 감지되었습니다.");
    return;
}

for (int i = 1; i <= num; i++) result *= i;


Console.WriteLine("Factorial of " + num + " is " + result);

+ Recent posts