도드넷
도드 게임즈#5 - 유니티 데미지 GUI 설계하기 본문
유니티 데미지 시스템, 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;
'창고 > 나만의 게임 제작' 카테고리의 다른 글
도드 게임즈#7 - 유니티 마우스 커서, 유니티 커스텀 커서 만들기! (0) | 2016.08.24 |
---|---|
도드 게임즈#6 - 흙 텍스쳐, 땅을 컴퓨터로 그려보자 (0) | 2016.08.20 |
도드 게임즈#4 - 유니티 스프라이트 테두리 스크립트간의 통신하는 법! (0) | 2016.08.15 |
도트 아트#3 - 유니티 공격 이동 시스템을 만들어보자 (0) | 2016.08.14 |
도트 아트#2 - 유니티 2D 애니메이션 픽셀 도트 걷는 애니메이션! (0) | 2016.08.12 |