관리 메뉴

도드넷

도드 게임즈#5 - 유니티 데미지 GUI 설계하기 본문

창고/나만의 게임 제작

도드 게임즈#5 - 유니티 데미지 GUI 설계하기

도드! 2016. 8. 17. 12:13
반응형




유니티 데미지 시스템, GUI 엘레멘트 이용 팁

- 현재까지 잘 작동하는 나만의 유니티 데미지 시스템.


1. 플레이어 스크립트에 의해 타겟에게 데미지를 입힘.


    void attack_animend()
    {
        if (Target.tag != "Dead" && Inrange)
        {
            // 평타 공격 데미지 계산
            DMG = ad * (1 - Target.GetComponent<enemy>().phy_resist);
            Target.GetComponent<enemy>().received_dmg = DMG;
            Target.GetComponent<enemy>().current_hp = Target.GetComponent<enemy>().current_hp - DMG;
            Target.GetComponent<enemy>().attacker = gameObject;
        }


        GetComponent<Animator>().SetInteger("AnimNumber", 0);
        ACD_ON = false;
        CCD = 0.0f;
    }


2. 타겟의 스크립트에서 받은 데미지를 표시하고 라이프 바를 갱신,

HP가 0 이하로 떨어지면 사망을 처리함.


       if (received_dmg > 0)
        {
            GameObject NewDmgGui = Instantiate(prefab_dmgdisplay, gameObject.GetComponent<Transform>()) as GameObject;
            NewDmgGui.GetComponent<Rigidbody2D>().velocity = new Vector2(0, 1);
            newgui = NewDmgGui.GetComponentInChildren<Text>();
            dmgcount_textgui = newgui;
            dmgcount_textgui.text = "-" + received_dmg.ToString();
            received_dmg = 0;

            dmgguiOB[i] = NewDmgGui;
            i = i + 1;

            if (i >= 20) // 초과시 초기화
            {
                i = 0;
            }
           
           
        }


        for (int k = 0; k < dmgguiOB.Length; k++)
        {
            if (dmgguiOB[k])
            {
                newco2 = dmgguiOB[k].GetComponentInChildren<Text>().color;
                newco2.a = newco2.a - 0.008f;
                dmgguiOB[k].GetComponentInChildren<Text>().color = newco2;

                if (dmgguiOB[k].GetComponentInChildren<Text>().color.a <= 0)
                {
                    i = k;
                    Destroy(dmgguiOB[k]);
                }
            }
        }


       

        if (hpbar)
        {
            if (current_hp > 0)
            {
                newvec.x = current_hp / max_hp;
                hpbar.GetComponent<Transform>().localScale = newvec;
            }

            if (current_hp <= 0)
            {
                hpbar.GetComponent<Transform>().localScale = newvec;
                newvec.x = 0;
            }
        }



        if (current_hp <= 0)
        {

            gameObject.tag = "Dead";

            death_count = death_count + N1_60;

            // 시체 지속시간이 끝나면 페이드 시작
            if (death_time <= death_count)
            {
                gameObject.tag = "ReturningToVoid";
                newco.a = newco.a - 0.004f;
                gameObject.GetComponent<SpriteRenderer>().color = newco;
            }

            if (gameObject.GetComponent<SpriteRenderer>().color.a <= 0)
            {
                Destroy(gameObject);
            }

        }


눈여겨 볼만한 메소드 1 :: GetComponentInChildren


newgui = NewDmgGui.GetComponentInChildren<Text>();


참 똑똑한 메소드로 게임 오브젝트 하위 오브젝트들의 자식요소들중에 <Text> 컴포넌트를 불러옴. 


눈여겨 볼만한 메소드 2 :: Instantiate


GameObject NewDmgGui = Instantiate(prefab_dmgdisplay, gameObject.GetComponent<Transform>()) as GameObject;


게임 오브젝트를 복사-생성 해주는 위대한 메소드.

as GameObject 를 붙여야 복사-생성하면서 게임 오브젝트 변수에 저장이 가능했음.


문법 구성은 다음과 같음


GameObject 게임 오브젝트 이름 = Instantiate(참조할 게임 오브젝트, 부모요소와 트랜스폼)as GameObject;


특이한 점은 두번째 파라미터인데, 파라미터를 전달하고있음에도 이는 사실 부모요소를 지정하는 역할을 한다.


복사-생성될 게임 오브젝트의 위치는 부모 요소안의 참조된 게임 오브젝트의 위치가 된다.

(간단히 참조된 게임 오브젝트의 위치에 그대로 복붙된다고 보면 된다.)


눈여겨 볼만한 메소드 3 :: 배열


C# 지식없이 맨땅으로 하다보니까 배열조차 만들수없었고 굉장히 낮설었음.

C# 배열은 다음과 같이 선언함.


타입[] 배열이름;

배열이름 = new 타입[배열크기];


반드시 2 라인으로 해야하며 배열 크기도 반드시 정해줘야했음.




또다른 기타 사항들


- 텍스트 GUI 만드는 방법 : Create -> UI -> Text -> 생성된 캔버스의 Canvas Scaler 컴포넌트에서 Dynamic Pixel Per Unit 1000 으로 설정 (크기 조절시 흐려보일경우) -> 이제 Canvas와 Text 오브젝트 크기를 마음대로 조절함.

이렇게 만들어진 텍스트를 변경하려면 눈여겨 볼만한 메소드1 에서 배운 getComponent로 컴포넌트를 가져와서 저장후 text를 수정하면됨.


- 체력바 만드는 방법, 커스텀 피봇 설정하는 방법 : 체력바 같은 경우는 현재 체력 / 전체 체력 비율을 빨간 체력바의 스케일에 맞춰서 업데이트해주는 방식으로 만들었는데 좀 고민해야 했던게 스케일링시 피봇이 중앙이라 오그라들때 양방향에서 오그라들어서 문제였음. 이거 해결하려면 피봇을 움직여야하는데 스프라이트 피봇은 움직일수가 없음 고로, 다른 방법으로 접근했는데 원래 스케일링하려 했던 빨간색바에 해당하는 게임 오브젝트를

빈 오브젝트에 자식으로 넣고 그안에서 빈오브젝의 피봇으로 이동시킴. 이제 빈 오브젝트의 스케일을 조정하면 자식 요소가 된 빨간바는 빈오브젝트의 피봇을 중심으로 줄어드므로 오른쪽에서 왼쪽으로 체력바가 감소하는것을 구현할 수 있었음.



요렇게 커스텀 피봇을 잡아줌.


- 점점 흐릿하게 페이드 하는 방법 : Color 요소의 a (알파값)을 점점 감소시키면서 컬러값을 주입하면됨.

일단 빈 Color 객체를 만들고 해당 객체에 원하는 오브젝트의 Color 컴포넌트를 저장한후 딱 a (알파값)만 수정하고 해당 오브젝트의 Color 컴포넌트에 다시 삽입해주는 방식을 사용함.


newco2 = dmgguiOB[k].GetComponentInChildren<Text>().color;
newco2.a = newco2.a - 0.008f;
dmgguiOB[k].GetComponentInChildren<Text>().color = newco2;





반응형
Comments