728x90
반응형
이번 포스트에서는 적을 묶어 공격하는 블랙홀 스킬을 만들어보겠습니다.
블랙홀 스킬은 적을 묶고 묶여있는 적에게 알맞은 키를 입력하면 분신을 소환하여 공격합니다.
따라서 1차시에서는 적을 묶어두고 알맞은 키를 설정, 입력받는 절차를 구현해보겠습니다.
1) 구성
1 - 1) 블랙홀 스킬 그 자체
블랙홀 스킬을 조작하기 위한 SkillBlackHoleController 클래스를 컴포넌트로 들고 있는 오브젝트입니다.
적을 공격하기 위해 입력해야 하는 키를 KeyCodeList로 보관하게 있다가 묶여있는 적들에게 소환해줍니다.
1 - 2) 묶여있는 적들에게 소환되는 입력 키
TextMeshPro를 자식으로 갖고 있는 입력 키 오브젝트입니다.
SkillBlackHoleHotKey 클래스를 통해 적 별로 입력 키를 설정하고 입력을 받으면 처리합니다.
2) SkillBlackHoleHotKey
public class SkillBlackHoleHotKey : MonoBehaviour
{
// 입력 키 관련 프로퍼티
private SpriteRenderer _spriteRenderer;
private KeyCode _hotKey;
private TextMeshProUGUI _myText;
// 스킬 동작 관련 프로퍼티
private Transform _trappedEnemy;
private SkillBlackHoleController _blackHoleController;
// 적이 블랙홀에 묶이는 경우 호출되는 함수
public void SetupHotKey(KeyCode newHotkey, Transform trappedEnemy, SkillBlackHoleController blackHoleController)
{
// 우선, 자기자신과 자식 오브젝트를 탐색하여 입력 키 관련 프로퍼티를 설정
_spriteRenderer = GetComponent<SpriteRenderer>();
_myText = GetComponentInChildren<TextMeshProUGUI>();
// 블랙홀에 묶인 적과 블랙홀 스킬 동작 주체를 캐싱
_trappedEnemy = trappedEnemy;
_blackHoleController = blackHoleController;
// 입력키와 생성되는 입력키를 알려줄 UI의 Text를 캐싱
_hotKey = newHotkey;
_myText.text = newHotkey.ToString();
}
private void Update()
{
// 입력키가 알맞게 입력되었다면
if (Input.GetKeyDown(_hotKey))
{
// 묶여있는 적을 공격하기 위해 리스트에 추가
_blackHoleController.AddTrappedEnemyToList(_trappedEnemy);
// 입력키를 알맞게 입력하도록 알려주는 UI를 비워줌
_myText.color = Color.clear;
_spriteRenderer.color = Color.clear;
}
}
}
묶여있는 적을 대상으로 입력키 UI를 설정하고 또 입력을 받는 동작을 수행하는
클래스 SkillBlackHoleHotKey의 경우 위와 같이 구성되어 있습니다.
SetupHotKey 메서드를 통해 묶여있는 적에 맞는 입력 키를 설정하고
Update 메서드에서 해당 입력 키가 알맞게 입력되었다면 로직을 수행합니다.
3) SkillBlackHoleController
public class SkillBlackHoleController : MonoBehaviour
{
[SerializeField]
private GameObject _hotKeyPrefab;
[SerializeField]
private List<KeyCode> _keyCodeList;
public float _maxSize;
public float _growSpeed;
public bool _canGrow;
private List<Transform> _targets = new List<Transform>();
private void Update()
{
// 블랙홀이 커질 수 있다면, 보간을 통해 서서히 크기를 키움
if (_canGrow)
{
transform.localScale = Vector2.Lerp(transform.localScale, new Vector2(_maxSize, _maxSize), _growSpeed * Time.deltaTime);
}
}
private void OnTriggerEnter2D(Collider2D collision)
{
// Trigger된 대상이 적이라면, 적을 얼리고 적에 대해 입력 키를 생성
if (collision.GetComponent<EnemyController>() != null)
{
collision.GetComponent<EnemyController>().DoFreezeEnemy(true);
CreateHotKey(collision);
}
}
private void CreateHotKey(Collider2D collision)
{
// 입력 키를 모아놓은 리스트가 비어있다면 얼리 리턴
if (_keyCodeList.Count == 0)
return;
// 적의 머리 위에 새로운 입력 키 오브젝트를 생성
GameObject newHotKey = Instantiate(_hotKeyPrefab, collision.transform.position + new Vector3(0, 2), Quaternion.identity);
// 입력 키의 경우 입력 키를 모아놓은 리스트에서 랜덤하게 가져옴, 가져온 입력 키의 경우 리스트에서 삭제
KeyCode chosenHotKey = _keyCodeList[Random.Range(0, _keyCodeList.Count)];
_keyCodeList.Remove(chosenHotKey);
// 생성된 입력 키 오브젝트를 대상으로 SetupHotKey 메서드를 호출하여 묶여있는 적에게 입력 키를 설정해줌
SkillBlackHoleHotKey hotKey = newHotKey.GetComponent<SkillBlackHoleHotKey>();
hotKey.SetupHotKey(chosenHotKey, collision.transform, this);
}
// 공격대상을 모아놓은 리스트에 적을 추가
public void AddTrappedEnemyToList(Transform trappedEnemy) => _targets.Add(trappedEnemy);
}
블랙홀 스킬의 동작을 담당하는 SkillBlackHoleController 클래스의 경우
블랙홀의 크기가 커지도록 하는 로직과 Trigger된 적에게 입력 키를 만들어주는 로직을 담당하고 있습니다.
최종 실행결과는 다음과 같습니다.
728x90
반응형
'유니티 > 게임 프로젝트' 카테고리의 다른 글
2D RPG - (16 - 3) 블랙홀 스킬 구현_03 (0) | 2025.02.11 |
---|---|
2D RPG - (16 - 2) 블랙홀 스킬 구현_02 (0) | 2025.02.11 |
2D RPG - (15 - 9) 단검 투척 스킬 구현_09 (0) | 2025.02.06 |
2D RPG - (15 - 8) 단검 투척 스킬 구현_08 (0) | 2025.02.05 |
2D RPG - (15 - 7) 단검 투척 스킬 구현_07 (0) | 2025.02.05 |