관리 메뉴

도드넷

게임 개발 일지#8 - 유니티 공격 시스템 본문

창고/게임 제작 [시즌2]

게임 개발 일지#8 - 유니티 공격 시스템

도드! 2016. 10. 10. 14:06
반응형




내사랑 애플잭 아처 ♥


게임 개발 노트#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"; // 공격 애니메이션 ㄱㄱ
               }
            }


"공격하라" 궁극 명령이 내려지면 캐릭터는 해당 물체가 범위안에 있는지 검사한다.


없으면 해당 물체의 위치로 일반 명령에 "이동 명령"을 내린다.


있으면 즉시 공격한다.











반응형
Comments