Week 11 / Period 02 / Demonstration

두 코드 파일로 제한하는
통제된 시연

30초 게임에 Time Bonus 하나를 더합니다. Ask, Plan, 승인, 제한 실행, diff, 수동 연결과 회귀 테스트의 순서를 한 번도 건너뛰지 않습니다.

한 변경 조각이 좁은 권한 문을 지나 두 Script가 되고 diff 확대경, 수동 연결과 시간 다이얼 검증으로 이어지는 입체 작업대
TWO SCRIPTS → HUMAN WIRING → REGRESSION Agent는 구현 코드 두 파일만 바꾸고 Scene 연결과 완료 판정은 사람이 수행합니다.

2교시의 도착점

교수자의 한 번의 완성 시연을 통해 3교시에서 학생이 독립적으로 수행할 승인 지점, 코드 책임, 수동 연결과 테스트 순서를 봅니다.

  • 01

    Ask에서 현재 데이터 소유자와 호출 흐름을 수정 없이 확인합니다.

  • 02

    Plan에서 두 파일, 수동 작업, 위험과 테스트를 승인합니다.

  • 03

    script-only Agent 뒤 실제 diff를 줄별 책임으로 검토합니다.

  • 04

    Inspector에서 직접 연결하고 새 기능과 기존 게임 루프를 함께 검증합니다.

60분의 설명과 시연 흐름

가장 빠른 실행이 아니라 가장 짧게 설명하고 되돌릴 수 있는 변경을 완성합니다.

00-60 min

한 기능, 두 파일, 여덟 테스트

Demonstration / professor-led

  1. baseline과 체크포인트

    기존 게임 루프를 실행하고 Console 0, 저장 상태와 변경 전 파일 목록을 확인합니다.

  2. Ask로 구조 읽기

    GameManager가 시간과 상태를 소유하고 Trigger가 사건을 전달하는 구조를 설명받아 실제 코드와 대조합니다.

  3. 문제 계약 확정

    +5초, 30초 상한, Playing 전용, 정확히 한 번과 두 파일 범위를 잠급니다.

  4. Plan 검토와 승인

    예상 diff, 수동 Inspector 작업, 실패 가능성과 테스트가 모두 있는지 확인합니다.

  5. script-only Agent 실행

    구현 코드 두 C# 파일만 허용하고 예기치 않은 구현 파일 또는 명령이 나오면 중단합니다.

  6. diff와 컴파일 검토

    상태 문, 상한, 반환값, 한 번 처리와 기존 함수 보존을 읽고 Console을 확인합니다.

  7. 수동 Unity 연결

    TimeBonus GameObject, Collider2D, Component와 GameManager 참조를 사람이 직접 연결합니다.

  8. 새 기능과 회귀 테스트

    경계값, 한 번 처리, 상태 거부, 기존 성공, 실패와 재시작을 실행하고 코드를 구술합니다.

시연 목표: 남은 시간을 한 번만 안전하게 늘립니다

새 mechanic의 값과 경계를 먼저 계산해 두면 코드가 달라도 같은 행동을 판정할 수 있습니다.

FIXED BEHAVIOR

Player가 TimeBonus Trigger에 처음 닿으면 Playing에서만 남은 시간에 5초가 더해집니다. 결과는 30초를 넘지 않고, 보너스는 성공 뒤 사라집니다. Ready, Won, Lost에서는 시간을 바꾸거나 사라지지 않습니다.

INPUT
접촉
Player Tag의 Collider2D
bonusSeconds = 5f
횟수
오브젝트마다 최대 1회
RULE
허용
CurrentState == Playing
계산
current + 5
상한
Mathf.Min(..., roundDuration)
OUTPUT
데이터
timeRemaining 변경
UI
UpdateHud() 즉시 호출
오브젝트
승인 뒤 비활성화
UNCHANGED
점수
AddScore 흐름 유지
종료
Won, Lost 규칙 유지
초기화
Restart로 원래 상태 복원

코드 전에 기대 결과 계산하기

상태와 현재 시간을 바꾼 뒤 Time Bonus를 적용하면 어떤 값이 되어야 하는지 확인합니다.

EXPECTED RESULT 25.0초

Playing이므로 20.0 + 5.0을 허용하고 30.0에서 제한합니다.

