카테고리 없음

Unity 기초가이드2 : 마우스포인트, 데이터 보관법, 시간 딜레이

이더23 2024. 8. 19. 12:46

public GameObject square;와 같이 변수를 선언하는 이유는 public 키워드를 사용해 해당 변수를 클래스 외부에서도 접근할 수 있도록 하기 위함입니다. 이를 통해 유니티 에디터에서 인스펙터 창을 통해 쉽게 변수를 드래그 앤 드롭으로 설정할 수 있게 됩니다.

개요

Unity 기본 개념 다시 정리

내용 - Unity Add Component

  • shadow
    그림자 생성

내용 - Unity C# script 정리

  • 마우스 포인터를 따라 움직이게 하기

void Update()

{

Vector2 mousePos = Camera.main.ScreenToWorldPoint(Input.mousePosition);

transform.position = mousePos;

}

코드설명

  • Camera.main.ScreenToWorldPoint : 마우스 포인터는 화면 좌표(Screen Space)로 표현되기 때문에, 이를 월드 좌표(World Space)로 변환해야 오브젝트를 적절히 이동시킬 수 있습니다. 여기서 Camera.main은 메인 카메라에 접근하기 위해 사용됩니다.
  • Input.mousePosition : 현재 마우스 포인터의 화면 좌표를 반환합니다.
  • transform.position: 오브젝트의 현재 위치를 나타내며, 이를 mousePos로 업데이트하여 오브젝트가 마우스 포인터를 따라 이동하도록 합니다.

  • 크기 값 넣는방법
    float size = Random.Range(0.5f, 1.5f);
    transform.localScale = new Vector2(size, size);

  • 반복 함수(InvokeRepeating), 반복적으로 사용하는 게임 오브젝트 (Prefab)
    public GameObject square;

    void Start()
    {
    InvokeRepeating("MakeSquare", 0.0f, 1f);
    }

    void MakeSquare()
    {
    Instantiate(Square);
    }

코드설명

public GameObject square; : square라는 이름의 GameObject 변수를 선언

InvokeRepeating("MakeSquare", 0.0f, 1f); :

1. InvokeRepeating은 특정 함수를 지정된 시간 간격으로 반복 실행하게 합니다.

2. "MakeSquare": 반복 실행할 함수의 이름입니다.

-3. 0.0f: 첫 번째 호출까지의 지연 시간입니다. 여기서는 게임 시작 후 즉시 MakeSquare 함수가 호출됩니다.

void MakeSquare() : MakeSquare() 함수는 square Prefab을 인스턴스화하여 새로운 오브젝트를 생성하는 역할을 합니다.

Instantiate(square); : Instantiate 함수는 square Prefab을 게임 내에 생성합니다. 이로 인해, 매 초마다 새로운 정사각형 오브젝트가 생성됩니다.

 

  • 시간 흐르기(Time.deltaTime)

float time = 0.0f;

 

time += Time.deltaTime;

코드설명

float time = 0.0f; : 시간을 0으로 설정

time += Time.deltaTime; : 시간이 흐를떄마다 time에 더해진다.

 

내용 - 게임 종료 판넬

게임종료 로직을 게임매니저네 만들어 놓고 게임이 종료가 되면 게임매니저에서 게임종료 로직을 꺼내오면 된다.

싱글톤 만드는 법

public static GameManager Instance;

 

private void Awake()
{
    if(Instance == null)
    {
        Instance = this;
    }
}

 

코드설명

public static GameManager Instance; : 싱글톤 인스턴스를 저장할 정적 변수

private void Awake() : GameManager 인스턴스를 초기화하는 Awake 메서드

※Awake : Unity에서 오브젝트가 생성될 때 가장 먼저 호출되는 메서드

if (Instance == null) : Instance가 비어 있으면

Instance = this; : Instance에 현재 객체를 할당

 

시간 멈추기(Time.timeScale = 0.0f)

public GameObject endPanel;

 

public void GameOver()
{

    Time.timeScale = 0.0f;

    endPanel.SetActive(true);
}

코드설명

public GameObject endPanel; : endPanel은 게임 오버 화면을 나타내는 GameObject입니다. 이 변수는 Unity Editor에서 패널 오브젝트를 연결하는 데 사용됩니다.

public void GameOver() : GameOver()는 게임 오버 상황에서 호출되는 메서드입니다. 이 메서드가 호출되면 게임이 멈추고, 게임 오버 화면이 나타납니다.

Time.timeScale = 0.0f; :

Time.timeScale은 게임 내에서 시간의 흐름을 제어하는 변수입니다.

