본문 바로가기

유니티 (Enum / 반복문 / Invoke / Coroutine / Random) _ 멋쟁이사자처럼 유니티 부트캠프 17회차 추가학습

@salmu2025. 6. 11. 00:05
반응형

[17회차 수업내용]

1. Enum

2. 반복문

3. Invoke

4. Coroutine

5. Random

6. 고양이 게임 실습

 

1. Enum = 열거형

서로 관련 있는 상수들의 집합의미 있는 이름으로 묶어서 표현하는 자료형

값 지정도 가능

enum State
{
    Idle = 0,
    Move = 10,
    Attack = 20
}

 

 

* 계산기 코드 구현

using UnityEngine;
using UnityEngine.Rendering;

public class Study_Switch : MonoBehaviour
{
  public enum CalculationType { Plus, Minus, Multiply, Divide } // 열거형 생성
  public CalculationType calculationType;

  public int input1, input2, result;

  void Start()
  { 
    Debug.Log($"계산 결과 : {Calculation()}");
  }

  private int Calculation()
  {
    switch (calculationType)
    {
      case CalculationType.Plus:
        result = input1 + input2;
        break;
      case CalculationType.Minus:
        result = input1 - input2;
        break;
      case CalculationType.Multiply:
        result = input1 * input2;
        break;
      case CalculationType.Divide:
        result = input1 / input2;
        break;
    }
    
    return result;
  }
}

 

 

2. 반복문 (For, Foreach)

 

[ For 반복문 / continue / break ]

2025.05.21 - [프로그래밍/유니티 부트캠프] - W3Schools C# 개인학습 (WhileLoop->Break & Continue) 참고

 

 

[For each]

string[] fruits = { "사과", "바나나", "포도" };

foreach (string fruit in fruits)
{
    Debug.Log(fruit);
}

 

 

구분 for foreach
대상 인덱스로 접근 가능한 반복 컬렉션의 모든 요소 순회
인덱스 사용 직접 인덱스 조작 가능 인덱스 사용 불가능
용도 횟수 기반 반복, 인덱스 필요 시 모든 요소를 한 번씩 처리할 때
코드 간결성 비교적 복잡 간단하고 직관적

 

 

 

3. Invoke :특정 함수를 지정한 시간(딜레이) 후에 한 번 실행

 

Invoke("함수이름", 딜레이시간(초));
InvokeRepeating("함수이름", 딜레이시간(초), 반복간격(초));
CancelInvoke("함수이름");
CancelInvoke(); //모든 예약된 호출 취소

 

함수명 역할 사용 예시
Invoke 지연 후 한 번 함수 호출 Invoke("Func", 2f);
InvokeRepeating 지연 후 일정 간격으로 함수 반복 호출 InvokeRepeating("Func", 1f, 3f);
CancelInvoke 예약된 호출(Invoke, InvokeRepeating) 취소 CancelInvoke("Func"); 또는 CancelInvoke();

 

 

 

*적당한 주기의 반복에 활용 가능 (InvokeRepeating)

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

void CountDown()
{
    Debug.Log("1초마다 호출");
}

void Update()
{
    if (Input.GetKeyDown(KeyCode.Space))
    {
        CancelInvoke("CountDown");
    }
}

 

 

4. Coroutine 코루틴 : 함수가 실행 도중 특정 시점에 잠시 멈췄다가(중단했다가), 다시 이어서 실행 가능

  • 지연 실행(Delay)
  • 반복적 작업 중 중간에 일시 정지
  • IEnumerator를 반환
  • yield return new WaitForSeconds()는 일시 정지를 의미합니다.
  • StartCoroutine()으로 호출하고, 필요시 StopCoroutine()으로 중지할 수 있습니다.
IEnumerator MyCoroutine() {
    Debug.Log("Start");
    yield return new WaitForSeconds(2f); // 2초 대기
    Debug.Log("After 2 seconds");
}

StartCoroutine(MyCoroutine());

 

 

* 예시 폭탄 해제

private bool isStop = false;

IEnumerator Bomb() //'Bomb' 메서드 선언: 코루틴으로 사용
{
    int time = 10;
    while (time > 0)
    {
        Debug.Log($"{time}초 남았습니다.");
        yield return new WaitForSeconds(1f); // 코루틴 일시 중지: 1초 기다린 후 재개
        time--; // 'time' 변수 1 감소

        if (isStop)
        {
            Debug.Log("폭탄이 해제되었습니다.");
            yield break; // 코루틴 즉시 종료
        }
    }

    Debug.Log("폭탄이 터졌습니다.");
}

void Update()
{
    if (Input.GetKeyDown(KeyCode.Space))
    {
        isStop = true;
    }
}

 

 

 

