2교시의 도착점
교수자의 한 번의 완성 시연을 통해 3교시에서 학생이 독립적으로 수행할 승인 지점, 코드 책임, 수동 연결과 테스트 순서를 봅니다.
- 01
Ask에서 현재 데이터 소유자와 호출 흐름을 수정 없이 확인합니다.
- 02
Plan에서 두 파일, 수동 작업, 위험과 테스트를 승인합니다.
- 03
script-only Agent 뒤 실제 diff를 줄별 책임으로 검토합니다.
- 04
Inspector에서 직접 연결하고 새 기능과 기존 게임 루프를 함께 검증합니다.
60분의 설명과 시연 흐름
가장 빠른 실행이 아니라 가장 짧게 설명하고 되돌릴 수 있는 변경을 완성합니다.
한 기능, 두 파일, 여덟 테스트
Demonstration / professor-led
- baseline과 체크포인트
기존 게임 루프를 실행하고 Console 0, 저장 상태와 변경 전 파일 목록을 확인합니다.
- Ask로 구조 읽기
GameManager가 시간과 상태를 소유하고 Trigger가 사건을 전달하는 구조를 설명받아 실제 코드와 대조합니다.
- 문제 계약 확정
+5초, 30초 상한, Playing 전용, 정확히 한 번과 두 파일 범위를 잠급니다.
- Plan 검토와 승인
예상 diff, 수동 Inspector 작업, 실패 가능성과 테스트가 모두 있는지 확인합니다.
- script-only Agent 실행
구현 코드 두 C# 파일만 허용하고 예기치 않은 구현 파일 또는 명령이 나오면 중단합니다.
- diff와 컴파일 검토
상태 문, 상한, 반환값, 한 번 처리와 기존 함수 보존을 읽고 Console을 확인합니다.
- 수동 Unity 연결
TimeBonus GameObject, Collider2D, Component와 GameManager 참조를 사람이 직접 연결합니다.
- 새 기능과 회귀 테스트
경계값, 한 번 처리, 상태 거부, 기존 성공, 실패와 재시작을 실행하고 코드를 구술합니다.
시연 목표: 남은 시간을 한 번만 안전하게 늘립니다
새 mechanic의 값과 경계를 먼저 계산해 두면 코드가 달라도 같은 행동을 판정할 수 있습니다.
Player가 TimeBonus Trigger에 처음 닿으면 Playing에서만 남은 시간에 5초가 더해집니다. 결과는 30초를 넘지 않고, 보너스는 성공 뒤 사라집니다. Ready, Won, Lost에서는 시간을 바꾸거나 사라지지 않습니다.
- 접촉
- Player Tag의 Collider2D
- 값
bonusSeconds = 5f- 횟수
- 오브젝트마다 최대 1회
- 허용
CurrentState == Playing- 계산
current + 5- 상한
Mathf.Min(..., roundDuration)
- 데이터
timeRemaining변경- UI
UpdateHud()즉시 호출- 오브젝트
- 승인 뒤 비활성화
- 점수
AddScore흐름 유지- 종료
- Won, Lost 규칙 유지
- 초기화
- Restart로 원래 상태 복원
코드 전에 기대 결과 계산하기
상태와 현재 시간을 바꾼 뒤 Time Bonus를 적용하면 어떤 값이 되어야 하는지 확인합니다.
Playing이므로 20.0 + 5.0을 허용하고 30.0에서 제한합니다.
첫 요청은 변경이 아니라 구조 설명입니다
AI의 설명을 곧바로 믿지 않습니다. 답에 나온 클래스, 필드와 함수명을 실제 두 Script에서 찾아 일치 여부를 표시합니다.
| Ask의 주장 | 실제 확인 위치 | 통과 질문 |
|---|---|---|
| 시간 소유자 | GameManager.timeRemaining | 같은 사실을 저장하는 변수가 다른 Script에도 있는가 |
| 상태 문 | CurrentState != GameState.Playing | 종료 뒤에도 시간이나 사건이 진행되는가 |
| 화면 갱신 | UpdateHud() | 데이터 변경 직후 UI가 같은 값을 표시하는가 |
| Trigger 관례 | OnTriggerEnter2D, Player Tag | 기존 Collectible과 같은 연결 조건을 재사용할 수 있는가 |
계획은 실행 순서보다 승인 표입니다
좋은 Plan은 무엇을 할지만 말하지 않습니다. 어떤 파일을 바꾸지 않을지와 무엇으로 실패를 알 수 있는지도 함께 적습니다.
- 01
GameManager.csTryAddTime(float seconds)를 추가합니다. Playing과 양수 여부를 검사하고, 30초 상한으로 시간을 바꾸고 HUD를 갱신한 뒤 성공 여부를 반환합니다.승인 기존 Update, AddScore와 FinishRound를 바꾸지 않습니다.
- 02
TimeBonus.csPlayer 접촉과 한 번 처리 여부를 검사하고 GameManager가 변경을 승인한 경우에만 자신을 비활성화합니다.
승인 시간 데이터 자체를 저장하거나 직접 바꾸지 않습니다.
- 03
사람의 Scene 작업
교수자가 TimeBonus GameObject, SpriteRenderer, Collider2D Is Trigger, Script와 GameManager 참조를 Inspector에서 직접 연결합니다.
승인 Agent가
*.unity또는 Prefab을 쓰지 않습니다. - 04
컴파일과 행동 검증
Console을 먼저 확인하고 20+5, 28+5, 중복 접촉, 상태 거부와 기존 전체 루프를 실행합니다.
승인 테스트하지 않은 항목은 완료라고 표시하지 않습니다.
실행 직전에 권한과 중단 조건을 다시 읽습니다
Plan을 잘 썼어도 Agent 권한이 넓으면 실행 중 더 많은 대상을 바꿀 수 있습니다. 권한 설정과 prompt의 금지 범위를 함께 사용합니다.
두 파일의 코드 변경만 요청
현재 Plan과 일치하면 실행 활동을 펼쳐 매개변수와 결과를 확인합니다.
Scene 또는 세 번째 구현 파일 요청
승인하지 않고 Plan으로 돌아갑니다. 새 필요가 목표에 필수인지 사람이 먼저 판단합니다.
각 Script는 하나의 책임만 가집니다
GameManager는 시간 규칙을 소유하고, TimeBonus는 접촉 사건을 한 번 전달합니다. 같은 데이터를 두 곳에서 관리하지 않습니다.
public bool TryAddTime(float seconds)
{
if (CurrentState != GameState.Playing || seconds <= 0f)
{
return false;
}
timeRemaining = Mathf.Min(
timeRemaining + seconds,
roundDuration
);
UpdateHud();
return true;
}
bool요청이 실제로 받아들여졌는지 호출자에게 돌려줍니다.
PlayingReady, Won과 Lost에서 시간 변경을 거부합니다.
seconds <= 0f잘못된 0 또는 음수 입력을 시간 추가로 처리하지 않습니다.
Mathf.Min현재 시간에 보너스를 더하되 roundDuration을 상한으로 사용합니다.
UpdateHud데이터를 바꾼 같은 사건에서 화면도 즉시 갱신합니다.
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.TryAddTime | false 반환, 오브젝트 유지 |
| 시간과 HUD 변경 | GameManager | 승인 전에는 아무 변화 없음 |
| 한 번 처리 기록 | TimeBonus | 승인한 사건에만 collected = true |
| 시각 결과 | TimeBonus | 성공한 경우에만 비활성화 |
Scene 연결은 학생이 볼 수 있게 직접 수행합니다
script-only 권한을 선택했으므로 코드 밖의 연결은 자동으로 생기지 않습니다. 이 구간이 Component와 참조 관계를 이해하는 학습입니다.
- 01
기존 수집물을 복제해 역할 분리
Hierarchy에서 작동하는 Collectible 하나를 복제하고 이름을
TimeBonus로 바꿉니다. 기존CollectibleComponent는 제거합니다.확인 SpriteRenderer와 Collider2D는 남고 점수 Script는 없습니다.
- 02
표현과 Trigger 확인
시계 또는 기존 placeholder Sprite를 연결하고 Collider2D의 Is Trigger를 켭니다. Player Tag를 비교하고 Player 또는 TimeBonus 중 적어도 하나에 활성
Rigidbody2D가 있는지 확인합니다.확인 물리 조건이 갖춰지고 Console Error 0, Missing Script 0입니다.
- 03
TimeBonus추가Add Component로 새 Script를 붙이고 Inspector의 Game Manager에 Scene의 GameManager 오브젝트를 끌어 놓습니다. Bonus Seconds는 5로 둡니다.
확인 참조가 None이 아니고 값이 5입니다.
- 04
Build Profiles의 시작 Scene 확정
File → Build Profiles → Scene List → Add Open Scenes를 누릅니다.Week11_TimeBonus를 첫 번째 활성 Scene으로 옮기거나 이전 Scene을 비활성화하고, 체크 상태와 중복 여부를 확인합니다.확인 목록의 첫 번째 활성 항목이
Week11_TimeBonus라서 Build and Run이 그 Scene으로 시작합니다. - 05
Scene 저장 전 diff 분리
Scene과
.meta는 사람이 한 작업과 Unity 생성 산출물입니다. Agent가 바꾼 두 Script의 diff와 로그에서 작성 주체를 별도 항목으로 기록합니다.확인 누가 무엇을 바꿨는지 다시 설명할 수 있습니다.
가까운 증거부터 넓은 증거로 확인합니다
새 코드를 넣은 뒤 바로 전체 플레이만 반복하지 않습니다. 컴파일, 연결, 경계값, 사건 횟수와 기존 루프 순서로 실패 범위를 좁힙니다.
| 조건 | 기대 결과 | 보는 증거 |
|---|---|---|
| 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 |
| 시간 0 | Lost 정상 | 0.0, 실패 Panel과 타이머 정지 |
| Won과 Lost 뒤 Restart | Ready, 30.0, 오브젝트 복원 | 두 경로의 초기 상태 |
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과 권한을 다시 잠급니다. 그 상태를 숨기고 계속 진행하지 않습니다.
코드 구술은 네 질문이면 충분합니다
줄을 외우지 않습니다. 데이터의 주인, 사건 전달자, 거부 조건과 관찰 가능한 결과를 연결해 설명합니다.
누가 시간을 소유합니까?
GameManager가 timeRemaining과 상태를 소유하고 상한을 결정합니다.
누가 접촉을 전달합니까?
TimeBonus가 Player 접촉을 확인하고 TryAddTime을 한 번 요청합니다.
언제 아무 일도 하지 않습니까?
Playing이 아니거나 값이 0 이하이거나 참조가 없거나 이미 처리한 경우입니다.
작동을 어떻게 증명합니까?
20+5, 28+5, 한 번 처리, 상태 거부와 기존 루프 회귀를 실행합니다.
3교시는 같은 결과를 혼자 증명합니다
교수자의 prompt와 코드를 그대로 붙이는 것이 목표가 아닙니다. 자신의 프로젝트 이름과 구조를 Ask로 확인하고, 실제 Plan을 승인한 뒤 같은 테스트 계약을 만족시킵니다.
- BASELINE
작동하는 시작점
- ASK
실제 이름 확인
- PLAN
구현 코드 2개 승인
- AGENT
script-only 실행
- MANUAL
Inspector 연결
- PROOF
8 / 8 PASS와 구술
시연 중 확인할 공식 자료
코드 예시는 7주차 GameManager 구조를 기준으로 합니다. 학생 프로젝트의 이름과 책임이 다르면 같은 계약을 유지한 채 실제 구조에 맞게 조정합니다.
- Unity in-Editor AI Assistant 모드 설명 ↗Ask, Plan, Agent와 read-only, write scripts only, full autonomy 권한
- Unity 6.6 Mathf.Min ↗두 값 중 작은 값으로 시간 상한 적용
- Unity 6.6 OnTriggerEnter2D ↗2D Trigger 접촉 메시지와 Collider2D 조건
- Unity 6.6 Component.CompareTag ↗Collider2D인 other가 Player Tag인지 확인하는 API
- Unity 6.6 SerializeField ↗private field를 Inspector에 직렬화해 참조와 값을 연결
- Unity 6.6 Build Profiles Scene List ↗열린 Scene을 build 목록에 추가하고 포함 여부 확인
- Git diff 공식 문서 ↗working tree 변경과 파일별 patch 검토