기본값은 1.0f로, 정상적인 속도로 시간이 흐르도록 합니다. 이 값을 0.0f로 설정하면, 게임 내의 모든 시간이 멈춥니다.

이로 인해, 플레이어와 적의 움직임, 애니메이션, 물리 계산 등이 모두 정지하게 됩니다.

endPanel.SetActive(true); :

endPanel.SetActive(true);는 게임 오버 패널을 활성화하여 화면에 표시합니다.

SetActive(true) 메서드를 호출하면, 비활성화된 오브젝트가 활성화되어 화면에 나타나게 됩니다. 이를 통해 플레이어는 게임 오버 화면을 볼 수 있습니다.

 

태그 비교(CompareTag("찾고자 하는 태그")

private void OnCollisionEnter2D(Collision2D collision)
{
    if (collision.gameObject.CompareTag("Player"))
    {
        GameManager.Instance.GameOver();
    }
}

코드설명

private void OnCollisionEnter2D(Collision2D collision) :

이 메서드는 Collision2D 객체를 매개변수로 받으며, 물리 충돌이 발생할 때 호출됩니다.

private 접근 제어자는 이 메서드가 같은 클래스 내에서만 호출될 수 있음을 의미합니다.

if (collision.gameObject.CompareTag("Player")) :

충돌한 오브젝트의 태그가 "Player"인 경우를 확인하는 조건문입니다.

collision.gameObject는 충돌한 게임 오브젝트를 참조하고, CompareTag 메서드는 오브젝트의 태그를 확인합니다.

GameManager.Instance.GameOver();

태그가 "Player"인 경우 호출되는 메서드입니다.

GameManager.Instance는 GameManager 클래스의 싱글톤 인스턴스를 참조합니다.

GameOver() 메서드는 게임이 종료되도록 하는 로직을 실행할 것입니다. 이 메서드는 GameManager 클래스 내에서 정의되어 있어야 합니다.

 

소수점 1,2 단위 오차 잡기

bool isPlay = true;

후에 update, GameOver같은 함수에 

isPlay = false, 혹은 isPlay를 사용하면 더 깔끔하게 숫자를 잡을 수 있다.

 

게임 재시작 버튼

public class RetryButton : MonoBehaviour
{
    public void Retry()
    {
        SceneManager.LoadScene("MainScene");
    }
}

코드설명

SceneManager.LoadScene("MainScene"); :

SceneManager는 Unity의 UnityEngine.SceneManagement 네임스페이스에 포함된 클래스입니다. 이 클래스는 씬(장면)을 관리하는 기능을 제공합니다.

LoadScene 메서드는 특정 씬을 로드하는 데 사용됩니다.

"MainScene"은 로드하려는 씬의 이름을 나타냅니다. 이 이름은 Unity 에디터에서 설정한 씬의 이름과 일치해야 합니다.

 

데이터를 보관하는 방법(PlayerPrefs)

  • 데이터 저장하기
    PlayerPrefs.SetFloat("bestScore", 어떤숫자값);
    PlayerPrefs.SetString("bestScore", 어떤문자열);
  • 데이터 불러오기
    어떤숫자값 = PlayerPrefs.GetFloat("bestScore");
    어떤문자열 = PlayerPrefs.GetString("bestScore");
  • 데이터를 저장했었는지 확인
    → 있으면 true 없으면 false
    PlayerPrefs.HasKey("bestScore")
  • 데이터를 모두 지우기
    PlayerPrefs.DeleteAll();

 

시간을 딜레이 시키는 함수( Invoke )

Invoke("TimeStop", 0.5f);

 

void TimeStop()
{
    Time.timeScale = 0.0f;
}

코드설명

Invoke("TimeStop", 0.5f); :

Invoke는 Unity의 MonoBehaviour 클래스에서 제공되는 메서드로, 지정한 시간 후에 특정 메서드를 호출합니다.

"TimeStop"은 호출할 메서드의 이름을 문자열로 지정합니다.

0.5f는 지연 시간(초 단위)으로, TimeStop 메서드가 0.5초 후에 호출됨을 의미합니다.

 

화면 밖으로 나가는 gameObject 삭제시키기

 void Update()
    {
        if(transform.position.y < -5f)
        {
             Destroy(gameObject);
        }
    }

코드설명

Destroy(gameObject); :

Destroy 메서드는 게임 오브젝트를 삭제합니다.

gameObject는 현재 스크립트가 부착된 게임 오브젝트를 참조합니다.

Destroy(gameObject)는 이 오브젝트를 씬에서 제거하고 메모리에서 해제합니다.