새소식

C#,Unity Programming

게임개발 학습. 고양이 밥주기 게임(hp bar, OnTriggerEnter, transform.localScale)

  • -
728x90

 

// 게임개발 종합반 - 3주차(스파르타코딩클럽)

  • 다른 책에서 배울때 체력바는 슬라이더로 구현했었는데, 이번에는 이미지 2개를 겹쳐서 만든다.
    • Pivot을 0으로 맞춰두고 Scale을 변경하는 방식.
    • 다양한 방법을 배워두면 좋을 것 같다.
  • Prefab을 씬에서 수정할 경우 꼭 Override를 해주자
  • 저장을 생활화하자... 코드는 꼭 저장하는데 아직 Unity는 습관이 덜들었다. 오류나서 꺼졌는데 어디부터 다시해야 하는지 못찾겠음....
  • Trigger 충돌을 사용할 때는 OnTriggerEnter2D 다.
    • OnCollision2D로 했다가 문제를 한참 찾았다. 
  • FrameRate 를 잘 체크하자.
    • Game View의 VSync를 켜고 하거나, FrameRate를 고정하여 개발

2022.09.03 - [Programming/C#,Unity Programming] - Unity VSync

 

Unity VSync

교재와 속도 수치가 같은데 , Game View에서 고양이가 너무 빠르게 내려온다., 이상하게 안드로이드로 빌드하면 원하던 속도에 맞길래, 업데이트되는 프레임이 문제일거 같아서 싱크 맞추는 옵션

codecellar.tistory.com


고양이 나타내기

  • 고양이는 3가지로 구성 (normal, fat, pirate)
  • Duplicate 해서 애니메이션만 바꿔주면 3가지 고양이 완성

고양이 오브젝트 만들기

  • Empty Object 의 자식으로 hungry, full 오브젝트 생성 후 이미지 할당

고양이 체력바  만들기(UI)

  • hungry 밑에 Canvas 추가
    • Render Mode를 World Space 로 변경
    • Canvas 아래에 이미지로 체력바 추가(back,front)
    • 체력바로서 왼쪽으로 줄어들도록 Pivot.x을 0으로 조정

고양이 애니메이션 붙이기

  • 'normalCat' animation 생성 후  'normalCat' gameObject에 할당
  • 2개 이미지를 스프라이트에 번갈아 적용하며 애니메이션 레코딩

고양이 내려오게하기

  • 이건 외울때가 된것 같다
public class cat : MonoBehaviour
{
    // Start is called before the first frame update
    void Start()
    {
        float x = Random.Range(-8.5f, 8.5f);
        float y = 30.0f;
        transform.position = new Vector3(x, y, 0f);
    }

    // Update is called once per frame
    void Update()
    {
        transform.position += new Vector3(0f, -0.05f, 0f);
    }
}

 

밥과 고양이 충돌주기

  • 밥에 food 태그 달기
  • 밥에 rigidbody2D, CircleCollider2D 달기(고양이도 collider가 있어야 되겠다)
    • rigidbody 의 BodyType을 Kinematic으로 잡아야 물리법칙의 영향을 안받는다
    • circleCollider에 isTrigger 를 토글하여 충돌감지를 할 수 있도록 하자
void OnTriggerEnter2D(Collider2D collision) // 물리충돌이 아니므로 OnTriggerEnter
{
    if (collision.gameObject.tag == "food")
    {            
        if (energy < full)
        {
            energy += 1.0f;
            Destroy(collision.gameObject);
        }

        else
        {
            Debug.Log("배가 다 찼어요");
        }
    }
}

밥 게이지 채우기

  • front 찾기 : gameObject.transform.Find("hungry/Canvas/front") 
  • front의 scale 찾기 : gameObject.transform.Find("hungry/Canvas/front").transform.localScale
  • 에너지의 비율로 scale 값을 잡는 센스
void OnTriggerEnter2D(Collider2D collision)
{
    if (collision.gameObject.tag == "food")
    {            
        if (energy < full)
        {
            energy += 1.0f;
            Destroy(collision.gameObject);
            gameObject.transform.Find("hungry/Canvas/front").transform.localScale = new Vector3(energy / full, 1f, 1f);

        }

        else
        {
            gameObject.transform.Find("hungry").gameObject.SetActive(false);
            gameObject.transform.Find("full").gameObject.SetActive(true);
        }

    }
}

배부른 고양이 보내기

  • 왼쪽 고양이는 왼쪽으로, 오른쪽 고양이는 오른쪽으로 보내기
  • 3초뒤 소멸
void Update()
{
    if (energy < full)
    {
        transform.position += new Vector3(0f, -0.05f, 0f);
    }

    else
    {
        if( transform.position.x > 0)
        {
            transform.position += new Vector3(0.05f, 0f, 0f);
        }
        else
        {
            transform.position += new Vector3(-0.05f, 0f, 0f);
        }
        Destroy(gameObject, 3f);
    }
}

고양이 등장시키기!

public GameObject normalCat;

void Start()
{
    InvokeRepeating("makeFood", 0.0f, 0.2f);
    InvokeRepeating("makeCat", 0.0f, 1.0f);
}

void makeCat()
{
    Instantiate(normalCat);
}

Retry 버튼 만들기

  • UI - Image 에 Button 컴포넌트 넣고
  • retryBtn 스크립트 짜서 On Click 이벤트에 넣기
using UnityEngine.SceneManagement;

public void Regame()
{
    gameManager.GM.Regame();
}

gameManager 싱글톤

public static gameManager GM;

void Awake()
{
    GM = this;
}

고양이가 가게에 닿으면 gameOver 시키기

  • cat.cs
void Update()
{
    if (energy < full)
    {
        transform.position += new Vector3(0f, -0.05f, 0f);

        if (transform.position.y < -22f)
        {
            gameManager.GM.gameOver();
        }
    }
  • gameManager.cs
  • 게임 실행 관련 함수는 gameManager에 넣자
public void gameOver()
{
    Time.timeScale = 0.0f;
    retryBtn.SetActive(true);
}

public void Regame()
{
    SceneManager.LoadScene("MainScene");
}
Contents
  • -

포스팅 주소를 복사했습니다

이 글이 도움이 되었다면 공감 부탁드립니다.