첫 요청은 변경이 아니라 구조 설명입니다

AI의 설명을 곧바로 믿지 않습니다. 답에 나온 클래스, 필드와 함수명을 실제 두 Script에서 찾아 일치 여부를 표시합니다.

Ask의 주장실제 확인 위치통과 질문
시간 소유자GameManager.timeRemaining같은 사실을 저장하는 변수가 다른 Script에도 있는가
상태 문CurrentState != GameState.Playing종료 뒤에도 시간이나 사건이 진행되는가
화면 갱신UpdateHud()데이터 변경 직후 UI가 같은 값을 표시하는가
Trigger 관례OnTriggerEnter2D, Player Tag기존 Collectible과 같은 연결 조건을 재사용할 수 있는가

계획은 실행 순서보다 승인 표입니다

좋은 Plan은 무엇을 할지만 말하지 않습니다. 어떤 파일을 바꾸지 않을지와 무엇으로 실패를 알 수 있는지도 함께 적습니다.

  1. 01

    GameManager.cs

    TryAddTime(float seconds)를 추가합니다. Playing과 양수 여부를 검사하고, 30초 상한으로 시간을 바꾸고 HUD를 갱신한 뒤 성공 여부를 반환합니다.

    승인 기존 Update, AddScore와 FinishRound를 바꾸지 않습니다.

  2. 02

    TimeBonus.cs

    Player 접촉과 한 번 처리 여부를 검사하고 GameManager가 변경을 승인한 경우에만 자신을 비활성화합니다.

    승인 시간 데이터 자체를 저장하거나 직접 바꾸지 않습니다.

  3. 03

    사람의 Scene 작업

    교수자가 TimeBonus GameObject, SpriteRenderer, Collider2D Is Trigger, Script와 GameManager 참조를 Inspector에서 직접 연결합니다.

    승인 Agent가 *.unity 또는 Prefab을 쓰지 않습니다.

  4. 04

    컴파일과 행동 검증

    Console을 먼저 확인하고 20+5, 28+5, 중복 접촉, 상태 거부와 기존 전체 루프를 실행합니다.

    승인 테스트하지 않은 항목은 완료라고 표시하지 않습니다.

계획 승인Agent가 작성하는 구현 코드가 두 C# 파일이고, Plan 문서·Unity 생성 .meta·수동 Scene을 지원 산출물로 분리했으며, 여덟 테스트와 중단 조건이 있을 때만 Agent로 넘어갑니다.

실행 직전에 권한과 중단 조건을 다시 읽습니다

Plan을 잘 썼어도 Agent 권한이 넓으면 실행 중 더 많은 대상을 바꿀 수 있습니다. 권한 설정과 prompt의 금지 범위를 함께 사용합니다.

ModeAgent
PermissionWrite scripts only
Allowed2 C# files
StopUnexpected file
CONTINUE

두 파일의 코드 변경만 요청

현재 Plan과 일치하면 실행 활동을 펼쳐 매개변수와 결과를 확인합니다.

STOP

Scene 또는 세 번째 구현 파일 요청

승인하지 않고 Plan으로 돌아갑니다. 새 필요가 목표에 필수인지 사람이 먼저 판단합니다.

각 Script는 하나의 책임만 가집니다

GameManager는 시간 규칙을 소유하고, TimeBonus는 접촉 사건을 한 번 전달합니다. 같은 데이터를 두 곳에서 관리하지 않습니다.

GameManager.cs · add one public method
public bool TryAddTime(float seconds)
{
    if (CurrentState != GameState.Playing || seconds <= 0f)
    {
        return false;
    }

    timeRemaining = Mathf.Min(
        timeRemaining + seconds,
        roundDuration
    );
    UpdateHud();
    return true;
}

bool

요청이 실제로 받아들여졌는지 호출자에게 돌려줍니다.

Playing

Ready, Won과 Lost에서 시간 변경을 거부합니다.

seconds <= 0f

잘못된 0 또는 음수 입력을 시간 추가로 처리하지 않습니다.

Mathf.Min

현재 시간에 보너스를 더하되 roundDuration을 상한으로 사용합니다.

UpdateHud

데이터를 바꾼 같은 사건에서 화면도 즉시 갱신합니다.

