화살을 발사하는 오브젝트🏹
Last updated
Last updated
전반적인탐험하기에서 장애물 게임을 만들 때 유용한 화살을 발사하는 오브젝트를 만들어 보아요! 화살의 방향과 날아가는 거리를 정해서 화살을 발사하는 코드를 만들 수 있어요.
화살을 발사하는 오브젝트를 만들기의 핵심은 복제본의 활용입니다.
복제본을 잘 활용한다면 긴 코드를 단 하나의 오브젝트에서만 조립해도, 오브젝트가 원래 여러 개인 것처럼 빠르고 쉽게 코딩할 수 있습니다.
이러한 복제본과 함께 자주 등장하는 변수의 종류가 있습니다. 바로 이 맵에서만 사용의 "이 오브젝트에서 사용" 을 가진 변수입니다.
'이 오브젝트에서 사용' 변수를 활용하면 여러 개의 복제본이 각각 서로 다른 정보를 가지도록 할 수 있습니다. 이 때 변수의 초기값은 복제본을 생성하기 직전에 정의해 줄 수 있습니다.
함수는 코드를 더욱 짧고 보기 쉽도록 만들어 줄 수 있습니다.
특히 서로 다른 값을 가지는 복제본을 여러 개 만드는 경우, 반복되는 긴 블록들을 새로운 복제본을 만들 때마다 전부 복사 & 붙여넣기로 이어붙여야 하기 때문에 코드가 길어지고 수정하기도 번거롭습니다.
이 경우 값 리본 블럭을 활용하여 함수 하나로 반복되는 블록들을 직관적이고 보기 편한 하나의 블록으로 만들어 여러개의 복제본을 보다 간편하게 생성할 수 있습니다.
코드는 화살이 복제본을 생성하고, 생성된 화살의 복제본이 플레이어(아바타)의 위치를 감지하여 발사되는 과정을 반복하는 식으로 진행됩니다.
코드를 작성하기 전 다음과 같이 화살을 발사할 오브젝트들과 화살 오브젝트를 월드에 설치합니다. 둘 중 화살 오브젝트만 코딩 오브젝트 목록에 가져와줍니다.
이제 생성할 화살 복제본들이 각각 가지게 될 변수들을 준비해 줍니다. ※이때 이 변수는 화살 오브젝트를 클릭한 뒤 생성한 [이 오브젝트에서 사용] 변수여야 합니다.
서로 다른 변수값들을 복제본에 각각 쉽게 저장할 수 있도록, 리본 블록으로 값을 받아서 변수에 저장한 후 복제본을 생성하는 함수를 만들어줍니다.
그 다음 화살이 날아가기 시작하는 위치, 방향, 거리 값을 입력합니다.
※ 이때 날아가기 시작하는 위치는 발사할 오브젝트의 타일 위치를 입력해 줍니다. ※ 발사할 오브젝트가 많아질 경우 노트나 빈 종이에 타일 위치와 방향, 거리를 각각 적어두면 더욱 수월하게 작업하실 수 있습니다.
위 함수 코드의 의미는 아래와 같습니다.
가로 2번째 타일, 세로 7번째 타일에서 왼쪽으로 2칸 발사될 화살 복제본을 생성합니다.
가로 5번째 타일, 세로 7번째 타일에서 아래쪽으로 2칸 발사될 화살 복제본을 생성합니다.
가로 8번째 타일, 세로 7번째 타일에서 위쪽으로 2칸 발사될 화살 복제본을 생성합니다.
가로 1번째 타일, 세로 7번째 타일에서 오른쪽으로 2칸 발사될 화살 복제본을 생성합니다.
다음은 생성된 각각의 복제본들이 동작을 반복해서 수행하는 코드를 조립해 줍니다.
주변 4개의 타일 내에 아바타가 존재하면 입력 받은 각각의 복제본의 변수값들을 통해 오브젝트의 생성 위치와 방향을 결정한 후 화살의 발사거리만큼 이동합니다.
이동이 모두 끝나면 이동이 끝난 지점에서 폭발 효과를 1크기로 실행한 뒤 모양을 숨겨줍니다.
2초를 기다린 후 다시 주변 4개의 타일 내에 아바타가 있는지 감지하는 코드로 돌아갑니다.
이렇게 자동으로 발사되는 화살을 코드로 만들어 보았어요!
위 코드를 활용하여 복제본이 플레이어의 위치와 상관없이 계속 회전하며 움직이도록 할 수 있습니다.
같은 방식으로 다양한 움직임을 가진 복제본을 배치하여 나만의 게임 패턴도 만들 수 있습니다.
움직임과 모양이 유사한 오브젝트들을 관리할 때는 복제본을 사용한다면 훨씬 많은 코드가 절약되고 관리하는데도 더욱 수월해질 거에요.
위 코드와 오브젝트를 활용한 장애물 맵을 '맵 템플릿' 기능을 활용하여 쉽게 만들어 볼 수 있어요!🏹 엔트리 탐험하기 > 월드 만들기 > 맵 목록 > 새로운 맵 만들기에서 아티의 '미로 게임' 맵 템플릿을 찾아보세요!
맵 템플릿을 불러와서 미로 게임을 쉽게 만들고, 코드도 확인하고, 나만의 미로 게임으로 업그레이드 해보세요!✨
📝 Written by 아티 ( 엔트리 탐험하기 서포터즈 2기 )