반응형
[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);
}
}
}
- F → Fixed-point 형식 (고정 소수점 표시)
- 숫자 뒤의 0 → 소수점 자릿수
다양한 메서드를 배우는데 적재적소에 앞으로 잘 활용할수 있을지 모르겠다. 꾸준히 익히고 많이 쳐봐야할 것 같다.
반응형