대포 사거리
Coddy Unity 여정의 물리와 게임플레이 섹션에 포함된 레슨. 63개 중 61번째.
사격장 한쪽 끝에 대포가 있고, 세 개의 표적이 서로 다른 거리에 있는 사격장을 좌우로 미끄러지듯 움직입니다. 각 거리에 맞추려면 포신을 위아래로 기울이고, 표적이 사선과 교차할 때 발사하도록 타이밍을 맞춥니다. 표적에 맞은 포탄은 표적을 쓰러뜨리고 소모되며, 그 밖에 표적에 부딪히는 것은 표적을 건드리지 않습니다. 표적은 키네마틱 바디이므로 맞아도 밀리지 않으며, 대포에는 포탄이 다섯 발 있습니다.
스크립트 두 개를 작성하세요. Barrel에는 Cannon을, 각 표적에는 Target을 작성합니다.
챌린지
어려움Inspector에서 Cannon에 ballPrefab(Rigidbody: Ball 프리팹, 질량 2, 태그 Ball), angle(30), turnSpeed(40), power(30), balls(5)를 설정합니다.
- 위쪽 화살표를 누르면
angle이 커지고 아래쪽 화살표를 누르면 작아집니다. 초당turnSpeed도씩 움직이며, 10보다 작아지거나 60보다 커지지 않습니다. 매 프레임 포신의 회전을Quaternion.Euler(-angle, 0, 0)으로 설정합니다. Unity에서는 양수 x 각도가 앞쪽을 아래로 기울이므로, 마이너스 기호를 붙이면 위로 기울어집니다. balls가 0보다 클 때 스페이스바를 누르면 공을 발사합니다. 공은 포신 중심에서 포신 방향으로 1단위 앞에 생성하고, 포신 방향으로power만큼의 Impulse를 가한 다음balls를 1 줄이고 남은 개수를Balls left: 4와 같이 기록합니다. 공이 남아 있지 않으면 스페이스바를 눌러도 아무 일도 일어나지 않습니다.
각 타깃에는 키네마틱 Rigidbody가 있으며, Inspector에서 Target의 speed와 range를 설정합니다(Target1의 경우 각각 2와 3).
- 물리 업데이트가 실행될 때마다
MovePosition을 사용해 초당speed단위의 속도로 타깃을 x축을 따라 이동시키고, 시작 위치에서range단위만큼 떨어질 때마다 방향을 되돌립니다. - 공(태그가
Ball인 공)이 타깃에 맞으면 타깃의 이름과hit!를Target2 hit!와 같이 기록하고, 타깃과 공을 모두 제거합니다. 공이 아닌 물체는 타깃에 영향을 주지 않습니다.
Play를 눌러 타깃 세 개를 모두 쓰러뜨린 다음 Check를 누르세요.
직접 해보기
using UnityEngine;
public class Cannon : MonoBehaviour
{
[SerializeField] private Rigidbody ballPrefab;
[SerializeField] private float angle = 30f;
[SerializeField] private float turnSpeed = 40f;
[SerializeField] private float power = 30f;
[SerializeField] private int balls = 5;
void Update()
{
// 위아래 화살표 키로 조준하고 Space로 발사하세요
}
}
이 레슨에는 짧은 퀴즈가 포함되어 있습니다. 레슨을 시작해 문제를 풀고 진행 상황을 기록하세요.