유니티로 3D 서바이벌 게임을 개발하는 과정에서 활 쏘기 시스템을 구현했습니다. 플레이어가 활을 조준하고 발사하는 애니메이션을 자연스럽게 연동시키는 작업이 주요 목표였습니다. 이번 개발일지에서는 활 쏘기 시스템의 구현 과정과 핵심 코드를 공유하려 합니다.
먼저 활 쏘기 시스템의 핵심이 되는 BowInputSystem 클래스를 선언하고 필요한 변수들을 정의했습니다.
using System;
using System.Collections;
using System.Collections.Generic;
using System.Numerics;
using UnityEngine;
using Vector3 = UnityEngine.Vector3;
public class BowInputSystem : MonoBehaviour
{
PlayerAnimController _playerAnimController;
CameraController _cameraController;
[System.Serializable]
public class InputSettings
{
public string aim = "Fire2";
public string fire = "Fire1";
}
[SerializeField]
public InputSettings input;
[Header("Aiming Settings")]
Ray ray;
RaycastHit hit;
public LayerMask aimLayers;
[Header("Spine Settings")]
public Transform spine;
public Vector3 spineOffset;
[Header("Head Rotation Settings")]
public float lookAtPoint = 2.8f;
public Bow bowScript;
public bool testAim;
public bool isAiming;
bool hitDetected;
Start 메서드는 스크립트가 처음 실행될 때 호출됩니다. 여기서 주요 컴포넌트를 초기화합니다.
private void Start()
{
_playerAnimController = GetComponent<PlayerAnimController>();
_cameraController = GetComponentInChildren<CameraController>();
}
Update 메서드는 매 프레임 호출되며, 여기서 조준 및 발사 상태를 업데이트합니다.
private void Update()
{
UpdateAim();
if (testAim)
isAiming = true;
if (isAiming)
{
Pull();
Aim();
bowScript.EquipBow();
_playerAnimController.PullString(Input.GetButton(input.fire));
if (Input.GetButtonUp(input.fire))
{
_playerAnimController.FireArrow();
if (hitDetected)
{
bowScript.Fire(hit.point);
}
else
{
bowScript.Fire(ray.GetPoint(300f));
}
}
}
else
{
bowScript.UnEquipBow();
bowScript.RemoveCrosshair();
DisableArrow();
Release();
}
}
UpdateAim 메서드는 현재 조준 상태를 업데이트합니다.
public void UpdateAim()
{
isAiming = Input.GetButton(input.aim);
_playerAnimController.Aim(isAiming);
}
Aim 메서드는 카메라를 통해 조준을 처리합니다.
private void Aim()
{
Vector3 camPosition = Camera.main.transform.position;
Vector3 dir = _cameraController.mainCam.transform.forward;
ray = new Ray(camPosition, dir);
if (Physics.Raycast(ray, out hit, 500f, aimLayers))
{
hitDetected = true;
Debug.DrawLine(ray.origin, hit.point, Color.green);
bowScript.ShowCrosshair(hit.point);
}
else
{
hitDetected = false;
bowScript.RemoveCrosshair();
}
}
다양한 활 관련 동작을 처리하는 메서드들입니다.
public void Pull()
{
bowScript.PullString();
}
public void EnableArrow()
{
bowScript.PickArrow();
}
public void DisableArrow()
{
bowScript.DisableArrow();
}
public void Release()
{
bowScript.ReleaseString();
}
활 쏘기 시스템을 구현함으로써 플레이어가 활을 조준하고 발사하는 동작을 자연스럽게 연결할 수 있었습니다. 이를 통해 게임의 몰입감을 높일 수 있었고, 캐릭터 애니메이션과 게임플레이가 더욱 일체화되었습니다. 이 글이 유니티로 게임을 개발하는 다른 분들께 도움이 되길 바랍니다. 감사합니다.
댓글 영역