내일배움캠프 Unity 9기/TIL

[Unity/TIL] - 씬 이동 버튼 만들기 / 확률 설정 / 생성 위치 지정 / 마우스 포인터 설정 / 함수호출 딜레이

song-ssi 2025. 4. 8. 10:53

모든 토글을 열고 닫는 단축키

Windows : Ctrl + alt + t

Mac : + + t

 

메인씬으로 이동하기

inspector -> button ->  On Click 에서 버튼 기능 설정

using UnityEngine;
using UnityEngine.SceneManagement;

public class StartButton : MonoBehaviour
{
    public void GameStart()
    {
        SceneManager.LoadScene("MainScene");
    }
}

 

 

 

UI - Canvas Render Mode

Canvas의 Render Mode는 UI 요소가 화면에서 어떻게 표시되는지를 결정하는 중요한 설정입니다.

Canvas의 Render Mode는 3가지 옵션으로 나뉩니다

  1. Screen Space - Overlay
  2. Screen Space - Camera
  3. World Space

 

1. Screen Space - Overlay

  • 기본값으로 설정되는 옵션입니다.
  • UI 요소가 카메라와 무관하게 화면 상에 오버레이되어 표시됩니다.
  • UI 요소게임 화면상단에 렌더링되며, 카메라의 위치와 회전에 영향을 받지 않습니다.
  • 화면 크기에 맞춰 UI 요소들이 자동으로 스케일되고, 화면 해상도에 따라 크기가 조정됩니다.

특징:

  • UI 요소가 화면을 항상 덮는 방식으로 표시됩니다.
  • 2D UI에 적합하며, 게임 화면을 가리지 않고 UI를 보여주는 데 사용됩니다.
  • 카메라의 뷰와 관계없이 UI는 항상 화면 중앙에 고정되어 표시됩니다.

사용 예시:

  • 메뉴, 버튼, 텍스트와 같은 일반적인 UI 요소를 사용할 때 적합합니다.
  • 예를 들어, 게임의 HUD(Head-Up Display)나 점수판 등의 UI에 자주 사용됩니다.

 

2. Screen Space - Camera

  • UI 요소가 특정 카메라의 뷰에 맞춰 렌더링됩니다.
  • Render Camera 속성에 지정된 카메라의 뷰포트 안에서 UI 요소가 렌더링됩니다.
  • 이 모드에서는 UI 요소들이 카메라의 위치와 회전에 영향을 받습니다. 즉, 카메라가 이동하거나 회전하면 UI 요소의 위치도 그에 맞게 변경됩니다.
  • 이 옵션은 UI가 특정 카메라의 시점에서 표시되어야 할 때 사용됩니다. 예를 들어, 3D 게임의 HUD특정 카메라 시점에서만 보이는 UI에 유용합니다.

특징:

  • 카메라에 의해 UI가 렌더링됩니다.
  • 화면 크기에 관계없이 카메라의 뷰포트 크기에 맞춰 UI가 조정됩니다.
  • 3D UI카메라에 의존하는 UI를 만들 때 유용합니다.

사용 예시:

  • 3D 게임의 UI가 카메라의 뷰에 맞게 표시될 때 사용됩니다. 예를 들어, 3D 월드 공간에서 표시되는 UI특정 카메라의 뷰포트 안에서만 보이는 UI입니다.

 

3. World Space

  • UI 요소가 3D 공간에 배치되어 월드 좌표계에서 렌더링됩니다.
  • UI는 게임 월드 내의 오브젝트처럼 다루어지며, UI 요소가 3D 공간의 객체처럼 배치됩니다.
  • 이 방식은 UI가 3D 오브젝트처럼 이동하거나 회전할 수 있게 하며, 카메라의 시점에 따라 UI가 보이거나 가려집니다.
  • 월드 공간에서 UI를 다루는 방식으로, UI 요소가 3D 공간 내에서 다른 오브젝트와 상호작용할 수 있습니다.

특징:

  • UI 요소가 3D 공간에 존재하는 것처럼 행동합니다.
  • UI 요소를 3D 오브젝트처럼 이동, 회전, 크기 조정할 수 있습니다.
  • UI 요소가 3D 환경에서 다른 3D 객체들과 함께 배치됩니다.
  • UI 요소가 물리적 공간에서 조작될 수 있습니다.