4.1 Coroutine 과 Invoke 비교

구분 Coroutine Invoke
실행 방식 IEnumerator 함수 실행 중단/재개 지정 시간 후 함수 이름 호출 (문자열)
반복/지연 중간에 멈추고 다시 재개 가능, 복잡한 비동기 흐름 처리 가능 단발성 또는 반복적 호출 가능 (InvokeRepeating)
사용 편의성 코드 작성이 다소 복잡하지만 유연함 간단한 딜레이 함수 호출에 적합
함수 호출 방식 직접 함수 호출 및 제어 가능 함수 이름을 문자열로 지정 (오타 위험)
성능 및 안정성 약간 더 무겁고 복잡한 로직 가능 단순 호출에 적합, 부담 적음

 

 

 

 

5.1 Random

// 0 이상 1 이하 실수
float rand = Random.Range(0f, 1f); 


//랜덤 bool 값
bool randBool = Random.value > 0.5f;


//배열에서 랜덤 선택
string[] colors = { "Red", "Blue", "Green" };
string randColor = colors[Random.Range(0, colors.Length)];

 

 

 

예시 - Loop_ 파이프 높이 랜덤 

using UnityEngine;

public class Transform_LoopMap : MonoBehaviour
{
    public float moveSpeed = 3f;       // 이동 속도
    public float returnPosX = 15f;     // 다시 오른쪽으로 이동할 X 좌표 기준점
    public float randomPosY;           // Y축 위치 랜덤값 저장

    void Start()
    {
        // 시작할 때 Y 위치를 -8 ~ -3 사이 랜덤하게 설정
        randomPosY = Random.Range(-8, -3);
        transform.position = new Vector3(transform.position.x, randomPosY, 0); //x는 기존 위치 유지
    }

    void Update()
    {
        // 왼쪽(-X 방향)으로 지속적으로 이동
        transform.position += Vector3.left * moveSpeed * Time.deltaTime;

        // X 좌표가 기준점(-returnPosX)보다 왼쪽으로 가면
        if (transform.position.x <= -returnPosX)
        {
            // 새로운 랜덤 Y 위치 설정
            randomPosY = Random.Range(-8, -3);
            // X 좌표를 다시 오른쪽(returnPosX)으로 보내고, 랜덤 Y로 위치 변경 (무한 루프 맵처럼 보이게 함)
            transform.position = new Vector3(returnPosX, randomPosY, 0);
        }
    }
}

 

 

 

6.1 고양이 게임 실습 _ 고양이 회전 

var catRotation = transform.eulerAngles;  // 현재 오브젝트의 회전값(오일러 각도)을 가져옴
catRotation.z = catRb.linearVelocityY * 2.5f;  // z축 회전을 속도에 비례해서 변경 (2.5배 스케일 조정)
transform.eulerAngles = catRotation;  // 변경된 회전값을 다시 적용

 

6.2 이름표 회전 방지

public class CatFollow : MonoBehaviour
{
    public Transform cat;      // 따라갈 대상(고양이)의 Transform
    public Vector3 offset;     // 고정된 거리 차이(위치 오프셋)

    void Update()
    {
        // 고양이 위치 + 오프셋만큼 떨어진 위치로 따라가기
        transform.position = cat.transform.position + offset;
    }
}

 

* 자식으로 두면서 회전 방지 하기 위해 코드 추가

 transform.rotation = Quaternion.identity;    // 회전은 무조건 0으로 고정

 

 

6.3 타이머 설정  ** 재확인하기


// GameManager 
using TMPro;
using UnityEngine;

namespace Cat
{
    public class GameManager : MonoBehaviour
    {
        // 플레이 시간을 표시할 TextMeshProUGUI 컴포넌트
        // 유니티 에디터에서 연결해줘야 한다.
        public TextMeshProUGUI playTimeUI;
        
        private float timer;   // 실제로 흐르는 시간을 저장할 변수

        void Update()
        {
            timer += Time.deltaTime;
			
             // 플레이 시간 텍스트 업데이트 (F0 = 소수점 없이 정수로 표시)
            playTimeUI.text = $"플레이 시간 : {timer:F0}초";
            // playTimeUI.text = string.Format("플레이 시간 : {0:F1}초", timer);
        }
    }
}
  • FFixed-point 형식 (고정 소수점 표시)
  • 숫자 뒤의 0소수점 자릿수

 

다양한 메서드를 배우는데 적재적소에 앞으로 잘 활용할수 있을지 모르겠다. 꾸준히 익히고 많이 쳐봐야할 것 같다. 

반응형
salmu
@salmu :: SMU 각종 기록

목차