지난번에 이어 게임을 만들어보자.
이번에 참고할 강의는 아래 강의이다.
https://www.youtube.com/watch?v=rZAnnyensgs&list=PLctzObGsrjfyevwpeEVQ9pxGVwZtS7gZK&index=3
이번 강의에서는 무기를 만들어본다.
시작해보자.
먼저 무기를 간단하게 표현하자.
빈 오브젝트 Gun 을 만들어 플레이어 앞쪽에 놓는다.
해당 오브젝트 하위(자식)오브젝트로 빈 오브젝트 Gun_Graphics 를 생성하고,
그 하위 오브젝트로 큐브 오브젝트들을 추가해 총을 만든다.
큐브를 여러개 만든 다음 크기를 조절하고 돌리고 옮겨서 간단하게 총 형태로 만든다.
Material 에 Gun 을 만들어서 총 재질을 추가하고 색상을 설정해준다음 큐브들에 적용하자.
지금은 총의 몸체 부분이 Gun 오브젝트의 위치에 있다.
Gun_Graphics 오브젝트의 위치를 조정하여 총의 손잡이 부분이
Gun 오브젝트의 위치에 오게 해야 나중에 손에 들게 할 때 지정한 위치에 온다.
이제 스크립트 폴더에 총 스크립트인 Gun, GunController 를 만들자.
먼저 GunController 스크립트를 작성하자.
| GunController 스크립트
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
public class GunController : MonoBehaviour {
public Transform weaponHold; // 무기 위치, 즉 플레이어 손 위치
public Gun startingGun; // 시작 무기
Gun equippedGun; // 착용중인 무기
private void Start() {
if (startingGun != null) { // 시작 무기가 있다면
EquipGun(startingGun); // 시작 무기를 착용한다.
}
}
public void EquipGun(Gun gunToEquip) { // 무기 착용 메소드
if (equippedGun != null) { // 무기를 착용중인지 확인
Destroy(equippedGun.gameObject);
// 착용중이라면 현재 무기(오브젝트) 파괴
}
equippedGun = Instantiate(gunToEquip, weaponHold.position, weaponHold.rotation) as Gun;
// 무기, weaponHold 의 위치, 회전값을 받아 무기를 해당 위치에 생성(착용)한다.
equippedGun.transform.parent = weaponHold;
// 착용중인 총에 전달받은 총 오브젝트를 생성하여 전달.
}
}
무기를 착용할 플레이어의 손 위치 오브젝트 Player_Hand 를 만든다.
위치를 적당히 플레이어 손 쪽으로 설정하자.
Player 오브젝트에 GunController 스크립트를 추가하고,
Weapon Hold 에 Player_Hand 오브젝트를 전달.
Gun 오브젝트에 Gun 스크립트를 추가하자.
Prefabs 폴더를 만들고 위에서 만든 Gun 오브젝트를 해당 폴더에 넣자.
이제 Gun 은 프리팹 폴더에 저장되었으므로 씬에 지운다.
Player 오브젝트의 GunController 스크립트의 startingGun 에
프리팹 폴더에 저장한 Gun 을 넣어주자.
이제 실행해보면 플레이어가 총을 들고 돌아다닐 수 있다.
이제 총알을 발사하는 기능을 만들어보자.
먼저 총알에 사용할 스크립트 Projectile 을 생성한다.
| Projectile 스크립트
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
public class Projectile : MonoBehaviour
{
float speed = 10.0f; // 기본 속도
public void SetSpeed(float newSpeed) // 속도 설정 메소드
{
speed = newSpeed; // 입력받은 속도로 설정
}
void Update()
{
transform.Translate(Vector3.forward * Time.deltaTime * speed);
// 총알 이동
}
}
위와 같이 작성하여 나중에 총알 프리팹에 적용하자.
나중에 총, 총 컨트롤러 스크립트를 통해 총알 오브젝트를 생성,
총알 오브젝트를 정해진 속도로 움직이게 한다.
Gun 스크립트도 작성하자.
| Gun 스크립트
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
public class Gun : MonoBehaviour
{
public Transform muzzle; // 총알 발사 위치
public Projectile projectile; // 총알
public float msBetweenShots = 100; // 총알 발사 시간 간격
public float muzzleVelocity = 35; // 총알 발사 속도
float nextShotTime; // 다음 총알 발사 시간
public void Shoot() // 총알 발사 메소드
{
if(Time.time > nextShotTime) // 총알 발사 시간이 지났는지 확인
{
nextShotTime = Time.time + msBetweenShots / 1000; // 다음 총알 발사 시작 시간 저장
Projectile newProjectile = Instantiate(projectile, muzzle.position, muzzle.rotation) as Projectile;
// 총알 프리팹을 통해 오브젝트를 인스턴스화 하여 생성.
newProjectile.SetSpeed(muzzleVelocity); // 총알 발사 속도 설정
}
}
}
총의 정보와 총알 발사 메소드를 작성한다.
총알이 나가는 위치, 총알 오브젝트, 총알 발사 간격, 속도 등의 정보를 통해
총알을 인스턴스화 하여 생성, 발사(이동)시킨다.
이제 총알이 나가는 위치를 만들어둔 총 프리팹에 추가하고,
총알 프리팹도 만들자.
총 프리팹을 씬으로 가져와 수정하자. (프리팹에서 직접 수정해도 된다)
Gun 오브젝트의 하위에 빈 오브젝트 Projectile Spwan 을 생성, 총구 위치로 지정하자.
이제 그 하위에 Bullet 이라는 큐브 오브젝트를 생성하고 크기를 설정한다.
매터리얼과 Projectile 스크립트도 적용해주고 프리팹 폴더로 끌어놔서 총알 프리팹을 만들어준다.
Bullet 프리팹을 만들었다면 Projectile Spawn 에서 삭제하고,
Gun 오브젝트에 적용된 Gun 스크립트의 Muzzle 에 Projectile Spawn 을,
Projectile 에 Bullet 을 적용한다.
총 프리팹을 다시 저장해준다.
지난번에 작성한 Player 스크립트에 총을 발사하기 위한
동작을 판단하는 부분을 추가하자.
| Player 스크립트
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
[RequireComponent(typeof(GunController))] // GunController 스크립트를 포함
[RequireComponent(typeof(PlayerController))] // PlayerController 스크립트를 포함
public class Player : MonoBehaviour
{
public float moveSpeed = 5.0f; // 플레이어 이동속도
Camera viewCamera; // 카메라
PlayerController controller; // 플레이어 컨트롤러
GunController gunController; // 총 컨트롤러
void Start() {
controller = GetComponent<PlayerController>();
// 현재 오브젝트의 플레이어 컨트롤러를 가져옴
gunController = GetComponent<GunController>();
// 현재 오브젝트의 총 컨트롤러를 가져옴
viewCamera = Camera.main;
// 카메라
}
void Update() {
// 이동 입력
Vector3 moveInput = new Vector3(Input.GetAxisRaw("Horizontal"), 0, Input.GetAxis("Vertical"));
// GetAxisRaw 로 스무딩 X
Vector3 moveVelocity = moveInput.normalized * moveSpeed;
// normalized 로 단위벡터로 변환, 이동 속도를 계산
controller.Move(moveVelocity);
// 이동 속도를 이동 메소드로 전달
// 방향 입력
Ray ray = viewCamera.ScreenPointToRay(Input.mousePosition);
// 카메라 -> 마우스 커서 위치로 레이 발사.
Plane groundPlane = new Plane(Vector3.up, Vector3.zero);
// 평면의 법선벡터 생성.
float rayDistance;
// 위에서 쏜 레이와 평면의 교차지점까지 거리
if (groundPlane.Raycast(ray, out rayDistance)) {
// 레이가 평면과 교차하는 경우 교차지점까지의 거리를 rayDistance 에 저장.
Vector3 point = ray.GetPoint(rayDistance);
// GetPoint 와 교차지점까지의 거리로 교차지점의 위치를 저장.
// 카메라부터 교차지점까지 선으로 표시 : Debug.DrawLine(ray.origin, point, Color.red);
controller.LookAt(point);
// 플레이어 컨트롤러의 방향 전환 메소드에 교차 지점(방향) 전달.
}
// 무기 조작 입력
if (Input.GetMouseButton(0)) // 마우스 왼쪽 버튼 클릭 확인
{
gunController.Shoot(); // 총알 발사 메소드 호출
}
}
}
GunController 를 사용하여 gunController 를 생성하고,
마우스 좌클릭을 입력받을 때 Shoot 메소드(총알 발사 메소드)를 호출한다.
이제 GunController 스크립트에 Shoot 메소드를 추가하자.
| GunController 스크립트
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
public class GunController : MonoBehaviour {
public Transform weaponHold; // 플레이어 손(총)위치
public Gun startingGun; // 시작 총
Gun equippedGun; // 착용하는 총
private void Start() {
if (startingGun != null) { // 시작 총이 설정된 경우
EquipGun(startingGun); // 시작 총을 착용
}
}
public void EquipGun(Gun gunToEquip) { // 총 착용 메소드
if (equippedGun != null) { // 착용중인 총이 있다면
Destroy(equippedGun.gameObject); // 착용중인 총(오브젝트)를 제거(파괴)
}
equippedGun = Instantiate(gunToEquip, weaponHold.position, weaponHold.rotation) as Gun;
// 착용중인 총에 전달받은 총 오브젝트를 인스턴스화하여 생성
equippedGun.transform.parent = weaponHold;
// 착용중인 총의 위치를 설정, 부모 오브젝트를 설정하여 위치를 부모 오브젝트의 위치로.
}
public void Shoot() // 총알 발사 메소드
{
if(equippedGun != null) // 착용중인 총이 있다면
{
equippedGun.Shoot(); // 총의 Shoot 메소드로 총알을 발사.
}
}
}
Shoot 메소드로 착용중인 총이 있다면 착용중인 총의
Shoot 메소드로 총알을 발사한다.
이제 게임을 실행하여 테스트해보자!
위와 같이 잘 실행되는 것을 볼 수 있다.
참고 영상 : https://www.youtube.com/watch?v=rZAnnyensgs&list=PLctzObGsrjfyevwpeEVQ9pxGVwZtS7gZK&index=3
'Unity > 게임개발' 카테고리의 다른 글
[Unity] 게임 개발 일지 | 탑다운 슈팅 6 (0) | 2023.11.24 |
---|---|
[Unity] 게임 개발 일지 | 탑다운 슈팅 5 (1) | 2023.11.23 |
[Unity] 게임 개발 일지 | 탑다운 슈팅 4 (0) | 2023.11.22 |
[Unity] 게임 개발 일지 | 탑다운 슈팅 3 (1) | 2023.11.22 |
[Unity] 게임 개발 일지 | 탑다운 슈팅 1 (0) | 2023.11.16 |