Unity에서 양궁 메커니즘 구현

Unity의 양궁 메커니즘은 플레이어가 활에서 화살을 쏠 수 있는 재미있고 매력적인 게임 플레이 경험을 만드는 데 사용할 수 있습니다. 이 튜토리얼은 활을 당기고, 조준하고, 화살을 쏘는 것을 포함한 기본 양궁 메커니즘을 구현하는 방법을 안내합니다.

1. 활과 화살 설치

시작하려면 간단한 활과 화살 설정이 필요합니다. 직접 모델링하거나 Unity Asset Store에서 자산을 다운로드할 수 있습니다. 이 튜토리얼에서는 활과 화살의 3D 모델이 준비되었다고 가정합니다.

2. 활과 화살 스크립트 만들기

활을 당기고, 조준하고, 쏘는 기능을 처리하는 BowAndArrow 스크립트를 생성하겠습니다.

using UnityEngine;

public class BowAndArrow : MonoBehaviour
{
    public GameObject arrowPrefab; // Reference to the arrow prefab
    public Transform bowString; // Reference to the bowstring for drawing
    public Transform spawnPoint; // Point where the arrow will be spawned
    public float drawSpeed = 2f; // Speed at which the bowstring is drawn
    public float maxDrawDistance = 3f; // Maximum draw distance for the bowstring
    public float arrowForce = 50f; // Force applied to the arrow when shot

    private float drawDistance = 0f; // Current draw distance of the bowstring

    void Update()
    {
        // Draw the bowstring when holding the fire button
        if (Input.GetButton("Fire1"))
        {
            DrawBow();
        }

        // Shoot the arrow when the fire button is released
        if (Input.GetButtonUp("Fire1") && drawDistance > 0f)
        {
            ShootArrow();
        }
    }

    void DrawBow()
    {
        // Increase the draw distance while holding the fire button
        drawDistance = Mathf.Clamp(drawDistance + drawSpeed * Time.deltaTime, 0, maxDrawDistance);
        bowString.localPosition = new Vector3(0, drawDistance, 0);
    }

    void ShootArrow()
    {
        // Instantiate and shoot the arrow
        GameObject arrow = Instantiate(arrowPrefab, spawnPoint.position, spawnPoint.rotation);
        Rigidbody arrowRb = arrow.GetComponent();
        arrowRb.AddForce(spawnPoint.forward * arrowForce * drawDistance, ForceMode.VelocityChange);

        // Reset the bowstring
        drawDistance = 0f;
        bowString.localPosition = Vector3.zero;
    }
}

이 스크립트는 플레이어가 발사 버튼을 누르고 활줄을 당길 수 있게 하며, 발사 버튼을 놓으면 화살이 인스턴스화되고 활줄을 당긴 거리에 비례하는 힘으로 발사됩니다. 화살은 활이 향하는 방향으로 속도가 주어집니다.

3. 화살표 프리팹 ​​만들기

이제 플레이어가 쏘면 인스턴스화될 화살표 프리팹을 만듭니다. 화살표는 물리 기반 이동을 위한 Rigidbody 구성 요소가 있어야 하며, 선택적으로 다른 객체와 상호 작용하기 위한 Collider가 있어야 합니다.

  1. 씬에 새로운 GameObject를 만든 다음, 화살표의 3D 모델을 추가합니다(자체 모델이나 Unity 에셋 스토어에서 얻은 에셋).
  2. 물리 기반 움직임을 위해 화살표에 Rigidbody 구성 요소를 추가합니다.
  3. 다른 객체와의 충돌을 처리하려면 Collider 구성 요소(BoxCollider나 CapsuleCollider 등)를 추가합니다.
  4. 이 게임오브젝트를 프로젝트 창으로 끌어서 프리팹으로 만듭니다.

4. 활을 조준하다

활을 조준하려면 마우스나 오른쪽 엄지스틱(게임패드용)을 사용하여 간단한 메커니즘을 구현할 수 있습니다. 이 예에서, 우리는 플레이어가 마우스를 사용하여 활을 돌려 조준하도록 허용할 것입니다.

using UnityEngine;

public class BowAiming : MonoBehaviour
{
    public float rotationSpeed = 5f; // Speed at which the bow rotates

