STIKA

내일배움캠프 Unity 5일차 TIL - 3주차 본문

프로그래밍/Unity + C#

내일배움캠프 Unity 5일차 TIL - 3주차

STIKA 2023. 12. 28. 12:23

23.12.28 Thu

 

❤️ TIL

Today I Learned

❤️하루에 1%씩만 나아가도 4개월 동안 쌓이면 꽤 덩치가 커진답니다 :)


📌 오늘의 계획

  • 3주차 강의 끝내기

 

✏️ 작업 내용

 

메인 카메라 바꾸는 방법

FFF0B2 Background 색이 바뀜

Size 5 → 25

(조금 더 멀리서 보겠다는 의미)

 

 

StartScene 만들기

어떤 동작으로 MainScene으로 넘어가게 만들기

  public void GameStart()
  {
      SceneManager.LoadScene("MainScene");
  }

StartScene   UI   image   image 입히기   button component 만들기   script 만들기   button 과 script 연결

Game Start 함수 만들기

button의 onClick에 button드래그, script의 GameStart함수 연결

 

 

Food 만들 때 sprite에 우클릭해서 knob으로 바꿔주기

 

 

public GameObject square;
void Start()
{
    InvokeRepeating("makeSquare", 0.0f, 0.5f);
}

void makeSquare()
{
    Instantiate(square);
}

Instantiate() 프리팹을 복제하기

InvokeRepeating("makeSquare", 0.0f, 0.5f)

 makeSquare함수를 0.5초마다 호출

 

 

Instantiate(food, new Vector3(x,y,0), Quaternion.identity);

지금은 그냥 복제가 아니라 위치를 받고 그 위치에서 복제해야함

Instantiate에 복제할 prefabs, 좌표, 회전을 넣어야함

(Vector3는 3차원상의 좌표를 넣어야해서)

Quaternion.identity 는 회전 없다는 뜻

 

 

food.cs

float direction = 0.05f;

void Update()
{
    // 이후 코드들은 다시 Update로!
}

void FixedUpdate()
{
    transform.position += new Vector3(0, direction, 0);        
}

매 업데이트마다 y축이 0.5씩위로올라가게
transform의 속도가 너무 빨라서 fixedUpdate를 쓰기로함

 

 

void Update()
{
    Vector3 mousePos = Camera.main.ScreenToWorldPoint(Input.mousePosition);
    transform.position = new Vector3(mousePos.x, transform.position.y, 0);
}

마우스 받아오기

x좌표만

y좌표는 object의 현재위치

 

 

void Update()
{
    Vector3 mousePos = Camera.main.ScreenToWorldPoint(Input.mousePosition);

    float x = mousePos.x;

    if(x > 9.0f)
    {
        x = 9.0f;
    }

    if(x < -9.0f)
    {
        x = -9.0f;
    }

    transform.position = new Vector3(x, transform.position.y, 0);
}

지정 범위 밖으로 안나가게 하기

 

 

UI → canvas → worldspace 

UI 세상에 있는걸 게임 세상으로 가지고옴

 

 

hp바의 배경을 깔고 실제 hp는 하나 더 만듬

pivot이 0.5가 기본값인데 scale에 따라 가운데부터 늘어나고 줄어듬

이걸 0으로 바꿔서 제일 왼쪽부터 늘어나고 줄어들게 만들기

 

 

📌 고양이 그림 Animation 오류 nomalCat(emty)말고 hungry(square)에 넣으니 해결

 

 

충돌을 위해 collider와 rigidbody를 걸었는데 rigidbody가 거꾸로 가려면  kinematic으로 바꿔야하고

대신 충돌을 감지를 못해서 중력의 영향을 안 받을 때에는 Is Trigger을 체크해줘야한다

Kinematic = 중력의 영향을 안 받겠다는 뜻

Is Trigger = 충돌 감지는 되지만, 물리적인 충돌은 발생하지 않는 옵션이다.

 

 

void OnTriggerEnter2D(Collider2D coll)
{
    if (coll.gameObject.tag == "food")
    {
        energy += 1.0f;
        Destroy(coll.gameObject);
    }
}

📌  오류가 한번 났었는데 Is Trigger을 체크해서 그런지 OnCollision이 아니라 OnTrigger함수를 씀

 

 

void OnTriggerEnter2D(Collider2D coll)
{
    if (coll.gameObject.tag == "food")
    {
        if (energy < full)
        {
            energy += 1.0f;
            Destroy(coll.gameObject);
            gameObject.transform.Find("hungry/hp/front").transform.localScale
            = new Vector3(energy / full, 1.0f, 1.0f);
        }
        else
        {
            gameObject.transform.Find("hungry").gameObject.SetActive(false);
            gameObject.transform.Find("full").gameObject.SetActive(true);
        }
    }
}

