유니티/게임 프로젝트

2D RPG - (15 - 2) 단검 투척 스킬 구현_02

monstro 2025. 1. 28. 00:05
728x90
반응형

이번 포스트에서는 단검 투척 스킬에서 단검을 위한 스크립트를 구현해보겠습니다.

 

1) SkillThrowingSwordController

public class SkillThrowingSwordController : MonoBehaviour
{
    private Animator _animator;
    private Rigidbody2D _rigidBody2D;
    private CircleCollider2D _circleCollider2D;
    private PlayerController _playerController;

    private void Awake()
    {
        _animator = GetComponentInChildren<Animator>();
        _rigidBody2D = GetComponent<Rigidbody2D>(); 
        _circleCollider2D = GetComponent<CircleCollider2D>();
    }

    public void SetUpSword(Vector2 dir, float gravityScale)
    {
        _rigidBody2D.velocity = dir;
        _rigidBody2D.gravityScale = gravityScale;
    }
}

 

단검 투척 스킬의 동작을 정의해놓은 클래스 SkillThrowingSwordController를 위와 같이 구성했습니다.

 

우선 Awake에서는 애니메이터RigidBody2D, CircleCollider2D 컴포넌트를 가져오게 됩니다.

 

SetupSword의 경우, Instantiate로 생성하는 단검 프리팹 인스턴스의 물리 설정을 진행합니다.

 

2) SkillThrowingSword

public class SkillThrowingSword : SkillTemplate
{
    [Header("Skill Info")]
    [SerializeField]
    private GameObject _swordPrefab;
    [SerializeField]
    private Vector2 _launchDir;
    [SerializeField]
    private float _swordGravity;

    public void CreateSword()
    {
        GameObject newSword = Instantiate(
            _swordPrefab, 
            _playerController.transform.position, 
            transform.rotation
            );

        SkillThrowingSwordController _throwingSwordController = newSword.GetComponent<SkillThrowingSwordController>();

        _throwingSwordController.SetUpSword(_launchDir, _swordGravity);
    }
}

 

싱글톤으로 동작하는 SkillManager의 컴포넌트로서 사용하는 

단검 투척 스킬 그 자체SkillThrowingSword의 구성은 위와 같습니다.

 

SerializedField로 선언된 프로퍼티들은 각각

인스턴스들을 생성할 프리팹, 단검이 날아갈 위치, 단검이 가질 중력의 크기를 결정합니다.

 

메서드 CreateSword프로퍼티로 설정한 수치 + 플레이어의 위치에서

단검 프리팹의 인스턴스를 생성합니다.

또한 생성된 프리팹 인스턴스로부터 SkillThrowingSwordController 컴포넌트를 가져와

SetupSword를 수행하여 물리 설정도 완료합니다.

 

3) SkillManager

public class SkillManager : MonoBehaviour
{
    public static SkillManager _skillManagerInstance;

    // SkillManager는 스킬을 수행하는 주체이므로, 각 스킬에 대해 알고 있어야 함
	.
	.
	.
    public SkillThrowingSword _skillThrowingSword { get; private set; }

	.
	.
	.

    // 스킬을 가져와서 설정
    private void Start()
    {
        
		.
		.
		.
        
        _skillThrowingSword = GetComponent<SkillThrowingSword>();
    }
}

 

SkillManager에 컴포넌트로 등록한 SkillThrowingSword를 사용할 수 있게 로직을 일부 추가하였습니다.

 

실제 설정화면은 다음과 같습니다.

4) 유니티 에디터

 

최종 실행 결과는 다음과 같습니다.

 

728x90
반응형