TimeBonus.cs · event sender
using UnityEngine;

public class TimeBonus : MonoBehaviour
{
    [SerializeField] private GameManager gameManager;
    [SerializeField, Min(0.1f)] private float bonusSeconds = 5f;

    private bool collected;

    private void OnTriggerEnter2D(Collider2D other)
    {
        if (collected || !other.CompareTag("Player") || gameManager == null)
        {
            return;
        }

        if (!gameManager.TryAddTime(bonusSeconds))
        {
            return;
        }

        collected = true;
        gameObject.SetActive(false);
    }
}

순서책임실패하면
Player 접촉 확인TimeBonus다른 Collider는 무시
상태와 값 승인GameManager.TryAddTimefalse 반환, 오브젝트 유지
시간과 HUD 변경GameManager승인 전에는 아무 변화 없음
한 번 처리 기록TimeBonus승인한 사건에만 collected = true
시각 결과TimeBonus성공한 경우에만 비활성화
단일 진실TimeBonustimeRemaining을 직접 찾거나 복제하지 않습니다. 시간의 변경 가능 여부와 상한은 데이터 소유자인 GameManager가 결정합니다.

Scene 연결은 학생이 볼 수 있게 직접 수행합니다

script-only 권한을 선택했으므로 코드 밖의 연결은 자동으로 생기지 않습니다. 이 구간이 Component와 참조 관계를 이해하는 학습입니다.

  1. 01

    기존 수집물을 복제해 역할 분리

    Hierarchy에서 작동하는 Collectible 하나를 복제하고 이름을 TimeBonus로 바꿉니다. 기존 Collectible Component는 제거합니다.

    확인 SpriteRenderer와 Collider2D는 남고 점수 Script는 없습니다.

  2. 02

    표현과 Trigger 확인

    시계 또는 기존 placeholder Sprite를 연결하고 Collider2D의 Is Trigger를 켭니다. Player Tag를 비교하고 Player 또는 TimeBonus 중 적어도 하나에 활성 Rigidbody2D가 있는지 확인합니다.

    확인 물리 조건이 갖춰지고 Console Error 0, Missing Script 0입니다.

  3. 03

    TimeBonus 추가

    Add Component로 새 Script를 붙이고 Inspector의 Game Manager에 Scene의 GameManager 오브젝트를 끌어 놓습니다. Bonus Seconds는 5로 둡니다.

    확인 참조가 None이 아니고 값이 5입니다.

  4. 04

    Build Profiles의 시작 Scene 확정

    File → Build Profiles → Scene List → Add Open Scenes를 누릅니다. Week11_TimeBonus를 첫 번째 활성 Scene으로 옮기거나 이전 Scene을 비활성화하고, 체크 상태와 중복 여부를 확인합니다.

    확인 목록의 첫 번째 활성 항목이 Week11_TimeBonus라서 Build and Run이 그 Scene으로 시작합니다.

  5. 05

    Scene 저장 전 diff 분리

    Scene과 .meta는 사람이 한 작업과 Unity 생성 산출물입니다. Agent가 바꾼 두 Script의 diff와 로그에서 작성 주체를 별도 항목으로 기록합니다.

    확인 누가 무엇을 바꿨는지 다시 설명할 수 있습니다.

가까운 증거부터 넓은 증거로 확인합니다

새 코드를 넣은 뒤 바로 전체 플레이만 반복하지 않습니다. 컴파일, 연결, 경계값, 사건 횟수와 기존 루프 순서로 실패 범위를 좁힙니다.

diffConsoleInspector경계값회귀
조건기대 결과보는 증거
20.0초, Playing, 첫 접촉25.0초, 보너스 비활성화HUD 값과 Hierarchy 활성 상태
28.0초, Playing, 첫 접촉30.0초에서 제한HUD가 33.0이 되지 않음
같은 보너스 재접촉 시도추가 변화 없음비활성화와 한 번 처리
Ready, Won, Lost의 거부 경로시간과 오브젝트 변화 없음diff에서 상태 문 뒤 return false가 시간·HUD 변경보다 앞서고, true 뒤에만 비활성화되는 순서를 줄별 추적
기존 수집물 3개점수 3, Won 정상AddScore와 결과 Panel
시간 0Lost 정상0.0, 실패 Panel과 타이머 정지
Won과 Lost 뒤 RestartReady, 30.0, 오브젝트 복원두 경로의 초기 상태
NO SILENT PASS