normalCat이 상위

하위에 hungry, hp, front, back이 있는건데

이런경우 이걸 find함수로 찾을수있음

 

 

 private void FixedUpdate()
 {
     if (energy < full)
     {
         transform.position += new Vector3(0, direction, 0);
     }
     else
     {
         if (transform.position.x > 0)
         {
             transform.position += new Vector3(0.05f, 0, 0);
         }
         else
         {
             transform.position += new Vector3(-0.05f, 0, 0);
         }
         Destroy(gameObject, 3.0f);
     }
 }

에너지가 다 차면 가까운쪽으로 이동하는 함수인데

속도가 조절이 안되서 fixed에 넣음

 

 

gameManager.I.addCat();

고양이가 배부를 때 addCat() 함수 부르기

하지만 이것만 추가하면 안됨

옆으로 빠지는 도중에 food에 맞으면 addCat이 계속 호출되는 버그

 

 

bool isFull = false;

if (isFull == false)
{
    gameManager.I.addCat();
    gameObject.transform.Find("hungry").gameObject.SetActive(false);
    gameObject.transform.Find("full").gameObject.SetActive(true);

    isFull = true;
}

isFull 이라는 상태를 알 수 있는 함수를 만들고 제어한다

 

 

public void AddCat()
{
    cat += 1;
    level = cat / 5;

    levelText.text = level.ToString();
    levelFront.transform.localScale 
    = new Vector3((cat - level * 5) / 5.0f, 1.0f, 1.0f);
}

정수 / 정수는 무조건 정수로 나와야해서 0.8이런값은 0으로 취급됨

front바의 비율을 정하기

현재 레벨에서 잡은 고양이 수

 

 

void MakeCat()
{
    Instantiate(normalCat);

    //난이도조절
    if (level == 1)
    {
        float p = Random.Range(0, 10);
        if (p < 2)
            Instantiate(normalCat);
    }
    else if (level >= 2)
    {
        float p = Random.Range(0, 10);
        if (p < 5)
            Instantiate(normalCat);
    }
}

확률형 난이도 조절

 

 

public int type;

cat.cs에 고양이 타입 만들기

normal과 fat에 type이 생김 거기에 숫자 바꿔주기

 

void Start()
{
    float x = Random.Range(-8.5f, 8.5f);
    float y = 30.0f;
    transform.position = new Vector3(x, y, 0);

    if (type == 1)
    {
        full = 10.0f;
    }
}

타입별로 속성도 다르게 설정

 

if (energy < full)
{
    if (type == 0)
    {
        transform.position += new Vector3(0.0f, -0.05f, 0.0f);
    }
    else if (type == 1)
    {
        transform.position += new Vector3(0.0f, -0.03f, 0.0f);
    }

    if (transform.position.y < -16.0f)
    {
        gameManager.I.gameOver();
    }
}

 

타입별 속성 바꾸기

 

 

void makeCat()
{
    Instantiate(normalCat);

    if (level == 1)
    {
        float p = Random.Range(0, 10);
        if (p < 2) Instantiate(normalCat);
    }
    else if (level == 2)
    {
        float p = Random.Range(0, 10);
        if (p < 5) Instantiate(normalCat);
    }
    else if (level >= 3)
    {
        float p = Random.Range(0, 10);
        if (p < 6) Instantiate(normalCat);

        Instantiate(fatCat);
    }
}

레벨에 따라 소환되는 고양이 조절

 


📝 오늘의 마무리

3주차 강의를 끝내는데에 성공했다.이미지 소스를 받아와서 만드니 확실히 별거 안만져도 퀄리티가 좋아지는 느낌서서히 조금 이해가 더 필요한 부분이 늘어서 점점 어려워지는 걸 느끼는 중이다.이거랑 비슷한 예제 한 10개 정도만 만들면 완전 이해 가능할 것 같은 느낌이다


 

✏️ 스스로 어제보다 한 발 더 나아갔다는 것을 자각하기

✏️ TIL을 쓰기 위해서라도, 오늘 반드시 단 하나라도 배우기

✏️ 꾸준히 기록을 남기는 습관 가지기

 

📕 오늘의 학습 키워드

📕  공부한 내용 본인의 언어로 정리하기

📕  오늘의 회고

📕  12시간 중 얼마나 몰입했는지

📕  더 나은 미래를 위해 내일 어떤 공부를 진행할 것인지