새소식

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
  • -

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

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