유닛과 적군이 만나면 서로 공격하는 기능을 만들었고, 기존의 유닛과 적군의 이동 기능을 조금 수정했습니다.
유닛 공격 기능
유닛과 적군끼리 공격하는 기능을 만들기 위해 각각의 스크립트를 새로 만들어줬습니다.
공격 기능 함수를 만들기 전에
어떻게 하면 서로 공격할지 생각해봤습니다.
1. 유닛의 공격범위 안에 적군이 들어오면, 들어온 순서대로 공격을 해야되기 때문에 공격리스트를 만들어서 순서대로 넣어줄 겁니다.
2. 공격 리스트에 적군이 추가되었다는 것은 공격 범위 안에 적군이 들어왔다는 뜻이니까 움직임을 멈추고 공격하게 만들겁니다.
3. 공격할 때 미리 설정해놓은 적군의 Hp에서 유닛의 Damage를 공격속도에 따라 차감하도록 해줄겁니다.
4. 만약 적군의 Hp가 0보다 같거나 작아지면 해당 적군 오브젝트를 사라지게 해줄겁니다.
5. 마지막으로 공격리스트에 있던 모든 적군을 죽이면 공격 대상이 사라지는 것이니 다시 움직이도록 해줄겁니다.
<유닛 컴포넌트에 넣어줄 유닛 스크립트>
public class UnitController : MonoBehaviour
{
//유닛의 이동속도를 제어하기 위해 가져옴.
public MovementController movementController;
//자신의 사정거리 안에 들어온 타겟을 담아낼 리스트.
List<GameObject> listUnitAttack = new List<GameObject>();
//유닛의 최대체력.
public float unitMaxHp;
//유닛의 공격력.
public float unitDamage;
//유닛 공속.
public float attackSpeed;
//유닛 공격 쿨타임
public float time = 0;
void Start()
{
movementController = GetComponent<MovementController>();
}
void Update()
{
if (listUnitAttack.Count > 0)
{
movementController.speed = 0;
UnitAttack();
}
if (unitMaxHp <= 0)
{
gameObject.SetActive(false);
}
}
void OnTriggerEnter(Collider other)
{
if (gameObject.tag == "Unit" && other.gameObject.tag == "Enemy")
{
listUnitAttack.Add(other.gameObject);
}
}
void UnitAttack()
{
time += Time.deltaTime;
if (time > attackSpeed)
{
//리스트 0번방 적군의 최대 hp - 유닛데미지.
listUnitAttack[0].GetComponent<EnemyController>().enemyMaxHp -= attackSpeed * unitDamage;
time = 0;
}
if (listUnitAttack[0].GetComponent<EnemyController>().enemyMaxHp <= 0)
{
listUnitAttack.RemoveAt(0);
movementController.speed = 1;
attackSpeed = 1;
}
}
}
적군도 똑같이 만들어줬습니다.
public class EnemyController : MonoBehaviour
{
public MovementController movementController;
List<GameObject> listEnemyAttack = new List<GameObject>();
public float enemyMaxHp;
public float enemyDamage;
public float time = 0;
public float attackSpeed;
void Start()
{
movementController = GetComponent<MovementController>();
}
void Update()
{
if (listEnemyAttack.Count > 0)
{
movementController.speed = 0;
EnemyAttack();
}
if (enemyMaxHp <= 0)
{
gameObject.SetActive(false);
}
}
void OnTriggerEnter(Collider other)
{
if (gameObject.tag == "Enemy" && other.gameObject.tag == "Unit")
{
listEnemyAttack.Add(other.gameObject);
}
}
void EnemyAttack()
{
time += Time.deltaTime;
if (time > attackSpeed)
{
//리스트 0번방 적군의 최대 hp - 유닛데미지.
listEnemyAttack[0].GetComponent<UnitController>().unitMaxHp -= attackSpeed * enemyDamage;
time = 0;
}
if (listEnemyAttack[0].GetComponent<UnitController>().unitMaxHp <= 0)
{
listEnemyAttack.RemoveAt(0);
movementController.speed = 1;
attackSpeed = 1;
}
}
}
'Unity > Unity 타워디펜스게임 프로젝트' 카테고리의 다른 글
[Unity 게임프로젝트] 타워디펜스게임(7) - 캐릭터 애니메이션 적용, 배경음 적용. (0) | 2024.04.12 |
---|---|
[Unity 게임프로젝트] 타워디펜스게임(6) - 유닛, 체력바 추가 및 공격 기능 일부 수정 (0) | 2024.04.12 |
[Unity 게임 프로젝트] 타워디펜스게임(4) - 유닛 복제, OnTrigger (0) | 2024.03.18 |
[Unity 게임 프로젝트] 타워디펜스게임(3) - 유닛 프리팹화, 이동구현 (0) | 2024.03.18 |
[Unity 게임 프로젝트] 타워디펜스 게임(2) - 스테이지 화면, 캐릭터 화면 UI 추가 및 유닛 추가 작업 (0) | 2024.03.08 |