728x90
반응형
이번 포스트에서는 블랙홀에 묶여있는 적을 대상으로 올바른 키를 전부 입력한 후 R키를 누르면
분신이 나타나 적을 공격하는 기능을 구현해보도록 하겠습니다.
기존의 클론 생성 스킬을 수정하고 블랙홀 스킬의 Controller를 다듬어보는 방식으로 진행하겠습니다.
1) SkillCloningController
public class SkillCloningController : MonoBehaviour
{
.
.
.
public void DoSetupClone(Transform newTransform, float cloneDuration, bool canAttack, Vector3 offset)
{
if (canAttack)
_animator.SetInteger("AttackNumber", Random.Range(1, 3));
gameObject.transform.position = newTransform.position + offset;
_cloneTimer = cloneDuration;
DoFaceClosestTarget();
}
.
.
.
}
분신술 스킬의 동작을 정의한 SkillCloningController의 경우 기존의 분신 설정 메서드 DoSetupClone에
추가적으로 Vector3 값을 인자로 받아 분신의 생성 위치를 조정하도록 합니다.
2) SkillCloning
public class SkillCloning : SkillTemplate
{
.
.
.
public void DoCreateClone(Transform clonePosition, bool canAttack, Vector3 offset)
{
GameObject newClone = Instantiate(_clonePrefab);
newClone.GetComponent<SkillCloningController>().DoSetupClone(clonePosition, _cloneDuration, canAttack, offset);
}
}
DoSetupClone 스킬이 변경되었으므로,
분신술 스킬 그 자체인 SkillCloning 클래스에서도 동일하게 로직을 변경해줍니다.
3) SkillBlackHoleController
public class SkillBlackHoleController : MonoBehaviour
{
.
.
.
private bool _canCreateHotKey = true;
// Black Hole Info
// 순서대로 줄어드는 속도 / 줄어들 수 있는지 판단
.
.
.
public float _shrinkSpeed;
public bool _canShrink;
// Created Clone Info
// 순서대로 공격 횟수 / 공격 쿨타임 / 쿨타임을 위한 타이머 / 공격이 가능한지 판단
public int _amountOfAttacks = 4;
public float _cloneAttackCooldown = 0.1f;
public float _cloneAttackTimer;
public bool _canCloneAttack;
.
.
.
// 생성된 HotKey를 저장할 리스트
private List<GameObject> _createdHotKeys = new List<GameObject>();
private void Update()
{
// 타이머를 동작
_cloneAttackTimer -= Time.deltaTime;
// 만약 R키가 눌렸다면
if (Input.GetKeyDown(KeyCode.R))
{
// 저장중인 생성된 HotKey를 전부 파괴하고 분신이 공격할 수 있도록 설정 + HotKey의 생성을 막음
DestroyHotKeys();
_canCloneAttack = true;
_canCreateHotKey = false;
}
// 타이머가 0보다 작고, 분신이 공격할 수 있다면
if (_cloneAttackTimer < 0 && _canCloneAttack)
{
// 분신의 공격 쿨타임을 걸고
_cloneAttackTimer = _cloneAttackCooldown;
// 이전의 로직에 추가적으로 분신의 생성 위치를 50% 확률로 설정함
int randomIndex = Random.Range(0, _targets.Count);
float randomXOffset = Random.Range(0, 100) > 50 ? 2 : -2;
// 분신을 생성하고 공격 횟수 1차감
SkillManager._skillManagerInstance._skillCloning.DoCreateClone(_targets[randomIndex], _canCloneAttack, new Vector3(randomXOffset, 0, 0));
_amountOfAttacks--;
// 공격횟수가 0이라면
if (_amountOfAttacks <= 0)
{
// 블랙홀의 크기를 줄이고 + 분신의 공격을 막음
_canShrink = true;
_canCloneAttack = false;
}
}
// 블랙홀이 성장할 수 있다면 보간을 통해 크기를 늘리고
if (_canGrow && !_canShrink)
{
transform.localScale = Vector2.Lerp(transform.localScale, new Vector2(_maxSize, _maxSize), _growSpeed * Time.deltaTime);
}
// 블랙홀이 성장할 수 없다면 보간을 통해 크기를 줄이고, 어느 정도 줄어들면 파괴
if (_canShrink)
{
transform.localScale = Vector2.Lerp(transform.localScale, new Vector2(-1, -1), _shrinkSpeed * Time.deltaTime);
if (transform.localScale.x <= 0)
Destroy(gameObject);
}
}
.
.
.
private void CreateHotKey(Collider2D collision)
{
if (_keyCodeList.Count == 0)
return;
// 이전의 로직에 추가적으로 HotKey를 생성할 수 없는지 판단하여 얼리 리턴
if (_canCreateHotKey == false)
return;
.
.
.
}
private void DestroyHotKeys()
{
// 저장되어 있는 생성된 HotKey가 없다면 얼리 리턴
if (_createdHotKeys.Count <= 0)
return;
// 저장되어 있는 생성된 HotKey를 순회하며 파괴
foreach (GameObject createdHotKey in _createdHotKeys)
Destroy(createdHotKey);
}
.
.
.
}
블랙홀 스킬의 동작을 정의하는 클래스 SkillBlackHoleController의 로직을 위와 같이 변경합니다.
변경된 로직에서는 생성된 HotKey를 누른 후 R 키를 누름으로써 분신을 생성해 적을 공격합니다.
최종 실행 결과는 다음과 같습니다.
728x90
반응형
'유니티 > 게임 프로젝트' 카테고리의 다른 글
2D RPG - (16 - 4) 블랙홀 스킬 구현_04 (0) | 2025.02.12 |
---|---|
2D RPG - (16 - 3) 블랙홀 스킬 구현_03 (0) | 2025.02.11 |
2D RPG - (16 - 1) 블랙홀 스킬 구현_01 (0) | 2025.02.10 |
2D RPG - (15 - 9) 단검 투척 스킬 구현_09 (0) | 2025.02.06 |
2D RPG - (15 - 8) 단검 투척 스킬 구현_08 (0) | 2025.02.05 |