    void Update()
    {
        // Rotate the bow based on mouse movement
        float horizontal = Input.GetAxis("Mouse X");
        float vertical = Input.GetAxis("Mouse Y");

        transform.Rotate(Vector3.up * horizontal * rotationSpeed);
        transform.Rotate(Vector3.left * vertical * rotationSpeed);
    }
}

BowAiming 스크립트는 마우스의 X 및 Y 움직임에 따라 활을 회전합니다. 이를 통해 플레이어는 활을 어느 방향으로든 조준할 수 있습니다. rotationSpeed을 조정하여 활의 움직임을 마우스 입력에 더 민감하게 또는 덜 민감하게 만들 수 있습니다.

5. 화살표 비행 및 충돌 추가

화살의 비행은 Rigidbody 구성 요소에 의해 처리되며, 화살이 발사될 때 힘을 적용합니다. 화살을 더 현실적으로 만들려면 충돌을 감지하고 적에게 피해를 주거나 표면에 달라붙는 것과 같은 이벤트를 트리거하는 Arrow 스크립트를 추가할 수 있습니다.

using UnityEngine;

public class Arrow : MonoBehaviour
{
    private void OnCollisionEnter(Collision collision)
    {
        // Check for collision with an enemy or other object
        if (collision.gameObject.CompareTag("Enemy"))
        {
            // Handle damage or effects here
            Debug.Log("Arrow hit the enemy!");
            Destroy(gameObject); // Destroy the arrow on impact
        }
        else
        {
            // Destroy arrow if it hits something else
            Destroy(gameObject, 2f); // Arrow disappears after 2 seconds
        }
    }
}

Arrow 스크립트는 다른 객체와의 충돌을 감지합니다. 화살이 적을 맞히면 데미지나 다른 효과를 트리거할 수 있습니다. 지금은 단순히 메시지를 기록하고 화살을 파괴합니다. 이 스크립트를 확장하여 데미지를 입히거나, 특수 효과를 만들거나, 화살을 객체에 붙일 수 있습니다.

6. 그리기 강도를 위한 UI 구현

플레이어에게 활을 얼마나 당겼는지에 대한 피드백을 제공하기 위해 현재 당김 강도를 보여주는 UI 요소를 표시할 수 있습니다. 간단한 슬라이더로 활줄의 당김 거리를 나타낼 수 있습니다.

  1. 씬에 UI 슬라이더를 만듭니다.
  2. 슬라이더의 값을 BowAndArrow 스크립트의 drawDistance에 연결합니다.
using UnityEngine;
using UnityEngine.UI;

public class BowAndArrow : MonoBehaviour
{
    public Slider drawStrengthSlider; // Reference to the UI slider

    void Update()
    {
        if (Input.GetButton("Fire1"))
        {
            DrawBow();
            drawStrengthSlider.value = drawDistance / maxDrawDistance; // Update the slider
        }

        if (Input.GetButtonUp("Fire1") && drawDistance > 0f)
        {
            ShootArrow();
            drawStrengthSlider.value = 0f; // Reset the slider after shooting
        }
    }
}

이렇게 하면 슬라이더의 값이 drawDistance에 따라 업데이트되어 플레이어가 활을 얼마나 당겼는지 시각적으로 표시합니다.

7. 테스트 및 미세 조정

이제 게임을 플레이하고 활과 화살의 메커니즘을 테스트해 보세요. 다음 사항을 확인하세요.

  • 활줄은 부드럽게 당겨지고 쏘고 난 후 원래대로 돌아옵니다.
  • 화살표는 올바른 방향으로 이동하며 충돌에 반응합니다.
  • 조준 시스템은 예상대로 작동하며 반응성도 좋습니다.

drawSpeed, arrowForce, rotationSpeed와 같은 값을 미세 조정하여 원하는 게임플레이 느낌에 맞출 수 있습니다.

결론

우리는 활, 화살 역학, 조준, 사격을 특징으로 하는 간단하지만 효과적인 양궁 시스템을 Unity에 구현했습니다. 또한, 우리는 드로우 강도를 보여주는 UI 요소를 포함했습니다. 이 시스템은 화살 유형, 적의 반응, 특수 효과와 같은 추가 기능으로 확장하여 더 복잡한 양궁 경험을 제공할 수 있습니다.