사용 예시:

  • 3D 게임에서 3D 공간에 배치된 UI를 만들 때 사용됩니다. 예를 들어, 3D 오브젝트 위에 표시되는 텍스트월드 공간에 있는 UI 요소(예: 3D 레이더, 타겟 거리 표시) 등이 이에 해당합니다.
  • UI가 3D 오브젝트의 일부로 작동할 때 유용합니다. 예를 들어, 3D 상호작용 버튼이나 대화 상자가 3D 공간에서 이동할 때 사용됩니다.

 

 

마우스 포인터 설정

Camera.main.ScreenToWorldPoint

void Update()
{
    Vector2 mousePos = Camera.main.ScreenToWorldPoint(Input.mousePosition);
    transform.position = new Vector2(mousePos.x, transform.position.y); //y는 그대로. 좌우만 움직임.
}

 

 

Rigidbody 2D - 중력

중력설정

Body Type : Kinematic = 중력의 영향을 안 받겠다는 뜻!

이때는 collider의 is Trigger에 체크! (체크하지 않으면 충돌감지가 안됩니다!)

 

 

확률 만들기

void makeCat()
{
    Instantiate(normalCat);

    if (level == 1)
    {
        float p = Random.Range(0, 10);
        if (p < 2) Instantiate(normalCat); //20%의 확률
    }
    else if (level >= 2)
    {
        float p = Random.Range(0, 10);
        if (p < 5) Instantiate(normalCat); //50%의 확률
    }
}

 

 

카드 생성위치 설정

 

x값엔 4로 나눈 나머지

y값엔 4로 나눈 몫

에 간격(1.4) 곱해주기

 

void Start()
{
    for (int i = 0; i < 16; i++)
    {
        GameObject go = Instantiate(card);
        go.transform.parent = cards;

        float x = (i % 4) * 1.4f - 2.1f;
        float y = (i / 4) * 1.4f - 3.0f;
        go.transform.position = new Vector2(x, y);
    }
}

 

 

 

using System.Linq;

LINQ의 주요 기능:

LINQ를 사용하면 컬렉션(배열, 리스트 등)에 대해 다음과 같은 작업을 손쉽게 처리할 수 있습니다:

  1. 필터링 (Where) 
  2. 정렬 (OrderBy, OrderByDescending)
  3. 선택 (Select) -  컬렉션의 각 항목에서 특정 속성만 선택할 수 있습니다.
  4. 그룹화 (GroupBy)
  5. 집계 (Sum, Average, Count, Max, Min)

 

랜덤 배열 설정

int[] arr = { 0, 0, 1, 1, 2, 2, 3, 3, 4, 4, 5, 5, 6, 6, 7, 7 };
arr = arr.OrderBy(x => Random.Range(0f, 7f)).ToArray();

 

 

함수 호출 대기시간 걸기

Invoke

지정한 시간 이후에 특정 함수를 호출한다.

Invoke("MethodName", delay)

 

 

 

has exit time - Animator

Has Exit Time애니메이션 상태에서 다른 상태로 전환할 때 애니메이션이 끝날 때까지 기다릴지 여부를 설정하는 옵션입니다.

이를 통해 애니메이션의 완전한 재생을 보장할 수 있습니다.

체크 - 애니메이션이 끝날 때까지 기다림

체크 해제 - 즉시 다른 애니메이션으로 전환됨

 

 

Transition Duration - Animator

Transition Duration현재 애니메이션 상태에서 다음 애니메이션 상태전환되기까지 걸리는 시간을 나타냅니다.

이 값을 조정하면 애니메이션 상태 간에 부드러운 전환을 구현할 수 있습니다.

0.25 - 기본값

0 - 즉시 전환

값이 클수록 애니메이션이 부드럽게 전환됨

 

 

 

질문

<30초간 플레이하면 게임이 종료되는 시스템 만들기>
time == 30.0f일 때는 작동이 안되고
timeTxt.text == "30.00" 일때만 작동되는 이유

 

 

>>>

Time.deltaTime 값은 밀리초 단위로 바뀌기 때문에 딱 떨어지는 시간으로 반환되기 어려움.

.time값이 30.0001 만돼도 30.0f와는 다른값으로 인식함.

time.ToString("N2") 해주면 소수점 두자리 까지만 변환했기 때문에 30.0001 이었던 값도 30.00 으로 변환되어서 동작되었을 거임. 하지만 시간이 30.01XXX 이었다면 30.01 로 반환 될 수도 있기 때문에

timeTxt.ext == "30.00"을 사용는 것 보다는

if(time >= 30.0f)로 바꾸는 것이 바람직하다.