Agent가 테스트했다고 말해도 교수자가 직접 같은 조건을 재현합니다. 실행하지 못한 항목은 “미확인”으로 남기고 완료로 바꾸지 않습니다.

FAIL은 가장 가까운 책임으로 돌아갑니다

prompt를 처음부터 다시 쓰거나 전체 기능을 재생성하지 않습니다. 실패한 관찰과 가장 가까운 파일 또는 연결 하나만 확인합니다.

Console에 TryAddTime가 없다는 오류가 납니다

메서드가 실제 GameManager 클래스 안에 추가되었는지, 이름과 매개변수가 호출부와 같은지 확인합니다. 다른 클래스나 중괄호 밖에 들어갔다면 그 위치만 수정합니다.

접촉해도 아무 일도 일어나지 않습니다

Console, TimeBonus의 GameManager 참조, Collider2D Is Trigger, Player Tag와 Rigidbody2D 조건을 기존 Collectible과 순서대로 비교합니다.

Ready에서 보너스가 사라집니다

TryAddTime의 반환값을 확인하기 전에 collected 또는 SetActive가 실행되는지 봅니다. 승인에 실패하면 TimeBonus는 그대로 남아야 합니다.

28초에서 33초가 됩니다

Mathf.Min(timeRemaining + seconds, roundDuration)의 두 번째 인자가 상한인지 확인합니다. Mathf.Max 또는 인자 순서 오류를 고칩니다.

Restart 뒤 TimeBonus가 돌아오지 않습니다

현재 Scene 재로드가 실제로 실행되는지와 TimeBonus가 Scene에 저장된 활성 GameObject인지 확인합니다. runtime 비활성화는 Scene 재로드 뒤 원래 저장 상태로 돌아와야 합니다.

Agent가 Scene이나 package를 바꾸었습니다

검증을 중단하고 변경 목록을 저장합니다. 체크포인트와 diff로 범위 밖 변경을 되돌린 뒤 Plan과 권한을 다시 잠급니다. 그 상태를 숨기고 계속 진행하지 않습니다.

코드 구술은 네 질문이면 충분합니다

줄을 외우지 않습니다. 데이터의 주인, 사건 전달자, 거부 조건과 관찰 가능한 결과를 연결해 설명합니다.

OWNER

누가 시간을 소유합니까?

GameManager가 timeRemaining과 상태를 소유하고 상한을 결정합니다.

EVENT

누가 접촉을 전달합니까?

TimeBonus가 Player 접촉을 확인하고 TryAddTime을 한 번 요청합니다.

REJECT

언제 아무 일도 하지 않습니까?

Playing이 아니거나 값이 0 이하이거나 참조가 없거나 이미 처리한 경우입니다.

PROOF

작동을 어떻게 증명합니까?

20+5, 28+5, 한 번 처리, 상태 거부와 기존 루프 회귀를 실행합니다.

3교시는 같은 결과를 혼자 증명합니다

교수자의 prompt와 코드를 그대로 붙이는 것이 목표가 아닙니다. 자신의 프로젝트 이름과 구조를 Ask로 확인하고, 실제 Plan을 승인한 뒤 같은 테스트 계약을 만족시킵니다.

  1. BASELINE

    작동하는 시작점

  2. ASK

    실제 이름 확인

  3. PLAN

    구현 코드 2개 승인

  4. AGENT

    script-only 실행

  5. MANUAL

    Inspector 연결

  6. PROOF

    8 / 8 PASS와 구술

PERIOD 03 / INDIVIDUAL MISSION

5초를 더하되 구현 코드는 두 파일로 제한하라

60분 안에 자신의 기존 프로젝트에 Time Bonus를 추가하고 AI 사용 로그, 실제 diff, 여덟 테스트와 90초 코드 구술을 남깁니다.

3교시 미션 열기 →

시연 중 확인할 공식 자료

코드 예시는 7주차 GameManager 구조를 기준으로 합니다. 학생 프로젝트의 이름과 책임이 다르면 같은 계약을 유지한 채 실제 구조에 맞게 조정합니다.