도드넷
게임 개발 일지#8 - 유니티 공격 시스템 본문
내사랑 애플잭 아처 ♥
게임 개발 노트#8 - 유니티 공격 시스템
음 이제 공격할수있게 만들고싶다.
#1 센서 스크립트
- 콜라이더 범위안에 유닛 레이어에 해당하는 다른 콜라이더가 들어가서 "충돌"을 일으키는 경우 범위안에 들어왔음을 알리는 센서 스크립트를 만들어보자.
void OnTriggerEnter2D(Collider2D thiscoll)
{
if (thiscoll.gameObject.tag == "Unit")
{
This_Controller.Units_In_AttackRange.Add(thiscoll.gameObject);
}
}
void OnTriggerExit2D(Collider2D thiscoll)
{
if (thiscoll.gameObject.tag == "Unit")
{
This_Controller.Units_In_AttackRange.Remove(thiscoll.gameObject);
}
}
#2 센서가 유닛의 유닛컨트롤러와 통신할수있게 부모찾기로 연결해주자
This_Controller =
gameObject.transform.parent.gameObject.GetComponent<Unit_Controller>();
#3 이동의 조건 vs 공격 조건
- 이동 : 지형을 누르면 이동명령을 내린다.
지형을 누른다 = 클릭 충돌이 존재하지 않는다. 또는 유닛태그가 안붙어있다.
- 공격 : 유닛을 누르면 공격명령을 내린다.
- 유닛을 누른다 = 클릭충돌한 오브젝트의 태그가 유닛이다. (+ 적팀에 소속되어 있다)
#4 이동 및 공격 명령 하달 스크립트
//무브 명령
if (!Click_Coll || Click_Coll.gameObject.tag != "Clickable")
{
// 만약 선택된 유닛이 하나라도 있으면,
if (Selected_Units.Count > 0)
{
for (int N = 0; N < Selected_Units.Count; N++)
{
Selected_Units[N].GetComponent<Unit_Controller>().Ultimate_Order = "Move";
Selected_Units[N].GetComponent<Unit_Controller>().Destination = Click_Point;
Selected_Units[N].GetComponent<Unit_Controller>().Final_Destination = Click_Point;
}
}
} // 클릭 물체이고, 팀 넘버가 다른 적출신이다.
else if (Click_Coll.gameObject.tag == "Clickable")
{
GameObject Clicked_Object = Click_Coll.gameObject.transform.parent.gameObject; // 콜라이더 오브젝트의 부모를 알아낸다.
if (Clicked_Object.GetComponent<Stats>().Team_Num != Team_Num)
{
// 만약 선택된 유닛이 하나라도 있으면,
if (Selected_Units.Count > 0)
{
for (int N = 0; N < Selected_Units.Count; N++)
{
Selected_Units[N].GetComponent<Unit_Controller>().Ultimate_Order = "Attack";
Selected_Units[N].GetComponent<Unit_Controller>().Target = Clicked_Object;
}
}
}
}
명령은 2가지 타입으로 궁극명령(Ultimate_Order)과 일반 명령(Order)로 나누어져있다.
궁극 명령은 플레이어 스크립트에 의해 하달되는 최종 명령이고 일반 명령은 최종 명령을 수행하기 위해 수행되는 일련의 행동들이 된다.
#5 범위에 있는지 없는지 검사하는 스크립트
// 최적화용 서치 타이머
if (Search_Timer < 0.1)
{
Search_Timer = Search_Timer + N1_60;
}
// 범위안에 유닛이 있을경우, 0.1초마다 실행.
if (Ultimate_Order == "Attack" && Search_Timer >= 0.1)
{
bool found = false;
Search_Timer = 0;
for (int N = 0; N < Units_In_AttackRange.Count; N++)
{
if (Units_In_AttackRange[N] == Target)
{
Debug.Log("Enemy Found IN THE ZONE! CODE IS" + Units_In_AttackRange[N]);
Target_In_AttackRange = true;
found = true;
N = 999; // 루프아웃
}
}
// 루프를 돌렸으나 찾지못함.
if (!found)
{
Debug.Log("Enemy IS NOT IN RANGE");
Target_In_AttackRange = false;
}
}
0.1초 단위로 자신의 타겟이 공격 범위안에 있는지 검사한다.
for문을 통해 공격범위안에 있는 유닛목록을 훑고 무사히 통과하면 없는걸로 간주,
false로 놓고 하나 찾으면 true로 놓고 바로 루프아웃한다.
#6 공격 스크립트
if (Ultimate_Order == "Attack")
{
// 타겟이 공격범위에 없는데?
if (!Target_In_AttackRange)
{
// 이동 명령
Final_Destination = Target.GetComponent<Transform>().position;
Destination = Target.GetComponent<Transform>().position;
Order = "Find_The_Way";
}
else // 타겟이 범위안에 있는데?
{
Order = "Attack";
}
}
if (Order == "Attack")
{
// 공격명령 중인데 타겟이 범위안에 없는데요?
if (!Target_In_AttackRange)
{
// 그럼 목표를 찾아가!
Final_Destination = Target.GetComponent<Transform>().position;
Destination = Target.GetComponent<Transform>().position;
Order = "Find_The_Way";
}
// 타겟이 범위안에 있는데요?
if (Target_In_AttackRange)
{
// 멈춰!
This_Stats.X_Speed = 0;
This_Stats.Y_Speed = 0;
// 공격 가능
if (Attack_ON)
{
This_Anim_Controller.Anim_State = "Attack"; // 공격 애니메이션 ㄱㄱ
}
}
"공격하라" 궁극 명령이 내려지면 캐릭터는 해당 물체가 범위안에 있는지 검사한다.
없으면 해당 물체의 위치로 일반 명령에 "이동 명령"을 내린다.
있으면 즉시 공격한다.
'창고 > 게임 제작 [시즌2]' 카테고리의 다른 글
게임 개발 일지#10 - 유니티 체력바를 만들어보자 + 쉴드 매커니즘 (1) | 2016.10.11 |
---|---|
게임 개발 일지#9 - 유니티 2D 미사일 투사체 원거리 공격! (1) | 2016.10.10 |
게임 제작 일지#7 - 유니티 네비게이션 2D 패스 파인딩 길찾기!! (2) | 2016.10.07 |
게임 제작 일지#6 - 유니티 Raycast 레이 캐스트! (0) | 2016.10.06 |
게임 제작 일지#5 - 유니티 캐릭터 재설계 스프라이트 랜더러는 함정. (0) | 2016.10.06 |